Risposte:
Il ciclo FOR di MATLAB è di natura statica; non è possibile modificare la variabile del ciclo tra iterazioni, diversamente dalla struttura del ciclo for (inizializzazione; condizione; incremento) in altre lingue. Ciò significa che il seguente codice 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 potrebbe essere più appropriato --- sarai in grado di testare la condizione del ciclo ad ogni iterazione e impostare il valore della variabile del ciclo ( s) come desideri:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
A proposito, il ciclo for-each in Java (e possibilmente in altre lingue) 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 ripetendo. La buona notizia è che MATLAB supporta 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
A
sia un vettore di riga, non un vettore di colonna. Se A
è una matrice, ogni k sarà un vettore di colonna da quella matrice. Quindi, trasporre ( A'
) o vectorize ( A(:)'
) se necessario.
.m
file.
Zach ha ragione sulla risposta diretta alla domanda.
Una nota a margine interessante è che i seguenti due loop 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 per. Nota che se modifichi i
nel corpo del loop, il valore modificato verrà ignorato, come dice Zach. Nel secondo caso, Matlab crea un array di 10k elementi, quindi cammina tutti gli elementi dell'array.
Ciò significa che
for i=1:inf
% do something
end
funziona, ma
for i=[1:inf]
% do something
end
non (perché questo richiederebbe l'allocazione della memoria infinita). Vedi il blog di Loren per i dettagli.
Si noti inoltre che è possibile scorrere su array di celle.
Il MATLAB per loop sostanzialmente consente un'enorme flessibilità, incluso ilper ciascunofunzionalità. Ecco alcuni esempi:
1) Definire l'indice di inizio, incremento e fine
for test = 1:3:9
test
end
2) Passa sopra il vettore
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 bidimensionali
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Utilizzare i nomi dei campi degli array di strutture
s.a = 1:3 ; s.b = 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, dai un'occhiata cellfun
. C'è anche arrayfun
, bsxfun
e structfun
che può semplificare il tuo programma.
ooh! domanda ordinata.
Il ciclo for di Matlab prende una matrice come input e scorre sulle sue colonne. Matlab gestisce anche praticamente tutto in base al valore (nessun riferimento pass-by), quindi mi aspetto che prenda un'istantanea dell'input del ciclo continuo, 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 scorre su array di celle di stringhe, la variabile loop (chiamiamola così f
) diventa un array di celle a elemento singolo. Dover scrivere f{1}
ovunque diventa noioso e la modifica della variabile loop fornisce una soluzione alternativa.
% 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]
Supponiamo che tu abbia una matrice 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 ovviamente è anche possibile sostituire l'i con cose più interessanti!)
Ad oggi (27 febbraio), c'è un nuovo toolbox For-Each sullo scambio di file MATLAB che realizza il concetto di foreach
. foreach
non fa parte del linguaggio MATLAB ma l'uso di questo toolbox ci dà la possibilità di emulare cosa foreach
farebbe.
Undefined function or variable 'B'
.