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

8 vues (au cours des 30 derniers jours)
Leonard Kluss
Leonard Kluss le 6 Déc 2018
Commenté : Guillaume le 6 Déc 2018
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?

Réponse acceptée

Stephen23
Stephen23 le 6 Déc 2018
Modifié(e) : Stephen23 le 6 Déc 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 commentaire
Guillaume
Guillaume le 6 Déc 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.

Connectez-vous pour commenter.

Plus de réponses (1)

Guillaume
Guillaume le 6 Déc 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)

Catégories

En savoir plus sur Data Type Conversion dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by