Respuestas:
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
A
sea un vector de fila, no un vector de columna. Si A
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:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
El primer bucle crea una variable i
que es escalar y la itera como un bucle C for. Tenga en cuenta que si modifica i
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
for i=1:inf
% do something
end
funciona, pero
for i=[1:inf]
% do something
end
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.
El MATLAB bucle for básicamente permite una gran flexibilidad, incluida lapara cadafuncionalidad Aquí algunos ejemplos:
1) Definir inicio, incremento e índice final
for test = 1:3:9
test
end
2) Bucle sobre el vector
for test = [1, 3, 4]
test
end
3) Bucle sobre cadena
for test = 'hello'
test
end
4) Bucle sobre una matriz de celdas unidimensionales
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Bucle sobre una matriz de celdas bidimensionales
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Use nombres de campo de matrices de estructura
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
Si está intentando recorrer una matriz de celdas y aplicar algo a cada elemento de la celda, consulte cellfun
. También hay arrayfun
, bsxfun
y structfun
que puede simplificar su programa.
¡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:
>> A = zeros(4); A(:) = 1:16
A =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
>> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end;
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> A
A =
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
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 en f{1}
todas partes se vuelve tedioso, y modificar la variable de bucle proporciona una solución limpia.
% This example transposes each field of a struct.
s.a = 1:3;
s.b = zeros(2,3);
s % a: [1 2 3]; b: [2x3 double]
for f = fieldnames(s)'
s.(f{1}) = s.(f{1})';
end
s % a: [3x1 double]; b: [3x2 double]
% Redefining f simplifies the indexing.
for f = fieldnames(s)'
f = f{1};
s.(f) = s.(f)';
end
s % back to a: [1 2 3]; b: [2x3 double]
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 lo foreach
que haría.
Undefined function or variable 'B'
.