2012-05-21 15 views
18

Estoy tratando de iterar sobre una lista de cadenas en MATLAB. El problema es que, dentro del ciclo 'para', mi iterador se considera una 'célula' en lugar de una cadena.Iteración sobre una lista de cadenas en MATLAB

for str = {'aaa','bbb'} 
    fprintf('%s\n',str); 
end 

??? Error using ==> fprintf 
Function is not defined for 'cell' inputs. 

¿Cuál es la manera elegante \ correcta para solucionar este problema?

+2

Me pregunto si esto es un error conceptual en el diseño de MATLAB. ¿Por qué está construido así? – Memming

+0

@Memming Nope. Solo alguien que no sabe cómo usar la familia de funciones '* printf' – KitsuneYMG

Respuesta

22

usted debe llamar el contenido de la célula a través de str{1} de la siguiente manera para que sea correcta:

for str = {'aaa','bbb'} 
    fprintf('%s\n',str{1}); 
end 

Aquí hay una more sophisticated example en la impresión de contenidos de redes de celdas.

+2

' char (str) 'también funciona, y no falla si el ciclo se cambia para que str aparezca como una matriz char en lugar de una celda – tmpearce

+1

Esto realmente me molesta cada vez que trabajo con una matriz de celdas de cadenas. ¿No hay una manera más elegante de iterar sobre la matriz de celdas de cadenas para obtener directamente el contenido de las celdas sin llamar a str {1}? - Editar - No importa, acaba de encontrar esto: http://stackoverflow.com/questions/16587564/can-the-s1-annoyance-when-iterating-over-a-cell-array-be-avoided – rich

6
str={'aaa','bbb'}; 
fprintf('%s\n',str{:}); 

No hay necesidad de for bucles.

EDIT: Ver también: cellfun

+1

@petrichor Codigo matlab para vivir en este momento. He estado muy metido en 'cellfun' y llamadas repetitivas como esta. También aprendí la regla de One True sobre matlab: nunca use looping. Incluso un lío godawful de 'repmat',' permute' y 'reshape' es más rápido que la iteración. – KitsuneYMG

Cuestiones relacionadas