Creating legend based on numeric array

141 visualizaciones (últimos 30 días)
the cyclist
the cyclist el 1 de Ag. de 2011
Comentada: Fangjun Jiang el 16 de Sept. de 2020
I have a numeric array, for example:
N = [1 7 14 30 90 180 360];
I want to create a cell array for use in a figure legend:
legendCell = {'N=1','N=7',...,'N=360'}
This is trivial to do with a loop, and I can think of a couple ways that avoid loops that are a bit kludgy. What is the most elegant way?
[The "N=" part is fixed and known. It does not have to be the variable name.]

Respuesta aceptada

Kelly Kearney
Kelly Kearney el 1 de Ag. de 2011
One more:
legendCell = cellstr(num2str(N', 'N=%-d'))
  3 comentarios
TheStranger
TheStranger el 16 de Sept. de 2020
But how one can insert a special tex-symbols like \omega and such in there? It throws an error.
Fangjun Jiang
Fangjun Jiang el 16 de Sept. de 2020
use sprintf(), see special character section, get the unicode

Iniciar sesión para comentar.

Más respuestas (5)

Steven Lord
Steven Lord el 16 de Sept. de 2020
If you're using a newer release of MATLAB, I'd use a string array to create the legend.
N = [1 7 14 30 90 180 360];
x = linspace(0, 1, 17);
plot(x, N.*x.')
legendStrings = "N = " + string(N);
legend(legendStrings)

Jan
Jan el 1 de Ag. de 2011
N = [1 7 14 30 90 180 360];
C = regexp(sprintf('N=%d#', N), '#', 'split');
C(end) = [];
Another solution: In older MATLAB versions DATAREAD (called as core function through STRREAD) was faster. But unfortunately these functions are deprecated. Now TEXTSCAN helps:
CC = textscan(sprintf('N=%d#', N), '%s', 'Delimiter', '#');
C = CC{1};
  1 comentario
Oleg Komarov
Oleg Komarov el 1 de Ag. de 2011
regexp(sprintf('N=%d',N),'N=\d+','match')

Iniciar sesión para comentar.


Paulo Silva
Paulo Silva el 1 de Ag. de 2011
My kludgy way:
legendCell = eval(['{' sprintf('''N=%d'' ',N) '}'])
  3 comentarios
Paulo Silva
Paulo Silva el 1 de Ag. de 2011
that's why I edited my question and removed it :)
Fangjun Jiang
Fangjun Jiang el 1 de Ag. de 2011
I like the kludgy way. Seeing so many eval must have made a dent on your brain.

Iniciar sesión para comentar.


Fangjun Jiang
Fangjun Jiang el 1 de Ag. de 2011
legendCell=strcat('N=',strtrim(cellstr(num2str(N'))))
Or better for N could be column vector or row vector
legendCell=strcat('N=',strtrim(cellstr(num2str(N(:)))))

Oleg Komarov
Oleg Komarov el 1 de Ag. de 2011
Hidden loop (troll):
arrayfun(@(x) sprintf('N=%d',x),N,'un',0)
Based on Kelly's idea of '%-d':
cellstr(reshape(sprintf('N=%-3d',N),floor(log10(abs(max(N))+1))+3,numel(N)).')

Categorías

Más información sobre Characters and Strings en Help Center y File Exchange.

Productos

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by