Kondisi nyata jarang berdiri sendiri: “suhu melebihi 38 dan pasien lelah”, “stok habis atau pesanan mendesak”, “tidak termasuk kategori diskon”. Operator logika menggabungkan beberapa kondisi menjadi satu keputusan. MATLAB menyediakan dua keluarga: operator elemen (&, |, ~, xor) untuk array, dan operator short-circuit (&&, ||) yang khusus untuk scalar. Memahami kapan memakai yang mana — dan mengapa urutan evaluasi penting — adalah fokus Chapter ini.
Operator Logika Elemen-per-Elemen #
Empat operator berikut bekerja pada array logical (atau angka yang otomatis dikonversi) elemen-per-elemen, sama seperti operator pembanding:
| Operator | Operasi | Hasil true bila |
|---|---|---|
& | AND | kedua operand true |
| | OR | minimal satu operand true |
~ | NOT (negasi) | operand false (operator unary) |
xor() | exclusive OR | tepat salah satu operand true |
Operator ~ ditulis sebelum operand; tiga sisanya diletakkan di antara dua operand. Perhatikan contoh pemantauan pasien berikut — kita menggabungkan mask demam dengan data kelelahan:
suhu = [36.5 38.9 37.1 39.4];
kelelahan = [false true false true];
demam = suhu > 38;
fprintf('demam : %d %d %d %d\n', demam);
fprintf('demam & kelelahan : %d %d %d %d\n', demam & kelelahan);
fprintf('demam | kelelahan : %d %d %d %d\n', demam | kelelahan);
fprintf('~demam : %d %d %d %d\n', ~demam);
fprintf('xor(demam, lelah) : %d %d %d %d\n', xor(demam, kelelahan));Output yang Dihasilkan:
demam : 0 1 0 1
demam & kelelahan : 0 1 0 1
demam | kelelahan : 0 1 0 1
~demam : 1 0 1 0
xor(demam, lelah) : 0 0 0 0Mari kita bedah baris-baris kode di atas:
- Baris 3 (
demam = suhu > 38): perbandingan menghasilkan masklogical; pasien ke-2 dan ke-4 demam. - Baris 6 (
demam & kelelahan): hanya pasien yang demam dan lelah yang bernilai 1 — pasien 2 dan 4 lolos kedua kondisi. - Baris 7 (
demam | kelelahan): pasien yang demam atau lelah; hasil kebetulan sama karena kedua mask identik polanya. - Baris 8 (
~demam): negasi membalik setiap elemen mask. - Baris 9 (
xor(...)):xormenghasilkan 1 hanya bila kedua mask berbeda; karenademamdankelelahanberpola sama, seluruh hasilnya 0.
Hasil &, |, ~, dan xor tetap berupa array logical berukuran sama dengan operand — siap dipakai sebagai mask atau diringkas menjadi satu keputusan.
all dan any: Meringkas Array Menjadi Satu Keputusan #
Dua fungsi bawaan menjembatani array logical dan kondisi scalar. Fungsi any() menghasilkan true bila minimal satu elemen true; fungsi all() menghasilkan true hanya bila seluruh elemen true:
fprintf('any(demam) : %d\n', any(demam));
fprintf('all(demam) : %d\n', all(demam));Output yang Dihasilkan:
any(demam) : 1
all(demam) : 0Mari kita bedah baris-baris kode di atas:
- Baris 1 (
any(demam)): dua pasien demam, jadi “ada yang demam” bernilaitrue(1). - Baris 2 (
all(demam)): pasien 1 dan 3 tidak demam, jadi “semua demam” bernilaifalse(0).
Pola any(mask) dan all(mask) adalah cara idiomatik MATLAB untuk mengubah “kondisi per elemen” menjadi “kondisi keseluruhan” — misalnya if any(suhu > 38) untuk memicu peringatan.
Short-Circuit: && dan || #
Operator && dan || hanya bekerja pada scalar — dan di situ letak keunggulannya: MATLAB mengevaluasi operand pertama lebih dulu, lalu berhenti lebih awal (short-circuit) bila hasil akhir sudah pasti. Jika operand kiri && bernilai false, operand kanan tidak dievaluasi sama sekali; jika operand kiri || bernilai true, operand kanan juga dilewati.
Perilaku ini menjadi penyelamat saat operand kanan berisiko galat:
pembagi = 0;
if (pembagi ~= 0) && (10 / pembagi > 2)
fprintf('Hasil pembagian besar\n');
else
fprintf('Guard bekerja: pembagi nol dihindari\n');
endOutput yang Dihasilkan:
Guard bekerja: pembagi nol dihindariMari kita bedah baris-baris kode di atas:
- Baris 2 (
(pembagi ~= 0) && ...): operand kiri bernilaifalsekarenapembagimemang 0. - Evaluasi berhenti: MATLAB tidak mengevaluasi
10 / pembagi > 2, sehingga tidak ada pembagian dengan nol yang terjadi. Operasi ini berjalan tanpa galat. - Baris 5 (
else): karena kondisi utamafalse, blokelseyang dijalankan.
Tanpa short-circuit (misalnya memakai &), ekspresi 10 / pembagi akan dievaluasi duluan dan memicu peringatan “divide by zero” — pada MATLAB, pembagian skalar dengan nol menghasilkan Inf, tetapi banyak operasi lain (akses elemen, pemanggilan fungsi) langsung galat. Pola (kondisi aman) && (operasi berisiko) disebut guard clause dan wajib menjadi kebiasaan kita.
batas = 37.5;
fprintf('suhu(1) > batas && suhu(2) > batas : %d\n', ...
suhu(1) > batas && suhu(2) > batas);Output yang Dihasilkan:
suhu(1) > batas && suhu(2) > batas : 0Contoh terakhir membandingkan dua elemen suhu terhadap batas; kedua operand berupa logical scalar sehingga && sah digunakan — hasil 0 karena suhu(2) (38.9) melebihi batas tetapi suhu(1) (36.5) tidak.
Prioritas Logika di Balik Layar #
Urutan kekuatan operator logika dari yang tertinggi: ~, lalu &, lalu |, lalu && dan || (terlemah). Akibatnya, ekspresi a | b & c dievaluasi sebagai a | (b & c) — MATLAB selalu memberi & prioritas di atas |, bahkan ketika & muncul belakangan. Perbandingan (==, <, dst.) mengikat lebih kuat daripada seluruh operator logika, jadi suhu > 38 & kelelahan berarti (suhu > 38) & kelelahan tanpa kurung tambahan.
Berkas contoh.m pada bagian bawah halaman menguji keempat operator elemen, all/any, dan guard clause short-circuit dalam satu script utuh.
Ringkasan #
Operator &, |, ~, dan xor menggabungkan kondisi elemen-per-elemen; all() dan any() meringkas array menjadi satu keputusan. Operator short-circuit && dan || terbatas pada scalar tetapi menghentikan evaluasi lebih awal — kunci pola guard clause yang mencegah galat. Prioritas ~ > & > | menjelaskan urutan evaluasi, dan kurung eksplisit tetap sahabat terbaik kode yang terbaca.