Wie konzentriere ich String + i?

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

gibt einen Fehler in MatLab. Was ist die richtige Syntax, um ein Array mit N Zeichenfolgen des Musters fi zu initialisieren?

Es scheint, als würde auch dies nicht funktionieren:

for i=1:4
  f(i) = 'f';
end
sympathisch
quelle
Wie soll das Array fgenau aussehen? Eine einzelne Zeichenfolge, bei der alle einzelnen fiZeichenfolgen miteinander verknüpft sind? Ein Zeichenarray mit einer Zeichenfolge pro Zeile? Ein Zellenarray?
Gnovice
Verwenden Sie für die neueste Version von MATLB Zeichenfolgen. Zum Beispiel "asd" + (1:5)funktioniert dann.
Bonanza

Antworten:

117

Sie können Zeichenfolgen mit verketten strcat. Wenn Sie Zahlen als Zeichenfolgen verketten möchten, müssen Sie zuerst num2strdie Zahlen in Zeichenfolgen konvertieren.

Außerdem können Zeichenfolgen nicht in einem Vektor oder einer Matrix gespeichert werden. Sie fmüssen daher als Zellenarray definiert und mit {und }(anstelle von normalen runden Klammern) indiziert werden .

f = cell(N, 1);
for i=1:N
   f{i} = strcat('f', num2str(i));
end
Mansoor Siddiqui
quelle
10
So etwas wie "f (i) = sprintf ('% s% d', f, i);" würde auch funktionieren.
Telenachos
Mein Problem war die fehlende Verwendung von geschweiften Klammern zum Indexieren
simpatico
10
['f', num2str(i)]ist etwas kürzer.
Oli
24

Für Versionen vor R2014a ...

Ein einfacher Ansatz ohne Schleife wäre das genvarnameErstellen eines Zellenarrays von Zeichenfolgen:

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

f = 

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

Für neuere Versionen ...

Die Funktion genvarnameist veraltet und matlab.lang.makeUniqueStringskann daher folgendermaßen verwendet werden, um dieselbe Ausgabe zu erhalten:

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

 f =
   1×5 cell array

     'f1'    'f2'    'f3'    'f4'    'f5'
gnovice
quelle
Dies ist eigentlich eine großartige Lösung. Ich war mir nicht bewusst genvarname.
Mansoor Siddiqui
Zu Ihrer Information: genvarnameist veraltet.
Czechnology
9

Lassen Sie mich eine weitere Lösung hinzufügen:

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

Wenn Nes länger als zwei Ziffern ist ( >= 10), erhalten Sie zusätzliche Leerzeichen. Fügen Sie einen Anruf hinzu strtrim(f), um sie loszuwerden.


Als Bonus gibt es eine undokumentierte integrierte Funktion, sprintfcdie ein Zellenarray von Zeichenfolgen gut zurückgibt:

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

Die Verwendung sprintfwurde bereits von ldueck in einem Kommentar vorgeschlagen, aber ich denke, dies ist eine Antwort wert:

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

Dies ist meiner Meinung nach die am besten lesbare Lösung und bietet auch eine gute Flexibilität (dh wenn Sie einen Float-Wert runden möchten, verwenden Sie so etwas wie %.2f).

luator
quelle
2

nach dieser sieht es aus wie Sie Satz „N“ haben , bevor Sie versuchen , es zu benutzen und es sieht aus wie ein int nicht Zeichenfolge sein muss? Ich weiß nicht viel über MatLab, aber genau das, was ich von dieser Seite gesammelt habe. Hoffentlich hilft es :)

Andres
quelle
2

Versuche Folgendes:

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

Wenn Sie dies zum Benennen mehrerer Dateien verwenden, die Ihr Code generiert, können Sie weitere Teile mit dem Namen verknüpfen. Zum Beispiel mit der Erweiterung am Ende und der Adresse am Anfang:

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