Kita kini menguasai lima alat pengatur alur program: if, switch, for, while, dan vektorisasi. Persoalan berikutnya bukan lagi “bagaimana memakainya”, melainkan “yang mana yang dipilih” — karena hampir setiap masalah dapat diselesaikan dengan beberapa struktur sekaligus, dan pilihan yang tepat menentukan kode mudah dibaca hari ini dan mudah dirawat tahun depan. Chapter penutup Section ini merangkum kriteria pemilihan ke dalam satu tabel keputusan, menguraikan pertanyaan penentunya, lalu mempraktikkan refaktor loop menjadi vektorisasi dengan hasil yang terbukti identik.

Tabel Keputusan Struktur Kontrol #

Lima kandidat di atas punya medan masing-masing. Tabel berikut merangkum kriteria terkuat setiap struktur:

StrukturPilih saatCiri khas masalah
if-elseif-elsecabang berbasis rentang atau kombinasi kondisi“nilai ≥ 80?”, “stok > 0 dan pesanan mendesak?”
switch-casecabang berbasis nilai diskritsatu ekspresi dicocokkan ke daftar nilai tetap
forjumlah iterasi diketahui atau array akan ditelusuri“proses kelima elemen”, “tiap kolom matriks”
whileiterasi berbasis kondisi, jumlahnya tak pasti“ulangi sampai cukup akurat”, “selama data tersisa”
Vektorisasioperasi elemen-per-elemen murnihitungan tiap elemen tidak bergantung elemen lain

Aturan praktis dari tabel itu: pilih kolom kedua berdasarkan bentuk masalah, bukan kebiasaan dari bahasa lain. Pemindah dari C cenderung menulis loop untuk segalanya; pemindah dari Python cenderung memakai if bahkan untuk kecocokan nilai tunggal. Kedua kebiasaan itu sama-sama bekerja di MATLAB, tetapi keduanya tidak memanfaatkan kekuatan bahasa yang dirancang di sekitar array.

Empat Pertanyaan Penentu #

Sebelum menulis blok kontrol apa pun, tanyakan empat hal berikut secara berurutan:

  1. Berapa banyak cabangnya, dan berbentuk apa? Dua cabang sederhana cukup memakai if/else. Cabang berbasis nilai diskrit (menu, kode, kategori) lebih jelas sebagai switch. Cabang berbasis rentang harus memakai if-elseif karena case hanya menguji kesetaraan.
  2. Apakah jumlah iterasi diketahui di muka? Bila ya — “proses 1000 baris”, “setiap elemen vektor” — pilih for. Jumlah yang baru diketahui setelah proses berjalan (konvergensi, pencarian) memaksa kita memilih while.
  3. Apakah tiap iterasi bergantung pada hasil iterasi sebelumnya? Deret yang berhenti saat sukunya kecil, akumulator yang berubah tiap putaran — ini wilayah while. Bila setiap elemen dihitung sendiri-sendiri, vektorisasi hampir selalu tersedia.
  4. Apakah hasilnya berbentuk array yang diisi elemen demi elemen? Bila ya, periksa apakah seluruh badan loop dapat digantikan satu operator titik atau satu fungsi array. Bisa — pakai vektorisasi; tidak bisa (misalnya iterasi bergantung, atau perlu efek samping seperti menulis berkas per iterasi) — kembali ke for dengan preallocation.

Refactoring: dari Loop ke Vektorisasi #

Refaktor paling umum di MATLAB: mengubah loop pengisi array menjadi vektorisasi. Mari kita bandingkan kedua versi perhitungan kuadrat dari contoh.m:

matlab
data = [12 45 67 23 89];

% Versi 1: for loop dengan preallocation
kuadratLoop = zeros(size(data));
for k = 1:length(data)
    kuadratLoop(k) = data(k)^2;
end
fprintf('loop     : %d %d %d %d %d\n', kuadratLoop);

% Versi 2: vektorisasi dengan operator .^
kuadratVek = data .^ 2;
fprintf('vektoris : %d %d %d %d %d\n', kuadratVek);

% isequal: bandingkan seluruh elemen dua array
fprintf('hasil sama: %d\n', isequal(kuadratLoop, kuadratVek));

Output yang Dihasilkan:

text
loop     : 144 2025 4489 529 7921
vektoris : 144 2025 4489 529 7921
hasil sama: 1

Mari kita bedah baris-baris kode di atas:

  1. Baris 4-7 (zeros ... for ... end): versi loop yang sudah benar — preallocation rapi, indexing bersih; ini patokan yang harus dikalahkan versi vektorisasi.
  2. Baris 11 (kuadratVek = data .^ 2): satu baris menggantikan empat baris loop; operator .^ menghitung kuadrat seluruh elemen sekaligus.
  3. Baris 15 (isequal ...): fungsi isequal() membandingkan seluruh elemen kedua array dan mengembalikan logical scalar — nilai 1 membuktikan kedua versi menghasilkan array identik.

Refaktor serupa berlaku untuk loop yang memuat if. Transformasi “diskon 20% hanya untuk harga di atas 50” memindahkan keputusan ke mask logical:

matlab
harga = [30 55 42 80 66];

% Versi loop: if di dalam for
diskonLoop = zeros(size(harga));
for k = 1:length(harga)
    if harga(k) > 50
        diskonLoop(k) = harga(k) * 0.2;
    end
end
fprintf('diskon loop : %.1f %.1f %.1f %.1f %.1f\n', diskonLoop);

% Versi vektorisasi: mask logical dikalikan elemen-per-elemen
diskonVek = 0.2 * harga .* (harga > 50);
fprintf('diskon vekt : %.1f %.1f %.1f %.1f %.1f\n', diskonVek);
fprintf('hasil sama: %d\n', isequal(diskonLoop, diskonVek));

Output yang Dihasilkan:

text
diskon loop : 0.0 11.0 0.0 16.0 13.2
diskon vekt : 0.0 11.0 0.0 16.0 13.2
hasil sama: 1

Mari kita bedah baris-baris kode di atas:

  1. Baris 4-9 (loop + if): loop memeriksa setiap harga satu per satu; cabang if mengisi elemen diskon hanya untuk harga > 50.
  2. Baris 13 (diskonVek = 0.2 * harga .* (harga > 50)): ekspresi harga > 50 menghasilkan mask logical [0 1 0 1 1] (0/1); perkalian elemen-per-elemen .* mematikan elemen bawah ambang dan mempertahankan elemen di atasnya sebelum dikali 0.2.
  3. Baris 15 (isequal ...): sekali lagi nilai 1 — kedua versi menghasilkan array diskon yang identik.

Keterbacaan Dulu, Performa Kemudian #

Vektorisasi memang lebih cepat pada array besar — mesin MATLAB menjalankan operasi array dalam kode teroptimasi tingkat rendah, sementara loop menanggung biaya interpretasi per baris per iterasi. Namun urutan prioritas yang benar adalah: kejelasan dulu, kecepatan kemudian. Loop eksplisit yang mudah dibaca lebih berharga daripada vektorisasi jenius yang butuh lima menit untuk dipahami; sebaliknya, vektorisasi sederhana seperti data .^ 2 lebih pendek dan lebih cepat sekaligus. Ukur dengan tic/toc atau profil saat performa benar-benar menjadi persoalan — alat ukurnya kita bahas pada Section Optimasi dan Performa.

Berkas contoh.m pada bagian bawah halaman menjalankan kedua pasangan versi (kuadrat dan diskon) dan memverifikasi kesamaannya dengan isequal().

Ringkasan #

Pemilihan struktur kontrol mengikuti bentuk masalah: switch untuk nilai diskrit, if-elseif untuk rentang dan kombinasi kondisi, for untuk iterasi yang jumlahnya diketahui, while untuk iterasi berbasis konvergensi, dan vektorisasi untuk operasi elemen-per-elemen. Empat pertanyaan penentu — jumlah cabang, kepastian iterasi, ketergantungan antar iterasi, dan bentuk hasil — memetakan masalah ke struktur yang tepat. Refaktor loop ke vektorisasi dijamin aman bila isequal() membuktikan hasilnya identik, dengan kejelasan tetap diukur lebih dulu daripada kecepatan.