web-dev-qa-db-fra.com

Comment concatter string + i?

for i=1:N
   f(i) = 'f'+i;
end

donne une erreur dans MatLab. Quelle est la syntaxe correcte pour initialiser un tableau avec N chaînes du motif fi?

Il semble que même cela ne fonctionne pas:

for i=1:4
  f(i) = 'f';
end
74
simpatico

Vous pouvez concaténer des chaînes en utilisant strcat . Si vous envisagez de concaténer des nombres sous forme de chaînes, vous devez d’abord utiliser num2str pour convertir les nombres en chaînes.

De plus, les chaînes ne peuvent pas être stockées dans un vecteur ou une matrice, donc f doit être défini comme un tableau de cellules , et doit être indexé à l'aide de { et } (au lieu des parenthèses rondes normales).

f = cell(N, 1);
for i=1:N
   f{i} = strcat('f', num2str(i));
end
116
Mansoor Siddiqui

Pour les versions antérieures à R2014a ...

Une approche simple sans boucle consiste à utiliser genvarname pour créer un tableau de cellules de chaînes:

>> N = 5;
>> f = genvarname(repmat({'f'}, 1, N), 'f')

f = 

    'f1'    'f2'    'f3'    'f4'    'f5'

Pour les nouvelles versions ...

La fonction genvarname est obsolète, donc matlab.lang.makeUniqueStrings peut être utilisé à la place pour obtenir le même résultat:

>> N = 5;
>> f = strrep(matlab.lang.makeUniqueStrings(repmat({'f'}, 1, N), 'f'), '_', '')

 f =
   1×5 cell array

     'f1'    'f2'    'f3'    'f4'    'f5'
24
gnovice

Permettez-moi d'ajouter une autre solution:

>> N = 5;
>> f = cellstr(num2str((1:N)', 'f%d'))
f = 
    'f1'
    'f2'
    'f3'
    'f4'
    'f5'

Si N contient plus de deux chiffres (>= 10), Vous commencerez à obtenir des espaces supplémentaires. Ajoutez un appel à strtrim(f) pour vous en débarrasser.


En bonus, il y a une fonction intégrée non documentée sprintfc qui retourne joliment un tableau de cellules de chaînes:

>> N = 10;
>> f = sprintfc('f%d', 1:N)
f = 
    'f1'    'f2'    'f3'    'f4'    'f5'    'f6'    'f7'    'f8'    'f9'    'f10'
9
Amro

L'utilisation de sprintf a déjà été proposée par ldueck dans un commentaire, mais je pense que cela vaut la peine d'être une réponse:

f(i) = sprintf('f%d', i);

C’est à mon avis la solution la plus lisible et donne également une certaine souplesse à Nice (c’est-à-dire lorsque vous voulez arrondir une valeur de type float, utilisez quelque chose comme %.2f).

4
luator

selon this il semble que vous deviez définir "N" avant d'essayer de l'utiliser et il semble que ce doit être une chaîne int not? Je ne connais pas grand-chose de MatLab, mais ce que j’ai recueilli de ce site..hope ça aide :)

2
Andres

Essayez ce qui suit:

for i = 1:4
    result = strcat('f',int2str(i));
end

Si vous l'utilisez pour nommer plusieurs fichiers générés par votre code, vous pouvez concaténer plus de parties dans le nom. Par exemple, avec l'extension à la fin et l'adresse au début:

filename = strcat('c:\...\name',int2str(i),'.png'); 
2
Hiva