¿Hay una estructura foreach en MATLAB? Si es así, ¿qué sucede si los datos subyacentes cambian (es decir, si se agregan objetos al conjunto)?
El bucle FOR de MATLAB es de naturaleza estática; no puede modificar la variable de bucle entre iteraciones, a diferencia de la estructura de bucle for (inicialización; condición; incremento) en otros idiomas. Esto significa que el siguiente código siempre imprime 1, 2, 3, 4, 5 independientemente del valor de B.
A = 1:5;
for i = A
A = B;
disp(i);
end
Si desea poder responder a los cambios en la estructura de datos durante las iteraciones, un ciclo WHILE puede ser más apropiado --- podrá probar la condición del ciclo en cada iteración y establecer el valor de la variable del ciclo ( s) como desee:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
Por cierto, el ciclo for-each en Java (y posiblemente en otros lenguajes) produce un comportamiento no especificado cuando la estructura de datos se modifica durante la iteración. Si necesita modificar la estructura de datos, debe usar una instancia Iterator apropiada que permita agregar y eliminar elementos en la colección que está iterando. La buena noticia es que MATLAB admite objetos Java, por lo que puede hacer algo como esto:
A = java.util.ArrayList();
A.add(1);
A.add(2);
A.add(3);
A.add(4);
A.add(5);
itr = A.listIterator();
while itr.hasNext()
k = itr.next();
disp(k);
% modify data structure while iterating
itr.remove();
itr.add(k);
end
Undefined function or variable 'B'
.A
sea un vector de fila, no un vector de columna. SiA
es una matriz, cada k será un vector de columna de esa matriz. Entonces, transponer (A'
) o vectorizar (A(:)'
) si es necesario..m
archivos.Zach tiene razón sobre la respuesta directa a la pregunta.
Una nota al margen interesante es que los siguientes dos bucles no se ejecutan igual:
El primer bucle crea una variable
i
que es escalar y la itera como un bucle C for. Tenga en cuenta que si modificai
en el cuerpo del bucle, el valor modificado se ignorará, como dice Zach. En el segundo caso, Matlab crea una matriz de 10k elementos, luego recorre todos los elementos de la matriz.Lo que esto significa es que
funciona, pero
no lo hace (porque este requeriría asignar memoria infinita). Vea el blog de Loren para más detalles.
También tenga en cuenta que puede iterar sobre matrices de celdas.
fuente
El MATLAB bucle for básicamente permite una gran flexibilidad, incluida lapara cadafuncionalidad Aquí algunos ejemplos:
1) Definir inicio, incremento e índice final
2) Bucle sobre el vector
3) Bucle sobre cadena
4) Bucle sobre una matriz de celdas unidimensionales
5) Bucle sobre una matriz de celdas bidimensionales
6) Use nombres de campo de matrices de estructura
fuente
Si está intentando recorrer una matriz de celdas y aplicar algo a cada elemento de la celda, consulte
cellfun
. También hayarrayfun
,bsxfun
ystructfun
que puede simplificar su programa.fuente
¡Oh! buena pregunta
El bucle for de Matlab toma una matriz como entrada e itera sobre sus columnas. Matlab también maneja prácticamente todo por valor (sin pasar por referencia), por lo que esperaría que tome una instantánea de la entrada del bucle for para que sea inmutable.
Aquí hay un ejemplo que puede ayudar a ilustrar:
fuente
Al iterar sobre conjuntos de celdas de cadenas, la variable de bucle (llamémosla
f
) se convierte en un conjunto de celdas de un solo elemento. Tener que escribir enf{1}
todas partes se vuelve tedioso, y modificar la variable de bucle proporciona una solución limpia.fuente
Digamos que tiene una matriz de datos:
entonces puedes 'predecirlo' así:
Esto hará eco de cada elemento en n (¡pero, por supuesto, también es posible reemplazar la i con cosas más interesantes!)
fuente
Creo que esto es lo que realmente quiere el OP:
fuente
numel(array)
es el número de elementos en la matriz. quizás quisiste decir1:numel(array)
?for i = -1:0.1:10; disp(i); end;
sería mejor?A partir de hoy (27 de febrero), hay una nueva caja de herramientas para cada uno en el intercambio de archivos MATLAB que cumple el concepto de
foreach
.foreach
no es parte del lenguaje MATLAB, pero el uso de esta caja de herramientas nos da la capacidad de emular loforeach
que haría.fuente