¿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

¿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

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'

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'

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


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


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'); 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.