【问题标题】:Display matrix with row and column labels显示带有行和列标签的矩阵
【发布时间】:2011-09-27 01:50:32
【问题描述】:

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

【问题讨论】:

  • 这个问题来自 2011 年,接受的答案来自 2012 年。Matlab2013b 引入了 table 数据类型,它完全符合原始问题中的要求(参见 Sh3ljohn 的回答)。
  • 需要注意的是,下面的解决方案都不适用于Octave,所以我发布了我自己的问题here

标签: matlab matrix tabular matlab-table


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的数据似乎具有某种结构,因此您可以将其放入更结构化的类中 - 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 的几个函数,它们将采用带行、列名称的矩阵并生成一个 html 格式的表格。

    【讨论】:

    • 只是补充一点,Matlab 在 2013b 中添加了一个 table 数据类型,它类似于 dataset,但不需要统计工具箱
    【解决方案3】:

    我知道这是一篇旧帖子,但我相信解决方案是使用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
    

    【讨论】:

      【解决方案4】:

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

      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]
      

      【讨论】:

      • 括号非常分散注意力。
      【解决方案5】:

      Matthew Oberhardt,有用的代码,我在矩阵中添加了名称,这是新代码,如此简单,只是添加了一个变量 我还举了一个例子来使用它,注意 conv 是一个 mxn 矩阵。

      ---------------代码---------------

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

      -------------结果--------------------------

      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
      

      【讨论】:

        【解决方案6】:

        我编写了一些可能有用的代码——它使用“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)
        

        【讨论】:

          猜你喜欢
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          • 2018-06-25
          • 2021-08-15
          • 2014-03-22
          • 1970-01-01
          • 2021-01-17
          • 1970-01-01
          相关资源
          最近更新 更多