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 umum | Perbaikan 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 elemen | cek 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 diisi | cek 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 panjang | samakan 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 pertama | selesaikan 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/uint8 | preallocation, pecah proses per tahap dengan save/load, turunkan kelas data |
Warning: Polynomial is badly conditioned. | polyfit derajat tinggi — matriks Vandermonde nyaris singular | gunakan derajat lebih rendah atau skala variabel (polyfit(x/1e3, y, n)) |
Not enough input arguments. | fungsi dipanggil kurang argumen, sering lewat handle | cek 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:
- Baca pesan galat — baris teks polos dulu, baru stack.
Warning:berarti eksekusi berlanjut; baris di bawahWarning:menunjuk lokasiwarning()dipanggil, bukan akar masalah. - Temukan baris — frame terdalam
err.stack(1)adalah lokasi kejadian; frame terluar adalah titik masuk. Jangan mengedit berkas di frame terluar dulu. - Periksa nilai — di mode debug (
K>>), tampilkansize()danwhosuntuk operand di baris tersebut; hampir semua galat tabel di atas adalah galat ukuran/nilai, bukan galat logika. - Isolasi minimal — salin baris bermasalah ke Command Window dengan nilai terkecil yang masih memicu galat; semakin kecil kasusnya, semakin jelas penyebabnya.
- 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):
| Situasi | Pilihan | Bentuk |
|---|---|---|
| galat baru, penyebab belum jelas | breakpoint | klik margin Editor, atau dbstop in namaFungsi at 12 |
| ingin berhenti persis saat galat terjadi | error breakpoint | dbstop if error — lalu stack terbuka otomatis |
| hanya pada kondisi tertentu | conditional breakpoint | dbstop in loop at 5 if i > 40 |
| input pengguna bisa valid/tidak | try-catch | try buka() catch err ... log + lanjut |
| input harus valid, jika tidak program tak berarti | error() di fungsi | error('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:
| Pola | Gejala | Contoh | Obat |
|---|---|---|---|
| off-by-one | hasil meleset satu elemen | sum(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 diambil | M(1:2) mengambil kolom pertama (nilai 1 dan 4), bukan baris pertama | tulis eksplisit M(1, :); ingat rumus k = (c-1)*nBaris + r |
| aritmetika integer membulatkan | angka “hilang” pecahannya | int32(7)/int32(2) bernilai 4, bukan 3.5 | hitung di double, konversi ke integer hanya saat menyimpan |
| salinan vs rujukan | perubahan 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.