web-dev-qa-db-fra.com

Matrice d'affichage avec des étiquettes de lignes et de colonnes

Existe-t-il un moyen pratique d’afficher une matrice avec des étiquettes de ligne et de colonne dans le terminal Matlab? Quelque chose comme ça:

M = Rand(5);
displaymatrix(M, {'FOO','BAR','BAZ','BUZZ','FUZZ'}, ...
                 {'ROW1','ROW2','ROW3','ROW4','ROW5'});    %??

cédant:

        FOO       BAR       BAZ       BUZZ      FUZZ
ROW1    0.1622    0.4505    0.1067    0.4314    0.8530
ROW2    0.7943    0.0838    0.9619    0.9106    0.6221
ROW3    0.3112    0.2290    0.0046    0.1818    0.3510
ROW4    0.5285    0.9133    0.7749    0.2638    0.5132
ROW5    0.1656    0.1524    0.8173    0.1455    0.4018

Encore mieux serait quelque chose avec quelques subtilités artistiques ASCII:

     |   FOO       BAR       BAZ       BUZZ      FUZZ
-----+-------------------------------------------------
ROW1 |   0.1622    0.4505    0.1067    0.4314    0.8530
ROW2 |   0.7943    0.0838    0.9619    0.9106    0.6221
ROW3 |   0.3112    0.2290    0.0046    0.1818    0.3510
ROW4 |   0.5285    0.9133    0.7749    0.2638    0.5132
ROW5 |   0.1656    0.1524    0.8173    0.1455    0.4018
20
nibot

Matlab a une fonction appelée printmat dans la boîte à outils Systèmes de contrôle. C'est dans le répertoire "ctrlobsolete", on peut donc supposer qu'il est considéré "obsolète", mais cela fonctionne toujours.

Le texte d'aide est:

>> help printmat
 printmat Print matrix with labels.
    printmat(A,NAME,RLAB,CLAB) prints the matrix A with the row labels
    RLAB and column labels CLAB.  NAME is a string used to name the 
    matrix.  RLAB and CLAB are string variables that contain the row
    and column labels delimited by spaces.  For example, the string

        RLAB = 'alpha beta gamma';

    defines 'alpha' as the label for the first row, 'beta' for the
    second row and 'gamma' for the third row.  RLAB and CLAB must
    contain the same number of space delimited labels as there are 
    rows and columns respectively.

    printmat(A,NAME) prints the matrix A with numerical row and column
    labels.  printmat(A) prints the matrix A without a name.

    See also: printsys.

Exemple:

>> M = Rand(5);
>> printmat(M, 'My Matrix', 'ROW1 ROW2 ROW3 ROW4 ROW5', 'FOO BAR BAZ BUZZ FUZZ' )

My Matrix = 
                       FOO          BAR          BAZ         BUZZ         FUZZ
         ROW1      0.81472      0.09754      0.15761      0.14189      0.65574
         ROW2      0.90579      0.27850      0.97059      0.42176      0.03571
         ROW3      0.12699      0.54688      0.95717      0.91574      0.84913
         ROW4      0.91338      0.95751      0.48538      0.79221      0.93399
         ROW5      0.63236      0.96489      0.80028      0.95949      0.67874
19
Utku Türer

Il semble que vos données aient une structure, vous pouvez donc les placer dans une classe plus structurée - un dataset , qui fait partie de la boîte à outils Statistiques.

>> M = Rand(5);
>> dataset({M 'FOO','BAR','BAZ','BUZZ','FUZZ'}, ...
                'obsnames', {'ROW1','ROW2','ROW3','ROW4','ROW5'})

ans = 
            FOO        BAR         BAZ        BUZZ         FUZZ    
    ROW1    0.52853     0.68921    0.91334     0.078176     0.77491
    ROW2    0.16565     0.74815    0.15238      0.44268      0.8173
    ROW3    0.60198     0.45054    0.82582      0.10665     0.86869
    ROW4    0.26297    0.083821    0.53834       0.9619    0.084436
    ROW5    0.65408     0.22898    0.99613    0.0046342     0.39978

Alternativement, si vous publiez votre sortie, voici un exemple de plusieurs fonctions qui prendront une matrice avec des noms de rangées, de colonnes et produiront un tableau au format HTML.

13
Rich C

Je sais que ceci est un ancien post, mais je pense que la solution consiste à utiliser array2table . Dans le cas du PO, on ferait simplement:

>> M = Rand(5);
>> names= {'A','B','C','D','E'}; 
>> array2table( M, 'VariableNames', names, 'RowNames', names )

ans = 

            A          B          C          D          E    
         _______    _______    _______    _______    ________

    A    0.81472    0.09754    0.15761    0.14189     0.65574
    B    0.90579     0.2785    0.97059    0.42176    0.035712
    C    0.12699    0.54688    0.95717    0.91574     0.84913
    D    0.91338    0.95751    0.48538    0.79221     0.93399
    E    0.63236    0.96489    0.80028    0.95949     0.67874
9
Sheljohn

Voici une approche rapide et sale:

horzcat({'';'ROW1';'ROW2';'ROW3';'ROW4';'ROW5'}, ...
        vertcat({'FOO','BAR','BAZ','BUZZ','FUZZ'},...
                num2cell(Rand(5))))

cédant:

ans = 

    ''        'FOO'       'BAR'       'BAZ'       'BUZZ'      'FUZZ'  
    'ROW1'    [0.3015]    [0.6665]    [0.0326]    [0.3689]    [0.6448]
    'ROW2'    [0.7011]    [0.1781]    [0.5612]    [0.4607]    [0.3763]
    'ROW3'    [0.6663]    [0.1280]    [0.8819]    [0.9816]    [0.1909]
    'ROW4'    [0.5391]    [0.9991]    [0.6692]    [0.1564]    [0.4283]
    'ROW5'    [0.6981]    [0.1711]    [0.1904]    [0.8555]    [0.4820]
3
nibot

Matthew Oberhardt, code utile, j’ai ajouté le nom à la matrice, le nouveau code si simple vient d’ajouter une autre variable.

---------------CODE---------------

function out = dispmat(M,name,row_labels,col_labels);
%% Matthew Oberhardt 
% 02/08/2013
% intended to display a matrix along with row and column labels. 
%% ex:
% M = Rand(2,3);
% row_labels = {'a';'b'};
% col_labels = {'c 1','c2 ','c3'};
% % if there are no labels for rows or cols, put '' as the input.
% row_labels = '';

%Modified 14.07.2014
%Nestor Cantu
%Added the name of the matrix.

%% check that the row & col labels are the right sizes
[nrows,ncols] = size(M);

%% populate if either of the inputs is empty 
if isempty(row_labels)
row_labels = cell(1,nrows);
    for n = 1:nrows
        row_labels{1,n} = '|'; 
    end
end
if isempty(col_labels)
    col_labels = cell(1,ncols);
    for n = 1:ncols
        col_labels{1,n} = '-';
    end
end

assert(length(row_labels)==nrows,'wrong # of row labels');
assert(length(col_labels)==ncols,'wrong # of col labels');

row_labels = reshape(row_labels,1,length(row_labels));
col_labels = reshape(col_labels,1,length(col_labels));

%% remove spaces (since they are separators in printmat.m
cols = strrep(col_labels, ' ', '_');
rows = strrep(row_labels, ' ', '_');

%% create labels, space delimited
c_out = [];
for n = 1:length(cols)
    c_out = [c_out,cols{n},' '];
end
c_out = c_out(1:end-1);
r_out = [];
for n = 1:length(rows)
    r_out = [r_out,rows{n},' '];
end
r_out = r_out(1:end-1);

%% print

printmat(M,name,r_out,c_out)


end

---------- EXEMPLE avec matrice conv (5,4) -------------- 

[m n] = size(conv);
for i=1:n
    col{i} = ['K = ' num2str(i)];
end

for i=1:m
    row{i} = ['n =' num2str(i)];
end

outMat(conv,'Convergence',row',col);

--------------RÉSULTAT--------------------------

Convergence = 
                 K_=_1        K_=_2        K_=_3        K_=_4        K_=_5
     n_=1      0.74218      0.42070      0.11101 9.86259e-006 9.86259e-006
     n_=2      0.49672      0.26686      0.00233 4.46114e-011 4.46114e-011
     n_=3      0.01221      0.00488 1.23422e-007            0            0
     n_=4      0.00010 7.06889e-008 7.06889e-008            0            0
1
nestor

J'ai écrit du code qui pourrait être utile - il utilise la fonction 'printmat', mais modifie les entrées afin qu'elles soient des vecteurs de cellules contenant les étiquettes de colonne et/ou de ligne. J'espère que c'est utile.

function out = dispmat(M,row_labels,col_labels);
%% Matthew Oberhardt
% 02/08/2013
% intended to display a matrix along with row and column labels.
% % ex:
% M = Rand(2,3);
% row_labels = {'a';'b'};
% col_labels = {'c 1','c2 ','c3'};
% % if there are no labels for rows or cols, put '' as the input.
% row_labels = '';

%% check that the row & col labels are the right sizes
[nrows,ncols] = size(M);

%% populate if either of the inputs is empty 
if isempty(row_labels)
    row_labels = cell(1,nrows);
    for n = 1:nrows
        row_labels{1,n} = '|'; 
    end
end
if isempty(col_labels)
    col_labels = cell(1,ncols);
    for n = 1:ncols
        col_labels{1,n} = '-';
    end
end

assert(length(row_labels)==nrows,'wrong # of row labels');
assert(length(col_labels)==ncols,'wrong # of col labels');

row_labels = reshape(row_labels,1,length(row_labels));
col_labels = reshape(col_labels,1,length(col_labels));

%% remove spaces (since they are separators in printmat.m
cols = strrep(col_labels, ' ', '_');
rows = strrep(row_labels, ' ', '_');

%% create labels, space delimited
c_out = [];
for n = 1:length(cols)
    c_out = [c_out,cols{n},' '];
end
c_out = c_out(1:end-1);

r_out = [];
for n = 1:length(rows)
    r_out = [r_out,rows{n},' '];
end
r_out = r_out(1:end-1);

%% print
printmat(M, '',r_out,c_out)
0
matthew