Array numerik yang telah kita kuasai bersifat homogen: setiap elemen bertipe sama dan seluruh array membentuk kotak berukuran seragam. Data nyata sering menolak aturan itu — satu baris record berisi nama (teks), umur (angka), dan daftar nilai ujian (matriks kecil). Memaksakan data seperti itu ke array biasa memicu konversi tipe yang diam-diam merusak nilai. MATLAB menyediakan cell array sebagai jawaban: array yang setiap elemennya adalah sel independen yang mampu menyimpan tipe dan ukuran apa pun. Bab ini memperkenalkan pembuatan cell array, perbedaan mendasar kurung () vs kurung kurawal {}, serta alat mat2cell/cell2mat.
Array Homogen vs Data Heterogen #
Aturan array biasa: kurung siku menggabungkan elemen menjadi satu blok numerik atau teks yang seragam; ketika tipe berbeda dicampur, MATLAB melakukan konversi implisit tanpa protes:
x = [1 'teks'];
fprintf('class(x) : %s\n', class(x));
fprintf('size(x) : %dx%d\n', size(x, 1), size(x, 2));Output yang Dihasilkan:
class(x) : char
size(x) : 1x5Mari kita bedah baris-baris kode di atas:
- Baris 1 (
x = [1 'teks']): angka1dikonversi menjadi karakter bernomor kode 1, lalu digabungkan dengan empat karakterteks— hasilnyachar1×5, bukan gabungan angka dan teks. - Baris 2-3 (
class,size): kelas hasil adalahchardengan lima elemen — angka 1 sudah kehilangan makna numeriknya.
Cell array mengganti aturan seragam dengan aturan sel: setiap elemen adalah sel — wadah berdiri sendiri — sehingga barisan 1×3 yang berisi double, char, dan matriks tetap sah.
Membuat Cell Array #
Pembuatan cell array memakai kurung kurawal {} dengan pemisah yang sama seperti kurung siku: koma atau spasi untuk kolom, titik koma untuk baris:
C = {1, 'teks', [1 2 3]};
fprintf('class(C) : %s\n', class(C));
fprintf('size(C) : %dx%d\n', size(C, 1), size(C, 2));Output yang Dihasilkan:
class(C) : cell
size(C) : 1x3Mengetik nama C tanpa titik koma di Command Window menampilkan ringkasan isi tiap sel dalam gaya tampilan MATLAB:
C =
1×3 cell array
{[1]} {'teks'} {1×3 double}Fungsi cell(2, 2) menyiapkan kerangka kosong — setiap sel berisi array kosong [] bertipe double, siap diisi:
ruang = cell(2, 2);
fprintf('ruang : cell %dx%d, class isi {1,1}: %s\n', ...
size(ruang,1), size(ruang,2), class(ruang{1,1}));Output yang Dihasilkan:
ruang : cell 2x2, class isi {1,1}: doubleMari kita bedah baris-baris kode di atas:
- Baris 1 (
C = {1, 'teks', [1 2 3]}): tiga sel berjajar — sel 1 berisi skalardouble, sel 2 berisichar, sel 3 berisi matriksdouble1×3; seluruh wadah berkelascellberukuran 1×3. - Baris 1 (
ruang = cell(2, 2)): fungsicell()mengalokasikan wadah 2×2; isi sel masih[]sehingga kelasnyadouble— bukti bahwa sel memang wadah netral yang menunggu diisi.
Kurung () vs Kurung Kurawal #
Konsep terpenting bab ini: kurung () dan kurung kurawal {} mengambil dua hal yang berbeda. Kurung () mengambil sel-nya — hasilnya tetap cell array. Kurung kurawal {} mengambil isi sel — hasilnya mengikuti kelas apa pun yang tersimpan di dalam sel. Diagram berikut merangkum perbedaannya:
Analoginya: kurung () menyerahkan kotaknya (hasil masih berupa kotak), kurung kurawal {} membuka kotak dan menyerahkan isinya. Contoh konkret dengan pemeriksaan kelas:
fprintf('C{1} : class %s, nilai %d\n', class(C{1}), C{1});
fprintf('C{2} : class %s, nilai %s\n', class(C{2}), C{2});
v = C{3};
fprintf('C{3} : class %s, nilai %d %d %d\n', class(C{3}), v);
sel = C(2);
fprintf('C(2) : class %s, size %dx%d\n', class(sel), size(sel,1), size(sel,2));Output yang Dihasilkan:
C{1} : class double, nilai 1
C{2} : class char, nilai teks
C{3} : class double, nilai 1 2 3
C(2) : class cell, size 1x1Mari kita bedah baris-baris kode di atas:
- Baris 1-2 (
C{1},C{2}): kurung kurawal membuka sel — kelas yang dilaporkan adalah kelas isi (double,char), dan nilainya langsung bisa dipakai sebagai angka atau teks. - Baris 3 (
v = C{3}): isi sel ketiga (matriks 1×3) disalin ke variabelvsebagaidoublebiasa — setelah keluar dari sel, tidak ada lagi atribut cell. - Baris 6 (
sel = C(2)): kurung menghasilkan cell array 1×1 yang membungkus'teks'— kelasnyacell, bukanchar.
Tertukar-tukar keduanya berujung galat. Ekspresi C(2) + 1 mencoba menjumlahkan cell dengan skalar:
Undefined operator '+' for input arguments of type 'cell'.Menyimpan Matriks Berbeda Ukuran #
Array biasa menuntut blok berbentuk persegi panjang, tetapi sel-sel cell array bebas berukuran apa pun. Satu cell array dapat menampung matriks 2×2 dan vektor baris 1×3 sekaligus:
A = [1 2; 3 4];
B = [10 20 30];
kumpulan = {A, B};
fprintf('kumpulan{1}: %dx%d\n', size(kumpulan{1},1), size(kumpulan{1},2));
fprintf('kumpulan{2}: %dx%d\n', size(kumpulan{2},1), size(kumpulan{2},2));
fprintf('kumpulan{1} baris 1: %d %d\n', kumpulan{1}(1,:));Output yang Dihasilkan:
kumpulan{1}: 2x2
kumpulan{2}: 1x3
kumpulan{1} baris 1: 1 2Mari kita bedah baris-baris kode di atas:
- Baris 3 (
kumpulan = {A, B}): dua matriks berukuran berbeda masuk ke dua sel yang berbeda — tidak ada syarat bentuk seragam. - Baris 7 (
kumpulan{1}(1,:)): pengindeksan berantai —kumpulan{1}membuka sel pertama (matriks 2×2), lalu(1,:)mengiris baris pertama matriks tersebut.
Memecah dan Menggabung: mat2cell dan cell2mat #
Dua fungsi jembatan menghubungkan dunia matriks dan dunia cell array. Fungsi mat2cell(M, pembagianBaris, pembagianKolom) memecah matriks menjadi blok-blok, sedangkan cell2mat menyusun blok-blok kembali menjadi matriks utuh:
M = [1 2 3 4; 5 6 7 8; 9 10 11 12];
blok = mat2cell(M, [2 1], [1 3]);
gabungan = cell2mat(blok);
fprintf('blok : cell %dx%d\n', size(blok,1), size(blok,2));
fprintf('blok{1,1} : %dx%d\n', size(blok{1,1},1), size(blok{1,1},2));
fprintf('blok{1,2} : %dx%d\n', size(blok{1,2},1), size(blok{1,2},2));
fprintf('blok{1,2} b1: %d %d %d\n', blok{1,2}(1,:));
fprintf('gabungan : %dx%d, elemen (3,4) = %d\n', ...
size(gabungan,1), size(gabungan,2), gabungan(3,4));Output yang Dihasilkan:
blok : cell 2x2
blok{1,1} : 2x1
blok{1,2} : 2x3
blok{1,2} b1: 2 3 4
gabungan : 3x4, elemen (3,4) = 12Mari kita bedah baris-baris kode di atas:
- Baris 2 (
mat2cell(M, [2 1], [1 3])): barisMterbagi 2+1 (dua baris pertama, satu baris terakhir) dan kolomnya terbagi 1+3 — hasilnya cell array 2×2 berisi empat blok. - Baris 8 (
blok{1,2}(1,:)): blok kanan-atas berukuran 2×3; baris pertamanya adalah2 3 4— irisan baris 1-2 dengan kolom 2-4 dariM. - Baris 3 (
cell2mat(blok)): kebalikanmat2cell— empat blok disusun kembali menjadi matriks 3×4 yang identik denganM.
Menampilkan Isi Cell Array #
Fungsi disp pada cell array hanya menampilkan ringkasan per sel, sehingga untuk melihat seluruh isi kita memakai celldisp:
celldisp(C)Output yang Dihasilkan (tampilan Command Window MATLAB):
C{1} =
1
C{2} =
teks
C{3} =
1 2 3celldisp menelusuri sel demi sel (kolom demi kolom, seperti pengindeksan array) dan mencetak label C{i} beserta isi lengkapnya — praktis untuk memeriksa cell array kecil.
Ringkasan #
Cell array menyimpan data heterogen: {1, 'teks', [1 2 3]} sah karena setiap sel adalah wadah independen. Kurung () mengambil sel (hasil tetap cell), kurung kurawal {} mengambil isinya (hasil mengikuti kelas isi). Fungsi mat2cell dan cell2mat menjembatani matriks dan cell array, sementara celldisp menampilkan isi seluruh sel. Berkas contoh.m pada bagian bawah halaman menguji seluruh contoh bab ini secara utuh.