¿Cómo concat string + i?

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

da un error en MatLab. ¿Cuál es la sintaxis correcta para inicializar una matriz con N cadenas del patrón fi?

Parece que incluso esto no funciona:

for i=1:4
  f(i) = 'f';
end
simpatico
fuente
¿Exactamente cómo quieres fque se vea la matriz ? ¿Una sola cadena con todas las ficadenas individuales concatenadas juntas? ¿Una matriz de caracteres con una cadena por fila? ¿Una matriz de celdas?
gnovice
Para la versión reciente de MATLB, use cadenas. Por ejemplo, "asd" + (1:5)funciona entonces.
bonanza

Respuestas:

117

Puede concatenar cadenas usando strcat. Si planea concatenar números como cadenas, primero debe usar num2strpara convertir los números en cadenas.

Además, las cadenas no se pueden almacenar en un vector o una matriz, por lo que fdeben definirse como una matriz de celdas y deben indexarse ​​usando {y }(en lugar de los corchetes normales).

f = cell(N, 1);
for i=1:N
   f{i} = strcat('f', num2str(i));
end
Mansoor Siddiqui
fuente
10
Algo como "f (i) = sprintf ('% s% d', f, i);" también funcionaría.
telenachos
mi problema fue la falta de uso de llaves para indexar
simpatico
10
['f', num2str(i)]es un poco más corto.
Oli
24

Para versiones anteriores a R2014a ...

Un enfoque sencillo sin bucle sería utilizarlo genvarnamepara crear una matriz de cadenas de celdas :

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

f = 

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

Para versiones más nuevas ...

La función genvarnameha quedado obsoleta, por lo que matlab.lang.makeUniqueStringsse puede utilizar en su lugar de la siguiente manera para obtener el mismo resultado:

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

 f =
   1×5 cell array

     'f1'    'f2'    'f3'    'f4'    'f5'
gnovice
fuente
En realidad, esta es una gran solución. Yo no estaba al tanto genvarname.
Mansoor Siddiqui
FYI: genvarnameestá en desuso.
Czechnology
9

Déjame agregar otra solución:

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

Si Ntiene más de dos dígitos ( >= 10), comenzará a obtener espacios adicionales. Agregue una llamada a strtrim(f)para deshacerse de ellos.


Como sprintfcbeneficio adicional, hay una función incorporada no documentada que devuelve amablemente una matriz de cadenas de celdas:

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

El uso sprintfya fue propuesto por ldueck en un comentario, pero creo que vale la pena ser una respuesta:

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

En mi opinión, esta es la solución más legible y también brinda una buena flexibilidad (es decir, cuando desee redondear un valor flotante, use algo como %.2f).

luator
fuente
2

de acuerdo con esto , parece que debe configurar "N" antes de intentar usarlo y parece que debe ser un int, no una cadena. No sé mucho sobre MatLab, pero solo lo que reuní de ese sitio ... espero que ayude :)

Andres
fuente
2

Intente lo siguiente:

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

Si usa esto para nombrar varios archivos que genera su código, puede concatenar más partes al nombre. Por ejemplo, con la extensión al final y la dirección al principio:

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