Display matrix with row and column labels

前端 未结 6 1826
误落风尘
误落风尘 2020-12-01 14:08

Is there a convenient way to display a matrix with row and column labels in the Matlab terminal? Something like this:

M = rand(5);
displaymatrix(M, {\'FOO\'         


        
相关标签:
6条回答
  • 2020-12-01 14:54

    I know this is an old post, but I believe the solution is to use array2table. Specifically in the case of the OP, one would simply do:

    >> 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
    
    0 讨论(0)
  • 2020-12-01 14:54

    I've written some code that might be helpful -- it uses the 'printmat' function, but changes the inputs so they are cell vectors containing the column &/or row labels. hope it's helpful.

    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 讨论(0)
  • 2020-12-01 14:55

    Here is one quick and dirty approach:

    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 讨论(0)
  • 2020-12-01 14:55

    Matthew Oberhardt, usefull code, I added the name to the matrix, here is it the new code so simple just added one more variable And also I let an example to use it, notice that conv is a mxn matrix.

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

    ----------EXAMPLE with matrix 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
    
    0 讨论(0)
  • 2020-12-01 14:58

    It looks like your data has some structure to it so you can put it in a more structured class - a dataset, part of the Statistics toolbox.

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

    Alternatively, if you are publishing your output, here is one example of several functions that will take a matrix w/ row,col names and produce an html formatted table.

    0 讨论(0)
  • 2020-12-01 15:03

    Matlab has a function called printmat in the Control Systems toolbox. It's in the directory "ctrlobsolete", so we can assume that it is considered "obsolete", but it still works.

    The help text is:

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

    Example:

    >> 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
    
    0 讨论(0)
提交回复
热议问题