matlab - suptitle - subplot title python
¿Hay un foreach en MATLAB? Si es así, ¿cómo se comporta si los datos subyacentes cambian? (9)
¡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 referencia), así que esperaría que tome una instantánea de la entrada for-loop para que sea inmutable.
he aquí 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
¿Hay una estructura foreach en MATLAB? De ser así, ¿qué sucede si los datos subyacentes cambian (es decir, si los objetos se agregan al conjunto)?
A partir de hoy (27 de febrero), hay una nueva caja de herramientas For-Each en MATLAB File Exchange que logra 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 que foreach
haría.
Al iterar sobre matrices de celdas de cadenas, la variable de bucle (llamémoslo f
) se convierte en una matriz de celdas de un solo elemento. Tener que escribir f{1}
todas partes es tedioso, y la modificación de la variable de ciclo 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]
Creo que esto es lo que el OP realmente quiere:
array = -1:0.1:10
for i=1:numel(array)
disp(array(i))
end
El bucle for MATLAB básicamente permite una gran flexibilidad, incluida la funcionalidad foreach . Aquí algunos ejemplos:
1) Definir índice de inicio, incremento y finalización
for test = 1:3:9
test
end
2) Bucle sobre vector
for test = [1, 3, 4]
test
end
3) Bucle sobre cuerda
for test = ''hello''
test
end
4) Bucle sobre una matriz de celdas unidimensional
for test = {''hello'', 42, datestr(now) ,1:3}
test
end
5) Bucle sobre una matriz de celdas bidimensional
for test = {''hello'',42,datestr(now) ; ''world'',43,datestr(now+1)}
test(1)
test(2)
disp(''---'')
end
6) Usar nombres de campo de matrices de estructuras
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)''
s.(cell2mat(test))
end
El bucle FOR de MATLAB es de naturaleza estática; no se 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 bucle WHILE puede ser más apropiado --- podrá probar la condición de bucle en cada iteración, y establecer el valor de la variable de bucle ( s) como desees:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp([''n! = '' num2str(f)])
Por cierto, el bucle for-each en Java (y posiblemente en otros idiomas) 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 la adición y eliminación de elementos en la colección que está iterando. La buena noticia es que MATLAB admite los 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
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 pueden simplificar su programa.
Supongamos que tiene una matriz de datos:
n = [1 2 3 4 6 12 18 51 69 81 ]
entonces puedes ''foreach'' de esta manera:
for i = n, i, end
Esto hará eco de cada elemento en n (¡pero reemplazar el i con cosas más interesantes también es posible, por supuesto!)
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 de la misma manera:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
El primer ciclo crea una variable i
que es un escalar y lo itera como un C para ciclo. Tenga en cuenta que si modifica i
en el cuerpo del ciclo, se ignorará el valor modificado, 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 (porque esto requeriría asignar memoria infinita). Ver el blog de Loren para más detalles.
También tenga en cuenta que puede iterar sobre matrices de celdas.