Jawaban:
FOR loop MATLAB bersifat statis; Anda tidak dapat mengubah variabel loop antara iterasi, tidak seperti struktur loop untuk (inisialisasi; kondisi; kenaikan) dalam bahasa lain. Ini berarti bahwa kode berikut selalu mencetak 1, 2, 3, 4, 5 terlepas dari nilai B.
A = 1:5;
for i = A
A = B;
disp(i);
end
Jika Anda ingin dapat menanggapi perubahan dalam struktur data selama iterasi, loop WHILE mungkin lebih tepat --- Anda akan dapat menguji kondisi loop di setiap iterasi, dan mengatur nilai variabel loop ( s) sesuai keinginan:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
Btw, untuk-setiap loop di Jawa (dan mungkin bahasa lain) menghasilkan perilaku yang tidak ditentukan ketika struktur data dimodifikasi selama iterasi. Jika Anda perlu mengubah struktur data, Anda harus menggunakan instance Iterator yang sesuai yang memungkinkan penambahan dan penghapusan elemen dalam koleksi yang Anda iterasi. Berita baiknya adalah bahwa MATLAB mendukung objek Java, sehingga Anda dapat melakukan sesuatu seperti ini:
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
adalah vektor baris, bukan vektor kolom. Jika A
sebuah matriks, setiap k akan menjadi vektor kolom dari matriks itu. Jadi, transpos ( A'
) atau vektorisasi ( A(:)'
) jika perlu.
.m
file.
Zach benar tentang jawaban langsung untuk pertanyaan itu.
Catatan samping yang menarik adalah bahwa dua loop berikut tidak menjalankan yang sama:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
Loop pertama membuat variabel i
yang merupakan skalar dan iterates seperti C untuk loop. Perhatikan bahwa jika Anda memodifikasi i
di badan loop, nilai yang diubah akan diabaikan, seperti kata Zach. Dalam kasus kedua, Matlab menciptakan array 10k-elemen, lalu berjalan semua elemen array.
Apa ini artinya itu
for i=1:inf
% do something
end
bekerja, tapi
for i=[1:inf]
% do something
end
tidak (karena yang ini akan membutuhkan alokasi memori tak terbatas). Lihat blog Loren untuk detailnya.
Perhatikan juga bahwa Anda dapat beralih di atas array sel.
MATLAB untuk loop pada dasarnya memungkinkan fleksibilitas yang sangat besar, termasukuntuk setiapKegunaan. Berikut beberapa contoh:
1) Tetapkan indeks awal, kenaikan, dan akhir
for test = 1:3:9
test
end
2) Lingkaran di atas vektor
for test = [1, 3, 4]
test
end
3) Lingkarkan melewati tali
for test = 'hello'
test
end
4) Lingkarkan di atas larik sel satu dimensi
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Loop di atas array sel dua dimensi
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Gunakan nama bidang array struktur
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
Jika Anda mencoba untuk mengulang larik sel dan menerapkan sesuatu ke setiap elemen dalam sel, periksa cellfun
. Ada juga arrayfun
,, bsxfun
dan structfun
yang dapat menyederhanakan program Anda.
ooh! pertanyaan rapi.
Matlab's for loop mengambil matriks sebagai input dan beralih ke kolomnya. Matlab juga menangani hampir semua hal berdasarkan nilai (tanpa pass-by-reference) jadi saya berharap bahwa ia mengambil snapshot dari input for-loop sehingga tidak dapat diubah.
inilah contoh yang dapat membantu menggambarkan:
>> 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
Saat mengulangi array sel string, variabel loop (sebut saja f
) menjadi array sel elemen tunggal. Harus menulis di f{1}
mana-mana menjadi membosankan, dan memodifikasi variabel loop memberikan solusi yang bersih.
% 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]
Mulai hari ini (27 Februari), ada kotak alat Untuk-Setiap di MATLAB File Exchange yang memenuhi konsep foreach
. foreach
bukan bagian dari bahasa MATLAB tetapi penggunaan kotak alat ini memberi kita kemampuan untuk meniru apa yang foreach
akan dilakukan.
Undefined function or variable 'B'
.