Komputasi nyata hampir selalu berulang: menghitung kuadrat untuk 1000 data, memproses setiap kolom matriks, menjumlahkan deret suku demi suku. Struktur for adalah alat MATLAB untuk pengulangan yang jumlah iterasinya sudah diketahui. Ada satu keyakinan penting yang perlu kita luruskan sejak awal: for di MATLAB bukan counter, melainkan penelusur array — loop berjalan sekali untuk setiap kolom array yang kita berikan. Perbedaan konsep ini menjelaskan banyak perilaku MATLAB yang mengejutkan pemula, dari for di atas matriks sampai tradisi preallocation dan vectorization.

for Menelusuri Array, Bukan Counter #

Aturan sintaksnya: for k = ekspresi ... end, dengan end wajib sebagai penutup blok — sama seperti if. Mekanisme di balik layarnya berbeda dari bahasa C: tulis for k = 1:n, maka MATLAB lebih dulu membentuk array baris 1 2 3 ... n, lalu menelusuri kolom-kolomnya satu per satu. Pada iterasi ke-i, variabel k berisi elemen ke-i array itu. Array baris memiliki satu elemen per kolom, sehingga efeknya memang tampak seperti counter — tetapi itu efek, bukan mekanisme.

matlab
for k = 1:5
    fprintf('iterasi ke-%d\n', k);
end

Output yang Dihasilkan:

text
iterasi ke-1
iterasi ke-2
iterasi ke-3
iterasi ke-4
iterasi ke-5

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (for k = 1:5): MATLAB membentuk array baris [1 2 3 4 5], lalu loop menelusuri lima kolomnya — k bernilai 1, 2, 3, 4, 5 secara berurutan.
  2. Baris 2 (fprintf(...)): badan loop dieksekusi sekali per iterasi dengan nilai k yang sedang aktif.
  3. Baris 3 (end): iterasi berakhir setelah kolom terakhir array habis ditelusuri.

Bukti bahwa k sekadar “isi array” datang dari loop di atas vektor nilai bebas — tidak perlu deret berurutan:

matlab
nilai = [90 75 88];
for n = nilai
    fprintf('nilai ujian: %d\n', n);
end

Output yang Dihasilkan:

text
nilai ujian: 90
nilai ujian: 75
nilai ujian: 88

Variabel loop n mengambil nilai 90, 75, dan 88 persis seperti urutan penyimpanannya di vektor nilai — sama seperti for x in daftar pada Python, bukan for (i = 0; i < 3; i++) pada C.

for pada Matriks Menelusuri Kolom #

Konsekuensi langsung dari “menelusuri kolom”: bila array yang diberikan adalah matriks, setiap iterasi memuat satu kolom penuh, bukan satu elemen. MATLAB menyimpan elemen matriks secara column-major, dan for mengikuti tata letak itu:

matlab
M = [1 2 3; 4 5 6; 7 8 9];
for kol = M
    fprintf('kolom berisi: %d %d %d\n', kol);
end

Output yang Dihasilkan:

text
kolom berisi: 1 4 7
kolom berisi: 2 5 8
kolom berisi: 3 6 9

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (M = [1 2 3; ...]): matriks 3×3 dengan tiga kolom.
  2. Baris 2 (for kol = M): loop berjalan tepat tiga kali — sekali per kolom M.
  3. Baris 3 (fprintf ... kol): kol adalah vektor kolom 3×1; iterasi pertama memuat [1; 4; 7], iterasi kedua [2; 5; 8], iterasi ketiga [3; 6; 9].

Preallocation dengan zeros #

Masalah nyata: loop yang mengisi hasil sering menulis hasil = [hasil, nilaiBaru] di setiap iterasi. Mekanisme di balik layar membuat pola itu mahal — menumbuhkan array memaksa MATLAB menyalin seluruh isi lama ke lokasi memori baru setiap kali array memanjang. Loop 10.000 iterasi berarti 10.000 kali penyalinan yang makin besar.

Solusinya adalah preallocation: siapkan wadah hasil berukuran penuh sebelum loop berjalan dengan zeros(), lalu isi per elemen lewat indexing. Salinan memori hanya terjadi sekali:

matlab
n = 5;
kuadrat = zeros(1, n);
for k = 1:n
    kuadrat(k) = k^2;
end
fprintf('hasil loop     : %d %d %d %d %d\n', kuadrat);

Output yang Dihasilkan:

text
hasil loop     : 1 4 9 16 25

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 (kuadrat = zeros(1, n)): vektor baris 1×5 berisi nol dialokasikan sekali di awal — inilah preallocation.
  2. Baris 3-4 (for k = 1:n dan kuadrat(k) = k^2): setiap iterasi menimpa elemen ke-k tanpa menyentuh ukuran array; tidak ada penyalinan memori tambahan.
  3. Baris 6 (fprintf ...): hasil akhir ditampilkan; zeros yang tersisa (bila iterasi tidak mengisi semua) tetap nol — wadah selalu berukuran penuh.

Vektorisasi: Alternatif Idiomatik #

Kebiasaan berpikir MATLAB adalah “array dulu, baru loop”. Banyak loop for elementer sebenarnya dapat digantikan satu operator titik atau satu fungsi array — pola yang disebut vectorization. Versi vektorisasi dari loop kuadrat di atas hanya sepanjang satu baris:

matlab
kuadratVek = (1:n) .^ 2;
fprintf('hasil vektoris  : %d %d %d %d %d\n', kuadratVek);

Output yang Dihasilkan:

text
hasil vektoris  : 1 4 9 16 25

Operator .^ menghitung kuadrat seluruh elemen 1:5 dalam sekali evaluasi — tanpa variabel loop, tanpa indexing berulang. Versi loop tetap sah dan tetap kita perlui saat tiap iterasi bergantung pada hasil iterasi sebelumnya, tetapi untuk operasi elemen-per-elemen, vektorisasi lebih pendek, lebih cepat, dan lebih lazim dibaca komunitas MATLAB. Kita kembali ke tema ini pada Chapter Memilih Struktur Kontrol dan Section Optimasi dan Performa.

Berkas contoh.m pada bagian bawah halaman menjalankan kelima contoh di atas secara berurutan dalam satu script utuh.

Ringkasan #

for k = ekspresi menelusuri kolom-kolom array hasil evaluasi ekspresi — 1:n hanyalah kasus khusus yang terlihat seperti counter. Loop di atas matriks berjalan sekali per kolom, sehingga pemrosesan per elemen membutuhkan loop bersarang. Preallocation dengan zeros() menghindarkan kita dari penyalinan memori berulang, dan untuk operasi elemen-per-elemen, vektorisasi dengan operator titik adalah bentuk yang paling idiomatik.