Матрица отображения с ярлыками строк и столбцов
Есть ли удобный способ отображения матрицы с метками строк и столбцов в терминале 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
Ответы
Ответ 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
В качестве альтернативы, если вы публикуете свой вывод, здесь один пример нескольких функций, которые будут принимать матрицу w/row, col имена и создайте таблицу с форматированием html.
Ответ 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
Мэтью Оберхардт, полезный код, я добавил имя в матрицу, вот он, новый код настолько простой, просто добавил еще одну переменную
А также я даю пример, чтобы использовать его, заметим, что 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);
-------------- РЕЗУЛЬТАТ --------------------------
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)