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:
| Struktur | Pilih saat | Ciri khas masalah |
|---|---|---|
if-elseif-else | cabang berbasis rentang atau kombinasi kondisi | “nilai ≥ 80?”, “stok > 0 dan pesanan mendesak?” |
switch-case | cabang berbasis nilai diskrit | satu ekspresi dicocokkan ke daftar nilai tetap |
for | jumlah iterasi diketahui atau array akan ditelusuri | “proses kelima elemen”, “tiap kolom matriks” |
while | iterasi berbasis kondisi, jumlahnya tak pasti | “ulangi sampai cukup akurat”, “selama data tersisa” |
| Vektorisasi | operasi elemen-per-elemen murni | hitungan 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:
- Berapa banyak cabangnya, dan berbentuk apa? Dua cabang sederhana cukup memakai
if/else. Cabang berbasis nilai diskrit (menu, kode, kategori) lebih jelas sebagaiswitch. Cabang berbasis rentang harus memakaiif-elseifkarenacasehanya menguji kesetaraan. - 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 memilihwhile. - 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. - 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
fordengan 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:
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:
loop : 144 2025 4489 529 7921
vektoris : 144 2025 4489 529 7921
hasil sama: 1Mari kita bedah baris-baris kode di atas:
- Baris 4-7 (
zeros ... for ... end): versi loop yang sudah benar — preallocation rapi, indexing bersih; ini patokan yang harus dikalahkan versi vektorisasi. - Baris 11 (
kuadratVek = data .^ 2): satu baris menggantikan empat baris loop; operator.^menghitung kuadrat seluruh elemen sekaligus. - Baris 15 (
isequal ...): fungsiisequal()membandingkan seluruh elemen kedua array dan mengembalikanlogicalscalar — 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:
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:
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: 1Mari kita bedah baris-baris kode di atas:
- Baris 4-9 (loop + if): loop memeriksa setiap harga satu per satu; cabang
ifmengisi elemen diskon hanya untuk harga > 50. - Baris 13 (
diskonVek = 0.2 * harga .* (harga > 50)): ekspresiharga > 50menghasilkan masklogical[0 1 0 1 1](0/1); perkalian elemen-per-elemen.*mematikan elemen bawah ambang dan mempertahankan elemen di atasnya sebelum dikali 0.2. - 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.