Pertanyaan analisis data jarang berbentuk “elemen baris 2 kolom 3” — bentuk aslinya “elemen mana yang melebihi ambang?”, “berapa banyak yang gagal?”, “ganti semua nilai negatif dengan nol”. Bahasa lain menjawab dengan for dan if; MATLAB menjawab dengan meletakkan kondisi langsung di dalam kurung indeks: data(data > 32). Teknik logical indexing ini adalah idiom paling khas MATLAB — kita sudah mencicipinya pada Chapter Logical Data Type, dan kini kita angkat menjadi perangkat lengkap untuk matriks:
- Mask tunggal
A(A > 5)dan mask gabungan&,~ findversus logical indexing — kapan posisi, kapan nilai- Penggantian nilai
A(A < 0) = 0 - Pola menghitung
sum(A > 5)
Mask sebagai Indeks #
Aturannya: array logical berukuran SAMA dengan array data dapat ditempatkan di dalam kurung indeks sebagai mask — MATLAB mengambil elemen pada posisi yang bernilai true. Mekanismenya: mesin menelusuri mask kolom demi kolom (konsisten dengan column-major), memungut elemen data di posisi bertanda 1, dan menyusun hasilnya sebagai column vector. Ukuran mask harus tepat sama dengan ukuran data — mask yang lebih pendek atau lebih panjang memicu galat.
dataSuhu = [28 32 35; 24 30 38; 26 29 33]; % 3 kota x 3 hari
panas = dataSuhu(dataSuhu > 32);
fprintf('Elemen > 32 : ');
fprintf('%d ', panas);
fprintf('\n');
sedang = dataSuhu((dataSuhu >= 28) & (dataSuhu < 34));
fprintf('Elemen 28..33: ');
fprintf('%d ', sedang);
fprintf('\n');
tidakPanas = dataSuhu(~(dataSuhu > 32));
fprintf('Elemen <= 32: ');
fprintf('%d ', tidakPanas);
fprintf('\n');Output yang Dihasilkan:
Elemen > 32 : 35 38 33
Elemen 28..33: 28 32 30 29 33
Elemen <= 32: 28 24 26 32 30 29Mari kita bedah baris-baris kode di atas:
- Baris 3 (
dataSuhu(dataSuhu > 32)): perbandingan menghasilkan masklogical3×3; tiga posisi bernilaitrue(35, 38, 33). Hasil pemungutan disusun sebagai column vector mengikuti urutan kolom — 35 (baris 1 kolom 3), 38 (baris 2 kolom 3), lalu 33 (baris 3 kolom 3). - Baris 7 (
(dataSuhu >= 28) & (dataSuhu < 34)): dua mask digabung dengan&— hanya posisi yang lolos KEDUA kondisi yang terpungut. Kurung di tiap sisi&menjaga urutan evaluasi tetap jelas. - Baris 11 (
~(dataSuhu > 32)): negasi membalik mask — pola ringkas untuk “selain kondisi ini”.
find: Nilai atau Posisi? #
Fungsi find() mengembalikan INDEKS elemen yang true, bukan nilainya. Untuk vektor, find(mask) menghasilkan daftar nomor posisi; untuk matriks, bentuk dua-keluaran [baris, kolom] = find(mask) memberikan koordinat tiap elemen yang lolos. Pilih find bila yang dibutuhkan posisinya (“kota mana saja yang panas?”), pilih mask langsung bila yang dibutuhkan nilainya (“berapa suhu yang panas?”):
[baris, kolom] = find(dataSuhu > 34);
fprintf('Elemen > 34 ditemukan di %d posisi\n', numel(baris));
fprintf('Posisi 1: baris %d, kolom %d\n', baris(1), kolom(1));
fprintf('Posisi 2: baris %d, kolom %d\n', baris(2), kolom(2));Output yang Dihasilkan:
Elemen > 34 ditemukan di 2 posisi
Posisi 1: baris 1, kolom 3
Posisi 2: baris 2, kolom 3Mari kita bedah baris-baris kode di atas:
- Baris 1 (
[baris, kolom] = find(...)): maskdataSuhu > 34hanyatruedi dua posisi — nilai 35 (baris 1, kolom 3) dan 38 (baris 2, kolom 3). Kedua keluaranfindberupa column vector yang sejajar satu-satu. - Baris 2-4 (
fprintf):numel(baris)menghitung banyaknya posisi;baris(1)/kolom(1)membaca koordinat pertama. Dengan koordinat inilah kita bisa, misalnya, menandai kota yang mengalami panas ekstrem.
Penggantian Nilai: Mask di Sisi Kiri #
Kekuatan sesungguhnya muncul saat mask diletakkan di sisi kiri assignment: A(kondisi) = nilaiBaru menimpa hanya elemen-elemen yang lolos mask. Mekanismenya: MATLAB memungut posisi-posisi true, lalu menulis nilai ke posisi tersebut — satu baris kode yang setara dengan loop penuh berisi if:
dataUji = [78 55 92; 65 88 40];
dataUji(dataUji < 60) = 60;
fprintf('dataUji setelah clip:\n');
disp(dataUji);Output yang Dihasilkan:
dataUji setelah clip:
78 60 92
65 88 60Mari kita bedah baris-baris kode di atas:
- Baris 1 (
dataUji = ...): nilai ujian dua siswa; nilai 55 dan 40 berada di bawah batas kelulusan 60. - Baris 2 (
dataUji(dataUji < 60) = 60): dua posisi yangtrueditimpa 60 — pola clipping yang menjaga data tetap dalam rentang sah. Nilai lain tidak disentuh. - Baris 3-4 (
fprintf/disp): hasil tercetak rapi — persis seperti kebijakan “nilai minimal 60” diterapkan serentak.
Pola serumpun yang perlu dihafal:
dataUji(dataUji > 100) = NaN; % tandai data tak masuk akal sebagai hilang
dataUji(isnan(dataUji)) = 0; % ganti data hilang dengan nolMenghitung Tanpa Membaca: sum pada Mask #
Karena true tersimpan sebagai 1 dan false sebagai 0, menjumlahkan mask langsung menghasilkan BANYAKNYA elemen yang lolos. Untuk matriks, linearisasikan dulu dengan A(:) — operator yang menyusun seluruh elemen menjadi satu column vector — lalu jumlahkan:
jumlahPanas = sum(dataSuhu(:) > 32);
fprintf('Banyak elemen > 32: %d dari %d\n', jumlahPanas, numel(dataSuhu));Output yang Dihasilkan:
Banyak elemen > 32: 3 dari 9Mari kita bedah baris-baris kode di atas:
- Baris 1 (
sum(dataSuhu(:) > 32)):dataSuhu(:)meratakan matriks 3×3 menjadi kolom 9 elemen; mask dibandingkan pada bentuk rata itu lalu dijumlahkan → 3. Tanpa(:),sumpada matriks menjumlahkan tiap kolom secara terpisah (perilaku yang kita lihat pada Chapter Membuat Matriks). - Baris 2 (
numel):numelmengingatkan total populasinya: 3 dari 9 pengukuran tergolong panas. Polasum(mask)/numeljuga jadi dasar menghitung persentase:100 * sum(mask) / numel(data).
Berkas contoh.m pada bagian bawah halaman mempraktikkan keempat idiom tersebut pada dataSuhu dan dataUji dalam satu script utuh.
Ringkasan #
Logical indexing meletakkan kondisi langsung di dalam kurung indeks: mask logical berukuran sama memungut elemen yang true, dikombinasikan dengan &/|/~ untuk kondisi majemuk. find melaporkan posisi ketika koordinat yang dibutuhkan, sedangkan mask langsung memberi nilai. Di sisi kiri assignment, mask menjadi alat penggantian serentak, dan sum(mask) menghitung tanpa membaca satu per satu. Empat idiom ini adalah tanda tangan gaya MATLAB — seluruh penyaringan data tanpa satu loop pun. Selanjutnya kita belajar mengubah bentuk array tanpa mengubah isinya: reshape dan keluarganya.