Creating legend based on numeric array

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

 Réponse acceptée

Kelly Kearney
Kelly Kearney le 1 Août 2011
One more:
legendCell = cellstr(num2str(N', 'N=%-d'))

3 commentaires

Fangjun Jiang
Fangjun Jiang le 2 Août 2011
Never noticed num2str could also specify format. Nice! +1
TheStranger
TheStranger le 16 Sep 2020
But how one can insert a special tex-symbols like \omega and such in there? It throws an error.
Fangjun Jiang
Fangjun Jiang le 16 Sep 2020
use sprintf(), see special character section, get the unicode

Connectez-vous pour commenter.

Plus de réponses (5)

Steven Lord
Steven Lord le 16 Sep 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 le 1 Août 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};
Paulo Silva
Paulo Silva le 1 Août 2011
My kludgy way:
legendCell = eval(['{' sprintf('''N=%d'' ',N) '}'])

3 commentaires

Fangjun Jiang
Fangjun Jiang le 1 Août 2011
Paulo, your first solution returns 1x1 cell
Paulo Silva
Paulo Silva le 1 Août 2011
that's why I edited my question and removed it :)
Fangjun Jiang
Fangjun Jiang le 1 Août 2011
I like the kludgy way. Seeing so many eval must have made a dent on your brain.

Connectez-vous pour commenter.

Fangjun Jiang
Fangjun Jiang le 1 Août 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 le 1 Août 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)).')

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by