C’è un foreach in MATLAB? In tal caso, come si comporta se i dati sottostanti cambiano?

Esiste una struttura foreach in MATLAB? In tal caso, cosa succede se i dati sottostanti cambiano (cioè se gli oggetti vengono aggiunti all’insieme)?

Il ciclo FOR di MATLAB è di natura statica; non è ansible modificare la variabile di ciclo tra iterazioni, diversamente dalla struttura del ciclo for (initialization; condition; increment) in altre lingue. Ciò significa che il codice seguente stampa sempre 1, 2, 3, 4, 5 indipendentemente dal valore di B.

A = 1:5; for i = A A = B; disp(i); end 

Se vuoi essere in grado di rispondere ai cambiamenti nella struttura dei dati durante le iterazioni, un ciclo WHILE può essere più appropriato — sarai in grado di testare la condizione del loop ad ogni iterazione e impostare il valore della variabile loop ( s) come desideri:

 n = 10; f = n; while n > 1 n = n-1; f = f*n; end disp(['n! = ' num2str(f)]) 

Btw, il ciclo for-each in Java (e probabilmente in altri linguaggi) produce un comportamento non specificato quando la struttura dei dati viene modificata durante l’iterazione. Se è necessario modificare la struttura dei dati, è necessario utilizzare un’istanza Iterator appropriata che consenta l’aggiunta e la rimozione di elementi nella raccolta che si sta iterando. La buona notizia è che MATLAB supporta gli oggetti Java, quindi puoi fare qualcosa del genere:

 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 

Zach ha ragione sulla risposta diretta alla domanda.

Una nota interessante è che i due loop seguenti non eseguono lo stesso:

 for i=1:10000 % do something end for i=[1:10000] % do something end 

Il primo ciclo crea una variabile i che è uno scalare e lo itera come un ciclo C for. Nota che se modifichi i nel corpo del ciclo, il valore modificato verrà ignorato, come dice Zach. Nel secondo caso, Matlab crea un array di 10k-elementi, quindi cammina su tutti gli elementi dell’array.

Ciò significa questo

 for i=1:inf % do something end 

funziona, ma

 for i=[1:inf] % do something end 

non (perché questo richiederebbe l’allocazione di memoria infinita). Vedi il blog di Loren per i dettagli.

Si noti inoltre che è ansible eseguire iterazioni su array di celle.

Il ciclo MATLAB for consente fondamentalmente un’enorme flessibilità, inclusa la funzionalità foreach . Ecco alcuni esempi:

1) Definisci indice di inizio, incremento e fine

 for test = 1:3:9 test end 

2) Loop over vector

 for test = [1, 3, 4] test end 

3) Loop over string

 for test = 'hello' test end 

4) Loop su un array di celle unidimensionale

 for test = {'hello', 42, datestr(now) ,1:3} test end 

5) Loop su un array di celle bidimensionale

 for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)} test(1) test(2) disp('---') end 

6) Usa nomi di campo di array di strutture

 sa = 1:3 ; sb = 10 ; for test = fieldnames(s)' s.(cell2mat(test)) end 

Se stai cercando di eseguire il loop su un array di celle e applicare qualcosa a ciascun elemento nella cella, controlla cellfun . C’è anche arrayfun , bsxfun e structfun che possono semplificare il tuo programma.

ooh! domanda accurata.

Il ciclo di Matlab for prende una matrice come input e itera sulle sue colonne. Matlab gestisce anche praticamente tutto in base al valore (nessun riferimento pass-by), quindi mi aspetto che richieda un’istantanea dell’input del ciclo for, quindi è immutabile.

ecco un esempio che può aiutare a illustrare:

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

Quando si itera su array di celle di stringhe, la variabile di ciclo (chiamiamola f ) diventa un array di celle a elemento singolo. Dovendo scrivere f{1} ovunque diventa noioso, e la modifica della variabile di loop fornisce una soluzione pulita.

 % This example transposes each field of a struct. sa = 1:3; sb = 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] 

Supponiamo che tu abbia una serie di dati:

 n = [1 2 3 4 6 12 18 51 69 81 ] 

allora puoi ‘foreach’ in questo modo:

 for i = n, i, end 

Questo farà eco ad ogni elemento in n (ma sostituendo anche l’i con cose più interessanti è ovviamente ansible!)

Penso che questo sia ciò che l’OP vuole davvero:

 array = -1:0.1:10 for i=1:numel(array) disp(array(i)) end 

Ad oggi (27 febbraio), c’è una nuova casella degli strumenti For-Each su MATLAB File Exchange che realizza il concetto di foreach . foreach non fa parte del linguaggio MATLAB ma l’uso di questa toolbox ci dà la possibilità di emulare ciò che foreach farebbe.