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

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

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'

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'

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


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 :)


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'); 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.