Показать матрицу с метками строк и столбцов - PullRequest
21 голосов
/ 02 июля 2011

Есть ли удобный способ отображения матрицы с метками строк и столбцов в терминале 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 ]

19 голосов
/ 11 ноября 2012

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
13 голосов
/ 02 июля 2011

Похоже, что ваши данные имеют некоторую структуру, поэтому вы можете поместить их в более структурированный класс - набор данных , часть набора инструментов Статистика.

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

В качестве альтернативы, если вы публикуете свой вывод, вот один пример нескольких функций, которые будут принимать матрицу с строкой, именами столбцов и создавать таблицу в формате html.

9 голосов
/ 30 апреля 2015

Я знаю, что это старый пост, но я считаю, что решение заключается в использовании 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 голосов
/ 02 июля 2011

Вот один быстрый и грязный подход:

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]
1 голос
/ 15 июля 2014

Мэтью Оберхардт, полезный код, я добавил имя в матрицу, вот он, новый простой код, просто добавил еще одну переменную А также я приведу пример, чтобы использовать его, заметьте, что 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

---------- ПРИМЕР с матричной конвой (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
0 голосов
/ 08 февраля 2013

Я написал некоторый код, который может быть полезен - он использует функцию '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)
...