How to create a string with names that differ, without a loop?

11 views (last 30 days)
I want
D_N = {'K1'; 'K2'; '...' ;'K9' ; '...'};
until Kn is reached with n equal to a parameter of my program (for example 39).
I can chose to use:
for ii = 1:39
D_N{ii} = sprintf('K%d', ii);
end
for ii = 1:39
D_N{ii} = ['K' num2str(ii)];
end
But is there a way without using this stupid loop?

Accepted Answer

Stephen23
Stephen23 on 6 Dec 2018
Edited: Stephen23 on 6 Dec 2018
The fastest solution is to use the undocumented function sprintfc:
sprintfc('K%d',1:39)
As this is undocumented, use at your own risk. Otherwise arrayfun works, but feels like overkill:
arrayfun(@(n)sprintf('K%d',n),1:39,'uni',0)
As an alternative you could use the string data class and compose:
compose('K%d',1:39)
  1 Comment
Guillaume
Guillaume on 6 Dec 2018
Since R2016b, there's absolutely no reason to use sprintfc and since it's undocumented, potentially disappearing in a future version, shouldn't be used at all.
compose doesn't require the use of the string class at all. compose produces a string array if the formatting string is of class string, and a cell array of char vectors if the formatting string is a char vector.
Always use compose or even easier the string composing functions as I've shown.

Sign in to comment.

More Answers (1)

Guillaume
Guillaume on 6 Dec 2018
compose works exactly that way:
D_N = compose('K%d', 1:39)
Another option is to use string arrays:
D_N = "K" + (1:39)
which are easier to work with than cell arrays of char arrays.
In versions of matlab without string arrays or compose (pre-R2016b), you can use the completely undocumented sprintfc instead:
D_N = sprintfc('K%d', 1:39)

Categories

Find more on Data Type Conversion in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!