suptitle matlab syntax

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)?



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.