2011-07-01 15 views
20

Czy istnieje wygodny sposób wyświetlania macierzy z etykietami wierszy i kolumn w terminalu Matlab? Coś takiego:Macierz wyświetlania z etykietami wiersza i kolumny

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

otrzymując:

 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 

Jeszcze lepiej byłoby coś z pewnych subtelności ASCII-art:

 | 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 
+0

To pytanie pochodzi z 2011 roku, przyjęta odpowiedź z 2012 roku.Matlab2013b wprowadził typ danych 'table', który robi dokładnie to, o co pytano w oryginalnym pytaniu (patrz odpowiedź Sh3ljohna). –

Odpowiedz

19

Program Matlab ma funkcję o nazwie printmat w przyborniku Systemy sterowania. Jest w katalogu "ctrlobsolete", więc możemy założyć, że jest uważany za "przestarzały", ale nadal działa.

Tekst pomocy jest:

>> 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. 

Przykład:

>> 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 
3

Oto jeden szybki i brudny podejście:

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

wydajność:

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] 
+0

nawiasy są bardzo rozpraszające. –

13

Wygląda na to, ma pewną strukturę danych do niego, dzięki czemu można umieścić go w klasie bardziej uporządkowany - do dataset, część przybornika Statistics.

>> 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 

Ewentualnie, jeśli publikujesz swoje wyjście, tu jest one example z kilku funkcji, które będą miały matrycę w/rzędu, nazwy COL i wytwarzają HTML sformatowany tabeli.

+1

Po prostu dodam, że Matlab dodał typ danych [table] (http://blogs.mathworks.com/loren/2013/09/10/introduction-to-the-new-matlab-data-types-in-r2013b/) w 2013b, który jest podobny do 'dataset', ale nie wymaga zestawu narzędzi statystyk – Dan

0

Pisałem jakiś kod, który może być pomocny - to wykorzystuje funkcję „printmat”, ale zmienia się więc wejść są wektorami komórkowymi zawierającymi kolumny &/lub etykietami wierszy. mam nadzieję, że to pomocne.

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) 
1

Matthew Oberhardt, kod przydatna, dodałem nazwę na matrycy, tutaj jest nowy kod tak prosty, po prostu dodał jeszcze jedną zmienną A także dam przykład wykorzystać go zauważyć, że conv jest macierz mxn.

--------------- KOD ---------------

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 

-------- - PRZYKŁAD z konwerterem macierzowym (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); 

-------------- WYNIK --- -----------------------

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 
9

wiem, że to stary post, ale wierzę, że rozwiązaniem jest użycie array2table. W szczególności w przypadku PO wystarczyłoby:

>> 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