Mengambil satu elemen jarang cukup. Laporan bulanan membutuhkan kolom penjualan satu produk, analisis membandingkan baris dua siswa teratas, dan tampilan tabel kadang perlu dibalik urutan barisnya. Array slicing — pengambilan potongan array lewat rentang indeks — menyelesaikan semua itu dalam satu ekspresi. Bab ini juga membongkar satu keyakinan yang menentukan cara kita berpikir tentang variabel: di MATLAB, assignment SELALU menyalin data (copy-on-write), sehingga potongan yang kita ambil berdiri independen dari sumbernya. Materi kita:
- Irisan
A(1:2, 2:3), kolom penuhA(:, 1), baris penuhA(1, :) - Membalik urutan lewat slicing
A(end:-1:1, :) - Semantik copy-on-write dan kemandirian variabel
- Penghapusan baris/kolom dengan
A(2, :) = []
Irisan Persegi: Rentang di Tiap Dimensi #
Aturannya: isi tiap posisi indeks boleh berupa vector — rentang colon, vektor indeks, atau : yang berarti “semua”. Mekanismenya: MATLAB membaca pasangan baris-kolom dari hasil kombinasi kedua vektor tersebut, lalu merakit array baru berukuran (banyaknya indeks baris) × (banyaknya indeks kolom). Bentuk hasil meniru bentuk indeksnya, bukan bentuk sumbernya:
nilaiUjian = [78 84 90; 65 72 88; 92 95 89]; % 3 siswa x 3 mapel
irisan = nilaiUjian(1:2, 2:3);
fprintf('irisan(1,:) : %d %d\n', irisan(1,:));
fprintf('irisan(2,:) : %d %d\n', irisan(2,:));
kolomFisika = nilaiUjian(:, 3);
fprintf('kolomFisika size: %d x %d, isi: %d %d %d\n', ...
size(kolomFisika), kolomFisika);
barisBudi = nilaiUjian(1, :);
fprintf('barisBudi size : %d x %d, isi: %d %d %d\n', ...
size(barisBudi), barisBudi);Output yang Dihasilkan:
irisan(1,:) : 84 90
irisan(2,:) : 72 88
kolomFisika size: 3 x 1, isi: 90 88 89
barisBudi size : 1 x 3, isi: 78 84 90Mari kita bedah baris-baris kode di atas:
- Baris 3 (
nilaiUjian(1:2, 2:3)): indeks baris[1 2]× indeks kolom[2 3]menghasilkan array 2×2 — nilai kolom 2 dan 3 milik Budi dan Siti. Irisan tidak harus persegi:A(1:3, 1:2)sah untuk mengambil tiga baris dua kolom. - Baris 7 (
nilaiUjian(:, 3))::di posisi baris berarti “semua baris” — hasilnya column vector 3×1 (kolom ketiga: nilai Fisika ketiga siswa). Bentuk kolom dipertahankan karenaA(:, 3)meniru bentuk indeks kolomnya (satu kolom). - Baris 10 (
nilaiUjian(1, :)): kebalikannya — row vector 1×3, seluruh nilai milik Budi.
Membalik Urutan lewat Slicing #
Indeks baris end:-1:1 adalah deret menurun dari indeks terakhir ke pertama (kita kenal pola colon negatif dan kata kunci end dari dua bab sebelumnya). Menempatkannya di posisi baris membalik urutan baris array:
nilaiTerbalik = nilaiUjian(end:-1:1, :);
fprintf('baris pertama nilaiTerbalik: %d %d %d\n', nilaiTerbalik(1,:));Output yang Dihasilkan:
baris pertama nilaiTerbalik: 92 95 89Mari kita bedah baris-baris kode di atas:
- Baris 1 (
end:-1:1): deret[3 2 1]— urutan baris dibaca dari bawah ke atas, sementara:di posisi kolom mempertahankan seluruh kolom. Baris pertama hasilnya adalah baris terakhir sumber (nilai Ana:92 95 89). - Varian lain:
nilaiUjian(:, end:-1:1)membalik kolom;nilaiUjian(1:2:end, :)mengambil setiap baris ganjil (indeks 1 dan 3) — pola langkah (stride) untuk men-subsampel data.
Copy-on-write: Salinan yang Berdiri Sendiri #
Inilah perilaku yang membedakan MATLAB dari bahasa berbasis reference. Aturannya: B = A memberikan B salinan penuh nilai A — bukan dua nama untuk satu data. Mekanismenya disebut copy-on-write: MATLAB awalnya mengizinkan A dan B berbagi buffer memori untuk hemat, tetapi begitu salah satunya diubah, mesin secara diam-diam membuat salinan sehingga variabel lain tidak terpengaruh. Dari sisi kita hasilnya sederhana dan mudah dipikirkan: modifikasi pada satu variabel tidak pernah bocor ke variabel lain:
salinan = nilaiUjian;
salinan(1,1) = 999;
fprintf('salinan(1,1) : %d\n', salinan(1,1));
fprintf('nilaiUjian(1,1) tetap: %d\n', nilaiUjian(1,1));Output yang Dihasilkan:
salinan(1,1) : 999
nilaiUjian(1,1) tetap: 78Mari kita bedah baris-baris kode di atas:
- Baris 1 (
salinan = nilaiUjian): dua variabel kini berisi nilai yang sama. Berbeda dengan Python (list berbagi reference) atau NumPy (view berbagi buffer), penugasan MATLAB tidak mengikat dua nama ke satu data yang bisa saling mengubah. - Baris 2 (
salinan(1,1) = 999): perubahan ini menyalin buffer di belakang layar lalu menulis 999 hanya ke salinan miliksalinan. - Baris 3-4 (
fprintf):nilaiUjianterbukti tak tersentuh — nilainya tetap78.
Menghapus Baris dan Kolom dengan [] #
Assignment A(baris, :) = [] menghapus baris tersebut dari array — mekanismenya: MATLAB merakit ulang array tanpa baris yang ditunjuk, lalu mengikat ulang nama variabel ke hasilnya (ukurannya menyusut):
nilaiTanpaSiti = nilaiUjian;
nilaiTanpaSiti(2, :) = [];
fprintf('size nilaiTanpaSiti: %d x %d\n', size(nilaiTanpaSiti));
fprintf('baris 1: %d %d %d\n', nilaiTanpaSiti(1,:));
fprintf('baris 2: %d %d %d\n', nilaiTanpaSiti(2,:));Output yang Dihasilkan:
size nilaiTanpaSiti: 2 x 3
baris 1: 78 84 90
baris 2: 92 95 89Mari kita bedah baris-baris kode di atas:
- Baris 1 (
nilaiTanpaSiti = nilaiUjian): bekerja pada salinan agar matriks asli tetap utuh (semantik copy-on-write bekerja untuk kita). - Baris 2 (
nilaiTanpaSiti(2, :) = []): baris kedua (Siti) dihapus seluruhnya; matriks menyusut dari 3×3 menjadi 2×3. Baris yang tadinya ketiga naik menjadi baris kedua. - Baris 3-5 (
fprintf): verifikasi ukuran dan isi — Ana kini menempati baris 2. - Varian kolom:
nilaiTanpaSiti(:, 2) = []menghapus kolom kedua; hasilnya 2×2. Penghapusan harus utuh per baris atau per kolom —A(2, 3) = []pada matriks 2-D memicu galat karena MATLAB menolak menghapus satu sel dari tengah grid.
| Ekspresi | Makna |
|---|---|
A(1:2, 2:3) | irisan 2×2: baris 1-2, kolom 2-3 |
A(:, 3) | kolom ke-3 penuh (3×1) |
A(1, :) | baris ke-1 penuh (1×n) |
A(end:-1:1, :) | seluruh baris, urutan terbalik |
A(1:2:end, :) | setiap baris berindeks ganjil (langkah 2) |
A(2, :) = [] | hapus baris ke-2 |
A(:, 2) = [] | hapus kolom ke-2 |
Berkas contoh.m pada bagian bawah halaman menjalankan seluruh pola tersebut pada nilaiUjian — termasuk pembuktian bahwa salinan dan nilaiTanpaSiti tidak pernah mengubah data aslinya.
Ringkasan #
Slicing mengambil potongan array lewat vektor indeks di tiap dimensi: rentang colon untuk blok, : untuk dimensi penuh, dan end:-1:1 untuk membalik urutan. Semantik copy-on-write menjamin setiap hasil assignment — salinan maupun irisan — berdiri sendiri, sehingga mengubah satu variabel tidak pernah menular ke variabel lain. Penghapusan baris/kolom dikerjakan dengan = [] dan menyusutkan ukuran array. Berikutnya kita bertemu teknik penyaringan paling khas MATLAB: memakai kondisi logika langsung sebagai indeks.