Asked by the cyclist
on 1 Aug 2011

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

Answer by Kelly Kearney
on 1 Aug 2011

Accepted answer

One more:

legendCell = cellstr(num2str(N', 'N=%-d'))

Answer by Jan Simon
on 1 Aug 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};

Answer by Fangjun Jiang
on 1 Aug 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(:)))))

Answer by Oleg Komarov
on 1 Aug 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)).')

Answer by Paulo Silva
on 1 Aug 2011

My kludgy way:

legendCell = eval(['{' sprintf('''N=%d'' ',N) '}'])

Fangjun Jiang
on 1 Aug 2011

I like the kludgy way. Seeing so many eval must have made a dent on your brain.

Opportunities for recent engineering grads.

## 0 Comments