Filtering menjawab “apa saja yang lolos kondisi”; searching menjawab pertanyaan berikutnya: “di POSISI mana kejadian itu terjadi?” — hari keberapa suhu menembus 32 derajat, baris mana yang memuat harga tertentu, apakah hari tertentu sudah tercatat. MATLAB menyediakan satu fungsi inti untuk hal ini (find) plus para pendukungnya (ismember, strcmp, strfind). Cakupan chapter ini:
finduntuk posisi dan nilai, termasuk posisi pertama dan terakhirfindbentuk dua keluaran[r, c]untuk matriksismemberuntuk keanggotaan beserta lokasinyastrcmp/strcmpiuntuk teks dalam cell array danstrfinduntuk pola di dalam kalimat- Pola “apakah ada” dengan
any
Dataset yang dipakai di chapter ini:
penjualan = [1 12 15000; 2 15 15000; 3 9 16000; 4 22 16000; 5 18 15000;
6 7 17000; 7 25 15000; 8 11 16000; 9 14 17000; 10 20 16000;
11 16 17000; 12 19 15000]; % kolom: hari, unit, harga
suhu = [30 32 31 29 33 34 31 30 35 32]; % suhu harian (derajat)find: Posisi Elemen yang Lolos #
Aturannya: find(mask) mengembalikan INDEKS elemen yang bernilai true, bukan nilainya — kebalikan dari logical indexing yang langsung memungut nilai. Mekanismenya: find menelusuri mask dan mengumpulkan nomor posisi; nilainya sendiri tinggal dibaca dengan indeks tersebut. Argumen tambahan membatasi hasil: find(mask, n) mengambil n posisi pertama, dan find(mask, n, 'last') mengambil n posisi terakhir:
idx = find(suhu > 32);
fprintf('posisi suhu > 32 : '); fprintf('%d ', idx); fprintf('\n');
fprintf('nilainya : '); fprintf('%d ', suhu(idx)); fprintf('\n');
fprintf('suhu > 40 ada di : %d posisi\n', numel(find(suhu > 40)));
fprintf('posisi pertama : %d\n', find(suhu > 30, 1));
fprintf('3 posisi pertama : '); fprintf('%d ', find(suhu > 30, 3)); fprintf('\n');
fprintf('2 posisi terakhir: '); fprintf('%d ', find(suhu > 30, 2, 'last')); fprintf('\n');Output yang Dihasilkan:
posisi suhu > 32 : 5 6 9
nilainya : 33 34 35
posisi pertama : 2
3 posisi pertama : 2 3 5
2 posisi terakhir: 9 10
suhu > 40 ada di : 0 posisiMari kita bedah baris-baris kode di atas:
- Baris 1-2 (
find(suhu > 32)+suhu(idx)): masksuhu > 32bernilaitruepada posisi 5, 6, 9; indeks dipakai membaca nilai 33, 34, 35. Posisi inilah mata uangfind— nilainya menyusul begitu posisi diketahui. - Baris 3 (
numel(find(...))): kondisi yang tidak lolos menghasilkanfindkosong;numelmenghitung 0 posisi tanpa perlu penanganan khusus. - Baris 5-7 (
find(mask, n)): hari pertama yang menghangat di atas 30 adalah hari 2; polandan'last'menyuapi laporan “pertama kali” dan “terakhir kali”.
find untuk Matriks: Koordinat Baris dan Kolom #
Pada matriks, find(mask) mengembalikan indeks linear (penomoran kolom demi kolom) — angka tunggal yang sulit dibaca. Aturannya: bentuk dua keluaran [baris, kolom] = find(mask) memecah tiap posisi menjadi pasangan koordinat. Mekanismenya: kedua keluaran adalah column vector yang sejajar satu-satu — elemen ke-k dari baris dan kolom mengarah ke temuan ke-k:
[baris, kolom] = find(penjualan == 16000);
for k = 1:numel(baris)
fprintf('16000 ditemukan di baris %d, kolom %d\n', baris(k), kolom(k));
endOutput yang Dihasilkan:
16000 ditemukan di baris 3, kolom 3
16000 ditemukan di baris 4, kolom 3
16000 ditemukan di baris 8, kolom 3
16000 ditemukan di baris 10, kolom 3Mari kita bedah baris-baris kode di atas:
- Baris 1 (
[baris, kolom] = find(...)): empat sel bernilai 16000 semuanya tinggal di kolom 3 (variabel harga) pada baris 3, 4, 8, 10 — hari-hari yang memakai harga Rp16.000. - Baris 2-4 (
for+fprintf):formengunjungi tiap temuan; koordinatbaris(k)dankolom(k)bisa langsung dipakai membaca sel lain di baris yang sama, misalnyapenjualan(baris(k), 2).
ismember: Keanggotaan dan Lokasi #
Masalah sehari-sehari: “apakah hari ini ada di data kita, dan kalau ada, di baris mana?” — pertanyaan validasi. Aturannya: ismember(A, B) memeriksa tiap elemen A apakah ada di dalam B, menghasilkan mask logical seukuran A. Mekanismenya: bentuk dua keluaran [tf, lokasi] = ismember(A, B) menambahkan posisi KEMUNCULAN PERTAMA di B untuk tiap elemen A yang ditemukan — elemen yang tidak ada dilaporkan 0:
hari = penjualan(:, 1);
dicari = [3 7 15];
[ada, lokasi] = ismember(dicari, hari);
fprintf('dicari : '); fprintf('%d ', dicari); fprintf('\n');
fprintf('ditemukan: '); fprintf('%d ', ada); fprintf('\n');
fprintf('di baris : '); fprintf('%d ', lokasi); fprintf('\n');Output yang Dihasilkan:
dicari : 3 7 15
ditemukan: 1 1 0
di baris : 3 7 0Mari kita bedah baris-baris kode di atas:
- Baris 1-2 (
haridandicari):hariadalah kolom referensi;dicarimemuat angka 15 yang sengaja tidak ada di data — kasus umum saat memvalidasi input pengguna. - Baris 3-6 (
ismember): hari 3 dan 7 ditemukan di baris ke-3 dan ke-7 (kebetulan sama dengan nilainya); hari 15 dilaporkan0pada kedua keluaran. Polaismembermenggantikan loop perbandingan satu per satu.
Pencarian Teks: strcmp dan strfind #
Data penjualan juga punya kolom nama produk berupa teks. Aturannya: nama-nama tersebut disimpan dalam cell array of char ({'Kopi'; 'Teh'}), dan fungsi strcmp(C, 'kopi') membandingkan tiap isi sel dengan teks kunci secara case-sensitive; strcmpi versi case-insensitive. Mekanismenya: strcmp mengembalikan mask logical seukuran cell array, sehingga pola pencarian baris tetap sama dengan data numerik. Untuk mencari POLA di dalam satu teks panjang, strfind(teks, pola) mengembalikan posisi-posisi kemunculannya:
produk = {'Kopi'; 'Teh'; 'Gula'; 'kopi'};
fprintf('strcmp ''kopi'' : %d %d %d %d\n', strcmp(produk, 'kopi'));
fprintf('strcmpi ''kopi'': %d %d %d %d\n', strcmpi(produk, 'kopi'));
fprintf('baris kopi : '); fprintf('%d ', find(strcmpi(produk, 'kopi'))); fprintf('\n');
kalimat = 'laporan penjualan mingguan';
fprintf('posisi ''an'' : '); fprintf('%d ', strfind(kalimat, 'an')); fprintf('\n');Output yang Dihasilkan:
strcmp 'kopi' : 0 0 0 1
strcmpi 'kopi': 1 0 0 1
baris kopi : 1 4
posisi 'an' : 6 16 25Mari kita bedah baris-baris kode di atas:
- Baris 1-2 (
strcmpvsstrcmpi):strcmphanya mencocokkan sel ke-4 karena huruf besar-kecil dihitung beda;strcmpijuga menerima sel ke-1'Kopi'. Pilihstrcmpuntuk kode yang peka huruf,strcmpiuntuk pencarian nama pengguna. - Baris 3 (
find(strcmpi(...))): mask hasilstrcmpilangsung masuk kefind— transaksi kopi ada di baris 1 dan 4; gabungan ini adalah idiom pencarian teks paling sering dipakai. - Baris 5-6 (
strfind): pola'an'muncul di posisi karakter 6, 16, dan 25 kalimat — mencakup “laporan”, “penjualan”, dan “mingguan”;numel(strfind(...))menghitungnya.
Pola “Apakah Ada”: any #
Sering kita hanya butuh jawaban ya/tidak: “adakah pengukuran yang melewati batas?”. Aturannya: any(mask) mengembalikan true bila ADA satu elemen true di dalam mask; kebalikannya, all(mask) baru true bila semuanya lolos. Mekanismenya: keduanya merangkum mask menjadi satu nilai logical — dan keduanya juga bekerja per baris matriks dengan argumen 2, seperti dipakai pada chapter Filtering:
fprintf('ada suhu > 34? %d\n', any(suhu > 34));
fprintf('ada suhu > 40? %d\n', any(suhu > 40));Output yang Dihasilkan:
ada suhu > 34? 1
ada suhu > 40? 0Mari kita bedah baris-baris kode di atas:
- Baris 1 (
any(suhu > 34)): satu saja kemunculan 35 derajat cukup membuatanybernilai1— pola penjaga (guard) sebelum laporan ekstrem dicetak. - Baris 2 (
any(suhu > 40)): tidak ada yang lolos, hasil0;~any(mask)menjadi cara membaca “tidak ada satu pun”.
Berkas contoh.m pada bagian bawah halaman merangkai seluruh fungsi pencarian tersebut pada dataset penjualan, suhu, dan daftar produk dalam satu script utuh.
Ringkasan #
find mengubah mask menjadi posisi — penuh, n pertama, atau n terakhir — dan nilainya tinggal dibaca lewat indeks; bentuk [r, c] memberi koordinat pada matriks. ismember memvalidasi keanggotaan sekaligus melaporkan lokasi kemunculan pertama. Untuk teks, strcmp/strcmpi menyaring cell array nama dan strfind melacak pola di dalam kalimat, sedangkan any merangkum pertanyaan “apakah ada” menjadi satu nilai. Perjalanan kita berlanjut ke penghitungan: nilai unik dan frekuensi kemunculannya di chapter Unique Values dan Counting.