显示带行标签和列标签的矩阵

时间:2011-07-01 22:10:53

标签: matlab matrix tabular matlab-table

是否有方便的方法在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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

或者,如果您要发布输出,这里有几个函数的one example,这些函数将采用矩阵w / row,col名称并生成一个html格式的表。

答案 2 :(得分: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

答案 3 :(得分:3)

这是一种快速而肮脏的方法:

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

得到以下特性:

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]

答案 4 :(得分:1)

Matthew 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

----------带矩阵转换的例子(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

答案 5 :(得分: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)