Galat runtime MATLAB jarang diam-diam: interpreter berhenti, mencetak pesan, dan menunjuk baris kejadian. Masalahnya, teks pesannya sering kita baca setengah — atau tidak sama sekali — sebelum mengutak-atik kode secara acak. Chapter ini mengumpulkan pesan galat yang paling sering muncul sepanjang Course ke dalam satu kamus (pesan → penyebab → perbaikan), lalu menyusun prosedur debug lima langkah, panduan memilih breakpoint vs try-catch, dan pola-pola galat logika yang lolos dari interpreter tanpa pesan apa pun.

Kamus Galat Umum #

Tabel berikut adalah kamus galat yang paling sering kita temui. Kolom “perbaikan cepat” sengaja memuat tindakan pertama yang paling mungkin berhasil, bukan seluruh solusi — penjelasan mekanisme tiap galat tersedia di chapter asalnya (membaca-error-message, indexing, concatenation, dan seterusnya):

Pesan galat (teks MATLAB)Penyebab paling umumPerbaikan cepat
Index exceeds matrix dimensions. / Index exceeds the number of array elements. Index must not exceed 6.indeks melebihi batas array: data(7) saat data hanya berisi 3 elemencek numel()/size(); periksa apakah data kolom seharusnya data(i, 1)
Error using * Inner matrix dimensions must agree.dimensi dalam operand tidak cocok untuk perkalian matriks: [1 2 3] * [4; 5]gunakan .' untuk transpose atau .* bila maksudnya elemen-per-elemen
Undefined function or variable 'x'. (baru: Unrecognized function or variable)variabel belum dibuat, salah eja, atau berkas fungsi tidak ada di search path — juga muncul pada switch pilihan saat pilihan belum diisicek ejaan; panggil which('nama') dan exist('nama')
Error using vertcat/horzcat Dimensions of arrays being concatenated are not consistent.[1 2; 3] — baris/A; B tidak sama panjangsamakan jumlah kolom (atau baris) tiap blok sebelum menggabungkan
Unable to perform assignment because the size of the left side is 1-by-2 and the size of the right side is 1-by-3.assignment beda ukuran: v(1:2) = [1 2 3]samakan ukuran kedua sisi; atau pakai v = [v, tambahan] untuk menumbuhkan
Subscript indices must either be real positive integers or logicals.indeks nol, negatif, atau pecahan: x(0), x(1.5)periksa hasil ekspresi indeks — find/round bila perlu
Matrix is singular to working precision. (dengan inv)det(A) = 0 atau nyaris — misal kolom kedua kelipatan kolom pertamaselesaikan dengan A\b; cek rank(A); pinv(A) untuk pseudo-inverse
Out of memory. Type HELP MEMORY for your options.alokasi melebihi RAM — array tumbuh di dalam loop, atau double untuk data yang cukup single/uint8preallocation, pecah proses per tahap dengan save/load, turunkan kelas data
Warning: Polynomial is badly conditioned.polyfit derajat tinggi — matriks Vandermonde nyaris singulargunakan derajat lebih rendah atau skala variabel (polyfit(x/1e3, y, n))
Not enough input arguments.fungsi dipanggil kurang argumen, sering lewat handlecek definisi nargin; beri default di awal fungsi
Attempt to execute SCRIPT as a function.skrip dipanggil seperti fungsi: skrip.m(argumen)ubah skrip menjadi fungsi, atau panggil tanpa tanda kurung

Prosedur Debug Lima Langkah #

Aturan mainnya: jangan menyentuh kode sebelum kelima langkah selesai. Urutannya meniru alur investigasi, bukan tebakan:

  1. Baca pesan galat — baris teks polos dulu, baru stack. Warning: berarti eksekusi berlanjut; baris di bawah Warning: menunjuk lokasi warning() dipanggil, bukan akar masalah.
  2. Temukan baris — frame terdalam err.stack(1) adalah lokasi kejadian; frame terluar adalah titik masuk. Jangan mengedit berkas di frame terluar dulu.
  3. Periksa nilai — di mode debug (K>>), tampilkan size() dan whos untuk operand di baris tersebut; hampir semua galat tabel di atas adalah galat ukuran/nilai, bukan galat logika.
  4. Isolasi minimal — salin baris bermasalah ke Command Window dengan nilai terkecil yang masih memicu galat; semakin kecil kasusnya, semakin jelas penyebabnya.
  5. Perbaiki dan uji — ubah satu hal saja, lalu jalankan ulang kasus minimal dan seluruh suite uji (Chapter Panduan Pengujian) untuk memastikan tidak ada yang rusak.

Breakpoint atau try-catch #

Keduanya menyelesaikan masalah yang berbeda. Breakpoint menghentikan eksekusi untuk diselidiki manusia — dipilih saat kita belum paham penyebab. try-catch meneruskan eksekusi dengan rencana pemulihan — dipilih saat penyebab sudah diketahui dan terduga (berkas input bisa absen, data bisa berformat salah):

SituasiPilihanBentuk
galat baru, penyebab belum jelasbreakpointklik margin Editor, atau dbstop in namaFungsi at 12
ingin berhenti persis saat galat terjadierror breakpointdbstop if error — lalu stack terbuka otomatis
hanya pada kondisi tertentuconditional breakpointdbstop in loop at 5 if i > 40
input pengguna bisa valid/tidaktry-catchtry buka() catch err ... log + lanjut
input harus valid, jika tidak program tak berartierror() di fungsierror('demo:input', 'Input harus angka')

Aturan praktisnya: try-catch bukan alat debugging melainkan alat penanganan — menelan galat yang belum dipahami (catch kosong) hanya menyembunyikan bug untuk ditemukan nanti dalam bentuk lebih buruk.

Perkakas Analisis: checkcode dan profile #

Sebelum galat muncul sekalipun, dua perkakas bisa memindai masalah. checkcode('skrip.m') — padanan Code Analyzer yang menandai margine Editor — mendaftar baris berisiko: variabel tak terpakai, array yang tumbuh di loop, fungsi shadowed. profile on … profile viewer mengukur waktu tiap baris untuk mencari bagian lambat; pola pemakaiannya kita rangkai di Chapter Benchmark. Perlu dicatat: checkcode hanya tersedia di MATLAB — Octave tidak memilikinya, sehingga berkas contoh Course memakai exist('checkcode') sebagai penjaga sebelum memanggilnya.

Galat Logika: Benar Sintaks, Salah Hasil #

Kategori terakhir adalah galat yang tidak melempar pesan apa pun — kode berjalan, angkanya salah. Empat pola klasik:

PolaGejalaContohObat
off-by-onehasil meleset satu elemensum(x(1:n-1)) untuk n data pertama harusnya sum(x(1:n))uji pada kasus kecil dengan jawaban tahu
baris vs kolom (column-major)elemen salah diambilM(1:2) mengambil kolom pertama (nilai 1 dan 4), bukan baris pertamatulis eksplisit M(1, :); ingat rumus k = (c-1)*nBaris + r
aritmetika integer membulatkanangka “hilang” pecahannyaint32(7)/int32(2) bernilai 4, bukan 3.5hitung di double, konversi ke integer hanya saat menyimpan
salinan vs rujukanperubahan tidak “sampai”B = A(2:3); B(1) = 999; — A tidak berubah (assignment menyalin)kembalikan A = f(A); atau class < handle untuk objek yang memang dibagi

Baris “salinan vs rujukan” menutup lingkaran kembali ke materi copy-on-write dan value/handle class: di MATLAB, potongan array dan objek value class selalu disalin, sehingga fungsi yang “mengubah” argumennya harus mengembalikan hasilnya.

Ringkasan #

Kamus galat (sebelas pesan dari Index exceeds sampai Out of memory), prosedur lima langkah (baca → temukan → periksa → isolasi → perbaiki dan uji), pemilihan breakpoint vs try-catch, perkakas checkcode/profile, dan empat pola galat logika membentuk satu sistem debug yang bisa dijalankan tanpa menebak. Kombinasikan dengan suite uji dari Chapter Panduan Pengujian agar setiap perbaikan terkunci dan tidak membuka galat baru di tempat lain.