2012-03-22 26 views
10

Quiero crear un bucle que iterará sobre varias cadenas, pero no puede hacerlo en Matlab.bucle foreach con cadenas en Matlab

Lo que funciona es:

for i=1:3 
    if (i==1) 
    b='cow'; 
    elseif (i==2) 
    b='dog'; 
    else 
    b='cat'; 
    end 

    disp(b); 
end 

y el resultado es:

cow 
dog 
cat 

Pero lo que quiero es algo más elegante que se verá así:

for i=['cow','dog','cat'] 
    disp (i); 
end 

y dar la mismo resultado.

¿Existe una opción en Matlab para hacer esto?

ADEMÁS:

necesito las palabras como cadenas más adelante a utilizar y no sólo para mostrar (la disp fue sólo como un ejemplo). He tratado de utilizar matrices de células en mi verdadero programa:

clear all; 
close all; 
clc; 

global fp_a 
global TEST_TYPE 
global SHADE_METHODE 

for fp_a=11:24 
for shade={'full','fast'} 
    SHADE_METHODE=shade(1); 
    for test={'bunny','city'} 
     TEST_MODE=test(1); 
     fprintf ('fp_a:%d | test: %s | shade: %s',fp_a,TEST_TYPE,SHADE_METHODE); 
     ray_tracing; 
    end 
end 
end 

No funciona como los valores permanecen como células y no las cadenas me sale el mensaje de error:

??? Error al usar ==> fprintf La función no está definida para las entradas de 'celda'.

* -Realmente no necesito el fprintf Solo lo uso para verificar que los valores sean correctos.

** - ray_tracing es mi código que utiliza los valores de las cadenas

+2

El problema en la adición es solo la sintaxis. Necesitas usar las llaves - 'test {1}' - para extraer la matriz char de la celda, no paréntesis normales - 'test (1)' - que solo selecciona la primera celda de la matriz, sin hacer nada aquí. Comprueba el código de ejemplo de Oli nuevamente; nota que está usando las llaves en 'i {1}'. (Además, no uses globales si puedes evitarlo).) –

+0

Debería usar 'SHADE_METHODE = shade {1};' en lugar de 'SHADE_METHODE = shade (1);' – Oli

+0

posible duplicado de [¿Hay algún foreach en MATLAB? Si es así, ¿cómo se comporta si los datos subyacentes cambian?] (Http://stackoverflow.com/questions/408080/is-there-a-foreach-in-matlab-if-so-how-does-it-behave -if-the-underlying-data-c) –

Respuesta

28

O puede hacer:

for i={'cow','dog','cat'} 
    disp(i{1}) 
end 

Resultado:

cow 
dog 
cat 
+6

Agradable. Si todo lo bueno de escribir en Matlab no fuera compensado por algo realmente horrible. – beOn

2

Claro! Utilice matrices de celdas para guardar cadenas (en arreglos normales, las cadenas se consideran por carácter, lo que podría funcionar si todas las cadenas tienen la misma longitud, pero de lo contrario se escribirá).

opts={'cow','dog','cat'} 
for i=1:length(opts) 
    disp(opts{i}) 
end 
5

Sus problemas son causados ​​probablemente por la forma en MATLAB controla cadenas. Las cadenas de MATLAB son solo matrices de caracteres. Cuando llama al ['cow','dog','cat'], está formando 'cowdogcat' porque [] concatena arreglos sin anidar. Si desea comportamiento de anidamiento, puede usar matrices de celdas que se construyen usando {}. for itera sobre las columnas de su lado derecho. Esto significa que puede usar el modismo que mencionó anteriormente; Oli proporcionó una solución ya. Esta expresión también es una buena manera de mostrar la diferencia entre las matrices normal y de celda.

%Cell array providing the correct solution 
for word = {'cow','dog','cat'} 
    disp(word{1}) %word is bound to a 1x1 cell array. This extracts its contents. 
end 

cow 
dog 
cat 


%Normal array providing weirdness 
for word = ['cow','dog','cat'] %Same as word = 'cowdogcat' 
    disp(word) %No need to extract content 
end 

c 
o 
w 
d 
o 
g 
c 
a 
t