2011-07-01 33 views
20

是否有一種方便的方式在Matlab終端中顯示帶有行和列標籤的矩陣?事情是這樣的:帶有行和列標籤的顯示矩陣

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

產生:

 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 

更妙的是一些與一些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 
+0

這個問題是從2011年,從2012年接受的答案。Matlab2013b引入了'table'數據類型,它完全符合原始問題中的要求(請參閱Sh3ljohn的答案)。 –

回答

19

Matlab在控制系統工具箱中有一個叫做printmat的功能。它位於目錄「ctrlobsolete」中,所以我們可以認爲它被認爲是「過時的」,但它仍然有效。

幫助文本是:

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

例子:

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

這裏是一個快速和骯髒的方法:

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

yielding:

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

括號非常分散注意力。 – 2011-07-03 17:33:40

13

它看起來像你的數據有一定的結構,所以你可以把它放在一個更有條理類 - 一個dataset,統計工具箱的一部分。

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

另外,如果你要發佈你的輸出,這裏是幾個功能,將採取一個矩陣W /行,列名和產生HTML格式的表格one example

+1

只需補充一點,Matlab添加了一個[table](數據類型)(http://blogs.mathworks.com/loren/2013/09/10/introduction-to-the-new-matlab-data-types-in-r2013b/)數據類型在2013b中與'dataset'類似,但不需要統計工具箱 – Dan

0

我已經寫了一些代碼,可能是有益的 - 它採用了「printmat」功能,但改變的輸入,從而它們是包含列& /或行標籤的細胞載體。希望它有幫助。

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

馬修Oberhardt,有用的代碼,我加入了名稱爲矩陣,這裏是新代碼那麼簡單只是增加了一個變量 同時,我讓使用它,請注意CONV是一個例子mxn矩陣。

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

-------- - 矩陣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); 

-------------- RESULT --- -----------------------

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

我知道這是一個古老的職位,但我認爲,解決辦法是使用array2table。特別是在OP的情況下,人們可以簡單地做:

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