Pengambilan satu elemen sering kali tidak cukup, karena pekerjaan data lazim memerlukan satu baris, satu kolom, atau blok beberapa baris dan kolom sekaligus. Topik ini membahas slicing matriks dengan operator titik dua: membentuk rentang indeks seperti 1:2:9, menggunakan rentang itu untuk mengiris baris dan kolom, menugaskan nilai baru ke submatriks, serta mengenali salah kaprah indeks nol yang berasal dari kebiasaan bahasa lain. Setelah menguasai materi ini, bagian mana pun dari sebuah tabel data dapat diambil atau diganti dalam satu pernyataan.
Rentang dengan operator titik dua#
Operator titik dua membentuk vektor baris berisi deret bilangan berjarak tetap. Bentuk umumnya a:b:c menghasilkan deret yang dimulai dari a, naik sebesar b, dan berhenti sebelum melebihi c. Bentuk dua argumen a:c menggunakan langkah bawaan satu.
r = 1:2:9
s = 1:5
turun = 10:-2:2r =
1 3 5 7 9
s =
1 2 3 4 5
turun =
10 8 6 4 2Rentang 1:2:9 menghasilkan 1, 3, 5, 7, dan 9 karena bilangan berikutnya, yaitu 11, sudah melebihi batas 9. Rentang 1:5 menghasilkan lima bilangan berurutan dengan langkah bawaan satu, dan langkah negatif menghasilkan deret menurun seperti pada turun. Deret seperti ini berdiri sendiri sebagai vektor, tetapi peran utamanya adalah sebagai daftar indeks pada pengirisan, sebagaimana digunakan pada bagian berikutnya. Perlu dibedakan dari linspace yang menetapkan jumlah titik, sedangkan operator titik dua menetapkan besar langkah.
Membaca sebuah rentang dapat dilatih dengan tiga pertanyaan: bilangan apa yang menjadi awal, berapa besar langkahnya, dan bilangan apa yang pertama kali melebihi batas sehingga tidak ikut terbentuk. Latihan ini menjauhkan kekeliruan yang paling sering terjadi, yakni menganggap ujung rentang selalu termasuk. Pada data pengukuran, rentang ganjil seperti 1:2:9 menjadi cara alami untuk memilih setiap titik kedua dari sebuah deret observasi. Rekaman per menit, misalnya, dapat diiris menjadi rekaman setiap dua menit agar analisis tetap ringkas.
Mengiris baris dan kolom#
Pengirisan dilakukan dengan menaruh rentang, titik dua tunggal, atau kata kunci end pada posisi indeks. Titik dua tunggal berarti seluruh elemen pada dimensi itu, sedangkan kombinasi rentang mengambil blok baris dan kolom yang bersesuaian.
A = [10 20 30 40; 50 60 70 80; 90 100 110 120];
baris12 = A(1:2, 2:end)
kolom3 = A(:, 3)
baris2 = A(2, :)baris12 =
20 30 40
60 70 80
kolom3 =
30
70
110
baris2 =
50 60 70 80Pernyataan A(1:2, 2:end) mengambil baris pertama sampai kedua dan kolom kedua sampai terakhir, sehingga menghasilkan matriks . Pernyataan A(:, 3) mengambil seluruh baris pada kolom ketiga dan menghasilkan vektor kolom , sedangkan A(2, :) mengambil seluruh kolom pada baris kedua dan menghasilkan vektor baris . Perhatikan bahwa orientasi hasil mengikuti dimensi yang diambil: memotong sepanjang kolom menghasilkan vektor kolom, dan memotong sepanjang baris menghasilkan vektor baris.
Semua bentuk indeks yang telah dipelajari dapat dikombinasikan pada satu pasangan kurung. Rentang boleh berdiri di posisi baris, di posisi kolom, atau keduanya sekaligus, dan kata kunci end dapat menjadi ujung dari sebuah rentang. Sebagai contoh, A(2:end, 1:2:4) mengambil baris kedua sampai terakhir serta kolom pertama dan ketiga pada matriks dengan empat kolom. Pola seperti ini sering digunakan untuk memisahkan beberapa kanal pengukuran dari satu tabel gabungan. Hasil pengirisan selalu berupa array baru yang menempati memori sendiri, sehingga mengubah hasilnya tidak mengubah matriks asalnya.
Menugaskan nilai ke submatriks#
Posisi yang sama dapat digunakan sebagai tujuan penugasan. Nilai di ruas kanan dituliskan dalam bentuk yang ukurannya cocok dengan bagian yang diganti, lalu elemen pada bagian itu tertimpa tanpa mengubah sisa matriks.
B = [10 20 30 40; 50 60 70 80; 90 100 110 120];
B(2, :) = [5 6 7 8]
B(1:2, 1:2) = [0 0; 0 0]B =
10 20 30 40
5 6 7 8
90 100 110 120
B =
0 0 30 40
0 0 7 8
90 100 110 120Penugasan pertama mengganti seluruh baris kedua dengan vektor baris baru yang panjangnya sama, empat kolom. Penugasan kedua mengganti blok di sudut kiri atas dengan matriks nol , dan hanya blok itu yang berubah sedangkan baris ketiga tetap utuh. Ukuran ruas kanan harus sama persis dengan ukuran bagian yang diganti, karena ketidakcocokan dimensi pada penugasan ditolak dengan error sebagaimana dicontohkan pada bagian kesalahan umum.
Skrip berikut merangkum pembacaan dan penugasan bagian matriks dalam satu berkas utuh.
% slicing.m: mengekstrak submatriks dan menugaskan nilai ke bagian matriks
A = [10 20 30 40; 50 60 70 80; 90 100 110 120];
fprintf('dua baris pertama, kolom ke-2 sampai terakhir:\n');
disp(A(1:2, 2:end));
fprintf('kolom ke-3:\n');
disp(A(:, 3));
fprintf('baris terakhir:\n');
disp(A(end, :));
A(2, :) = [5 6 7 8];
fprintf('setelah baris ke-2 diganti:\n');
disp(A);dua baris pertama, kolom ke-2 sampai terakhir:
20 30 40
60 70 80
kolom ke-3:
30
70
110
baris terakhir:
90 100 110 120
setelah baris ke-2 diganti:
10 20 30 40
5 6 7 8
90 100 110 120Kesalahan umum#
- Indeks nol dari kebiasaan bahasa lain. Bahasa seperti C dan Python memulai indeks dari nol, tetapi MATLAB berbasis satu sehingga penulisan indeks nol selalu ditolak. Pesan errornya berbunyi sebagai berikut, dan pola try/catch digunakan agar skrip contoh tetap selesai.
B = [10 20 30; 40 50 60];
try
B(0, 1)
catch e
disp(e.message)
endB(0,_): subscripts must be either integers 1 to (2^63)-1 or logicals- Ukuran penugasan yang tidak cocok. Ruas kanan penugasan submatriks harus berukuran sama dengan bagian yang diganti. Matriks tidak dapat menempati blok , dan error berikut muncul ketika hal itu dicoba.
try
B(1:2, 1:2) = zeros(3)
catch e
disp(e.message)
end=: nonconformant arguments (op1 is 2x2, op2 is 3x3)- Kekeliruan besar langkah dan batas rentang. Rentang 1:2:9 berhenti pada 9 karena bilangan berikutnya melebihi batas, sedangkan rentang 1:2:10 menghasilkan deret yang sama. Sifat ini lazim mengejutkan pemula yang menganggap ujung rentang selalu termasuk, padahal hanya bilangan yang tidak melebihi batas yang dibentuk. Ketika ujung rentang penting bagi makna data, periksa deretnya lebih dahulu dengan menampilkannya sebelum digunakan sebagai indeks.
Ringkasan#
- Operator titik dua a:b:c membentuk deret berlangkah tetap yang berhenti sebelum melebihi batas, dan a:c menggunakan langkah bawaan satu.
- Rentang pada posisi indeks mengiris blok, titik dua tunggal mengambil seluruh dimensi, dan end menandai ujung dimensi.
- Penugasan ke submatriks menuntut ukuran ruas kanan yang sama persis dengan bagian yang diganti.
- MATLAB berbasis satu sehingga indeks nol selalu ditolak dengan pesan error.
Referensi#
- Array Indexing — MathWorks — Panduan resmi pengindeksan dan pengambilan bagian array.
- Colon, : — MathWorks — Rujukan operator titik dua untuk pembentukan rentang dan pengirisan.