2011-10-19 14 views
7

En MATLAB el siguiente bucle for:El bucle no iterar

for i = [1:100]' 
    %'// Do something, such as disp(i) 
end 

no es aparentemente muy implementado por iteración, en lugar i se convierte en la matriz [1 2 3 ... 100] y el " loop "solo se ejecuta una vez en esta matriz i. Puede verificar esto imprimiendo el valor de i u otra información de seguimiento. Solo se hace una sola pasada a través del bucle.

¿Es posible obligar a MATLAB a realizar un bucle genuino? La razón por la que pregunto es que el enfoque anterior está bien para muchos casos, pero mucho más doloroso cuando tiene bucles anidados que deben ejecutarse.

Ejemplo:
El siguiente código no va a hacer lo que se puede esperar si usted pensaba que estaba recibiendo iteración real sobre un bucle:

for i = outlier 
    data(i) = median(data(i-100:i+100)) 
end 

uno esperaría en cada índice de valores atípicos este reemplazaría datos (i) con la mediana de los datos de i-100 a i + 100, pero no es así. De hecho, la mediana arroja un único valor calculado en un conglomerado de todos los rangos que le interesan, y cada punto de datos (i) se reemplaza por ese único valor.

+2

¿Puede puesto de salida que reproduce lo que se está viendo. No he visto este comportamiento, y he prestado mucha atención a los bucles de Matlab. – Iterator

+0

¿No te refieres a 'mediana (datos (i-100: i + 100))'? (con un ':') –

+0

@Clement J. Sí, lo hago. Corregido ahora. –

Respuesta

12

Si se escribe

for i = (1:100)' %'# square brackets would work as well 
    doSomething 
end 

el bucle se ejecuta sólo una vez, ya que una for -loop itera sobre todas las columnas de lo que está a la derecha del signo igual (sería repetir 200 veces con una Matriz de 100 por 200 a la derecha del signo igual).

Sin embargo, en su ejemplo, tiene i=[1:100], que se evalúa como un vector de fila. Por lo tanto, el ciclo debería ejecutar 100x.

Si iterar sobre una matriz que podría ser nx1 en lugar de 1xn, puede, por razones de seguridad, escriba:

for i = myArray(:)' %'# guarantee nx1, then transpose to 1xn 
end 
+1

+1. Excepto por el último párrafo: el bucle 'i = [1: 100]' (como en el pseudocódigo de OP) se ejecuta 100 veces, no una vez. –

+0

@AndrewJanke: D'oh! Mistype! – Jonas

7

Esto no es correcto. El código:

for i=1:100 
    disp(i) 
end 

imprimirá todos los valores del 1 al 100 consecutivamente. Si bien Matlab fomenta la vectorización, definitivamente puede utilizar bucles tradicionales con el estilo de codificación que utilizó anteriormente.

+0

+1 Mejor respuesta. :) Nunca he visto el comportamiento descrito por el OP, y le presto mucha atención a las iteraciones (tenga en cuenta el nombre de usuario ...). No estoy seguro de qué puede haber detrás del comportamiento informado. – Iterator

+5

Su variable 'atípico' puede ser un vector de columna. Los bucles 'for' de Matlab iteran a través de las columnas de algo, no de los elementos. Para vectores de fila como [1: 100] es lo mismo; pero 'for i = [1: 100] '' hará una sola pasada. –

+1

@Iterator: El comportamiento ocurre si la matriz es nx1 en lugar de 1xn. – Jonas