matlab - resueltos - Matriz de visualización con etiquetas de fila y columna
llenar un vector en matlab (6)
Aquí hay un enfoque rápido y sucio:
horzcat({'''';''ROW1'';''ROW2'';''ROW3'';''ROW4'';''ROW5''}, ...
vertcat({''FOO'',''BAR'',''BAZ'',''BUZZ'',''FUZZ''},...
num2cell(rand(5))))
flexible:
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]
¿Hay una forma conveniente de mostrar una matriz con etiquetas de fila y columna en el terminal de Matlab? Algo como esto:
M = rand(5);
displaymatrix(M, {''FOO'',''BAR'',''BAZ'',''BUZZ'',''FUZZ''}, ...
{''ROW1'',''ROW2'',''ROW3'',''ROW4'',''ROW5''}); %??
flexible:
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
Aún mejor sería algo con algunas sutilezas de arte 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
He escrito algún código que podría ser útil: usa la función ''printmat'', pero cambia las entradas para que sean vectores de celda que contienen la columna y / o las etiquetas de fila. espero que sea útil.
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)
Matlab tiene una función llamada printmat
en la caja de herramientas de Control Systems. Está en el directorio " ctrlobsolete
", por lo que podemos suponer que se considera "obsoleto", pero aún funciona.
El texto de ayuda es:
>> 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.
Ejemplo:
>> 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
Matthew Oberhardt, código útil, agregué el nombre a la matriz, aquí está el nuevo código tan simple que acaba de agregar una variable más Y también dejo un ejemplo para usarlo, observe que conv es una matriz mxn.
---------------CÓDIGO---------------
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
---------- EJEMPLO con matriz 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);
--------------RESULTADO--------------------------
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
Parece que sus datos tienen cierta estructura, por lo que puede ponerlo en una clase más estructurada: un dataset , parte de la caja de herramientas Estadísticas.
>> 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
Alternativamente, si está publicando su salida, aquí hay un ejemplo de varias funciones que tomarán una matriz con la fila, los nombres col y producirán una tabla con formato html.
Sé que esta es una publicación anterior, pero creo que la solución es usar array2table
. Específicamente en el caso del OP, uno simplemente haría:
>> 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