Data dua dimensi membutuhkan pengulangan dua lapis. Matriks nilai siswa × mata pelajaran, tabel jarak antar kota, grid hasil simulasi — semuanya memiliki dua sumbu penelusuran, dan for tunggal hanya mampu menyusuri satu sumbu. Di sinilah nested loops (loop bersarang) berperan: satu for di dalam for lain, sehingga setiap kombinasi baris dan kolom dapat diproses. Chapter ini membahas pola traversal matriks baris × kolom, pola “hasil luar × dalam” untuk membangun tabel, dan teknik loop bersarang yang tetap mudah dibaca.

Traversal Matriks Baris × Kolom #

Aturan polanya: loop luar menguasai baris, loop dalam menguasai kolom. Mekanisme di balik layar: loop luar memilih satu baris dan “membeku” di sana selagi loop dalam menelusuri seluruh kolom baris tersebut; setelah kolom terakhir selesai, loop luar maju ke baris berikutnya dan proses berulang. Ukuran matriks kita ambil dari size() agar pola bekerja untuk matriks mana pun:

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

Output yang Dihasilkan:

text
M(1,1) = 1
M(1,2) = 2
M(1,3) = 3
M(2,1) = 4
M(2,2) = 5
M(2,3) = 6
M(3,1) = 7
M(3,2) = 8
M(3,3) = 9

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (M = [1 2 3; ...]): matriks 3×3 sebagai data contoh — tiga baris, tiga kolom.
  2. Baris 2 (for i = 1:size(M, 1)): loop luar berjalan 3 kali, sekali per baris; size(M, 1) mengembalikan jumlah baris.
  3. Baris 3 (for j = 1:size(M, 2)): loop dalam berjalan 3 kali untuk setiap nilai i; total kombinasi yang diproses adalah 3 × 3 = 9.
  4. Baris 4 (fprintf('M(%d,%d) = %d\n', i, j, M(i, j))): elemen pada baris i kolom j dicetak; urutan output membuktikan kolom habis ditelusuri lebih dulu sebelum baris berganti.

Urutan eksekusinya terlihat jelas pada diagram alur berikut:

Diagram tersebut memperlihatkan inti loop bersarang: loop dalam menyelesaikan seluruh putarannya dulu, baru loop luar melangkah sekali, lalu loop dalam mengulang dari awal.

Pola Hasil Luar × Dalam #

Banyak tabel dibangun dari kombinasi dua deret — tabel perkalian adalah contoh termurninya: baris ke-i berisi i * j untuk setiap j. Pola umumnya: preallocation atau pencetakan langsung di posisi (i, j), dengan nilai yang dihitung dari indeks luar × indeks dalam:

matlab
for i = 1:5
    for j = 1:5
        fprintf('%4d', i * j);
    end
    fprintf('\n');
end

Output yang Dihasilkan:

text
   1   2   3   4   5
   2   4   6   8  10
   3   6   9  12  15
   4   8  12  16  20
   5  10  15  20  25

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (for i = 1:5): indeks luar menentukan baris tabel — 5 baris untuk faktor perkalian 1 sampai 5.
  2. Baris 2 (for j = 1:5): indeks dalam menentukan kolom; tiap baris mencetak 5 hasil.
  3. Baris 3 (fprintf('%4d', i * j)): hasil i * j dicetak dengan lebar 4 karakter agar kolom rata kanan.
  4. Baris 5 (fprintf('\n')): setelah loop dalam selesai, satu baris baru dicetak — perhatikan bahwa fprintf('\n') berada di dalam loop luar, di luar loop dalam; posisi inilah yang memindahkan kursor ke baris tabel berikutnya.

Penempatan pernyataan relatif terhadap kedua loop adalah kunci pola ini: sesuatu yang ditulis di dalam loop dalam dieksekusi sekali per sel; sesuatu yang ditulis di antara kedua loop (seperti pindah baris) dieksekusi sekali per baris.

Komputasi Jarak Pasangan Titik #

Loop bersarang paling sering bertemu di komputasi pasangan: jarak setiap pasang titik, selisih setiap pasang waktu, kemiripan setiap pasang item. Hasilnya alami disimpan pada matriks n × n — sekali lagi preallocation dengan zeros() menyiapkan wadahnya. Versi hemat menghitung hanya setengah atas karena jarak bersifat simetris:

matlab
titik = [0 0; 3 4; 6 8];
n = size(titik, 1);
jarak = zeros(n, n);
for i = 1:n
    for j = i+1:n
        d = sqrt((titik(i,1) - titik(j,1))^2 + ...
                 (titik(i,2) - titik(j,2))^2);
        jarak(i, j) = d;
        jarak(j, i) = d;
    end
end
fprintf('jarak titik 1-2 = %.4f\n', jarak(1, 2));
fprintf('jarak titik 1-3 = %.4f\n', jarak(1, 3));
fprintf('jarak titik 2-3 = %.4f\n', jarak(2, 3));

Output yang Dihasilkan:

text
jarak titik 1-2 = 5.0000
jarak titik 1-3 = 10.0000
jarak titik 2-3 = 5.0000

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (titik = [0 0; 3 4; 6 8]): setiap baris matriks adalah koordinat (x, y) satu titik — tiga titik.
  2. Baris 3 (jarak = zeros(n, n)): matriks hasil 3×3 dialokasikan lebih dulu; pasangan (i, j) dan (j, i) akan memuat nilai yang sama.
  3. Baris 5 (for j = i+1:n): loop dalam dimulai dari i+1, sehingga hanya pasangan unik yang dihitung — jarak titik ke dirinya sendiri (0) dan pasangan duplikat tidak dihitung ulang.
  4. Baris 6-7 (d = sqrt(...)): jarak Euclidean antara titik i dan titik j memakai teorema Pythagoras; tanda ... melanjutkan baris panjang.
  5. Baris 8-9 (jarak(i, j) = d; jarak(j, i) = d): hasil ditulis dua posisi sekaligus sehingga matriks jarak menjadi simetris.

Keterbacaan Loop Bersarang #

Setiap level tambahan menggandakan beban mental pembaca kode: pembaca harus menjaga tumpukan “sedang di iterasi berapa” di kepala. Praktik yang baik menjaga kedalaman maksimal dua level — baris × kolom. Bila masalah menuntut tiga level, pecahkan perhitungan menjadi langkah antara yang tersimpan di array, atau manfaatkan operasi array MATLAB yang memang dirancang untuk data berdimensi banyak.

Berkas contoh.m pada bagian bawah halaman memuat ketiga pola — traversal, tabel perkalian, dan jarak pasangan titik — dalam satu script yang dapat dijalankan utuh.

Ringkasan #

Loop bersarang menelusuri struktur dua dimensi: loop luar untuk baris, loop dalam untuk kolom, dan size() menjaga pola tetap berlaku untuk matriks berukuran apa pun. Posisi pernyataan di dalam loop menentukan frekuensinya — per sel di loop terdalam, per baris di antara kedua loop. Komputasi pasangan seperti jarak antar titik memakai pola hasil n × n dengan preallocation dan penelusuran setengah atas. Batasi kedalaman dua level agar kode tetap terbaca.