Cell array menampung data heterogen, tetapi aksesnya memakai angka: C{2}, C{3} — kita wajib menghafal posisi. Data nyata sering lebih alami dibaca lewat nama: mhs.nama, mhs.umur, mhs.ipk. MATLAB menyediakan structure array (kelas struct) untuk pola itu: setiap record memiliki field bernama yang bisa menyimpan tipe apa pun. Chapter ini membahas pembuatan, array of struct, pengelolaan field, struct bersarang, hingga dynamic field yang menjadikan nama field itu sendiri sebagai data — semuanya diuji dengan data mahasiswa Budi, Siti, dan Andi.
Membuat Struct: Konstruktor dan Assignment Dot #
Aturannya: ada dua jalur resmi membuat struct — fungsi struct('field', nilai, ...) dan assignment dot S.field = nilai pada variabel yang belum ada. Mekanismenya: MATLAB menyimpan daftar nama field sekali per array, lalu setiap elemen menampung isi tiap field; assignment dot pada variabel baru otomatis membuat struct skalar 1×1.
S = struct('nama', 'Budi', 'umur', 21); % lewat konstruktor struct()
Mhs.kota = 'Bandung'; % lewat assignment dot
Mhs.ipk = 3.45;
fprintf('S : %s, %d tahun\n', S.nama, S.umur);
fprintf('Mhs : kota %s, IPK %.2f\n', Mhs.kota, Mhs.ipk);Output yang Dihasilkan:
S : Budi, 21 tahun
Mhs : kota Bandung, IPK 3.45Mari kita bedah baris-baris kode di atas:
- Baris 1 (
struct('nama', 'Budi', ...)): pasangan argumen field-nilai dibaca bergantian — fieldnamaberisichar, fieldumurberisidouble; keduanya bisa berbeda kelas dalam satu struct. - Baris 2-3 (
Mhs.kota = ...): variabelMhsbelum ada, jadi MATLAB menciptakan struct skalar dengan dua field; menambah field ketiga cukup dengan satu assignment dot baru. - Akses field (
S.nama,Mhs.ipk) memakai dot dan mengembalikan isi field apa adanya —charuntuknama,doubleuntukipk.
Array of Struct: Banyak Record, Satu Set Field #
Aturannya: struct adalah array — elemen ke-2 ditulis S(2), dan field-nya diakses S(2).nama. Mekanismenya: semua elemen berbagi daftar field yang sama; field yang belum diisi pada elemen baru otomatis diisi []. Konstruktor struct() punya jalan pintas: bila suatu nilai diberikan sebagai cell 1×N, MATLAB memperluasnya menjadi struct array N elemen.
mahasiswa = struct('nama', {'Budi', 'Siti'}, 'umur', {21, 20}, ...
'ipk', {3.45, 3.80});
mahasiswa(3).nama = 'Andi'; % array bertambah otomatis
mahasiswa(3).umur = 22;
mahasiswa(3).ipk = 3.10;
fprintf('mahasiswa : %d elemen, isstruct = %d\n', ...
numel(mahasiswa), isstruct(mahasiswa));
fprintf('elemen ke-3 : %s, %d tahun, IPK %.2f\n', ...
mahasiswa(3).nama, mahasiswa(3).umur, mahasiswa(3).ipk);
semuaUmur = [mahasiswa.umur];
fprintf('semua umur : %d %d %d\n', semuaUmur);
fprintf('rata-rata IPK : %.2f\n', mean([mahasiswa.ipk]));Output yang Dihasilkan:
mahasiswa : 2 elemen, isstruct = 1
elemen ke-3 : Andi, 22 tahun, IPK 3.10
semua umur : 21 20 22
rata-rata IPK : 3.45Mari kita bedah baris-baris kode di atas:
- Baris 1-2 (
struct('nama', {'Budi','Siti'}, ...)): nilai dalam cell{...}memicu expansion — dua elemen lahir sekaligus, masing-masing berpasangan sesuai indeks cell (Budi-21-3.45,Siti-20-3.80). - Baris 3 (
mahasiswa(3).nama = 'Andi'): assignment ke elemen baru menumbuhkan array dari 2 ke 3 elemen; fieldumurdanipkelemen 3 sementara berisi[]hingga baris 4-5 mengisinya. - Baris 11 (
[mahasiswa.umur]):mahasiswa.umuradalah comma list berisi umur seluruh elemen; kurung siku mengumpulkannya menjadi vektor[21 20 22]siap olah. - Baris 12 (
mean([mahasiswa.ipk])): pola sama pada fieldipk— rata-rata(3.45 + 3.80 + 3.10)/3 = 3.45.
Mengelola Field: fieldnames, isfield, rmfield, orderfields #
Struktur data hidup: field perlu diinspeksi, diuji keberadaannya, dibuang, atau diurutkan ulang. Empat fungsi berikut menjadi kotak peralatannya:
| Fungsi | Tugas | Contoh |
|---|---|---|
fieldnames(S) | daftar nama field (cell of char) | fn = fieldnames(mahasiswa) |
isfield(S, 'x') | uji satu field → logical | isfield(mahasiswa, 'ipk') |
isfield(S, {'a','b'}) | uji banyak field → vektor logical | [1 1 0] |
rmfield(S, 'x') | salinan tanpa field | ringkas = rmfield(S, 'umur') |
orderfields(S) | urutkan field menurut abjad | orderfields(mahasiswa) |
orderfields(S, T) | samakan urutan dengan T | orderfields(S, template) |
fn = fieldnames(mahasiswa);
fprintf('fieldnames : %s %s %s\n', fn{:});
fprintf('isfield ipk : %d\n', isfield(mahasiswa, 'ipk'));
ada = isfield(mahasiswa, {'nama', 'ipk', 'nilai'});
fprintf('isfield list : %d %d %d\n', ada);
ringkas = rmfield(mahasiswa, 'umur');
fprintf('setelah rmfield umur : %d field\n', numel(fieldnames(ringkas)));
tmpl = struct('ipk', 0, 'nama', '', 'umur', 0);
urut = orderfields(mahasiswa, tmpl);
fn2 = fieldnames(urut);
fprintf('orderfields : %s %s %s\n', fn2{:});Output yang Dihasilkan:
fieldnames : nama umur ipk
isfield ipk : 1
isfield list : 1 1 0
setelah rmfield umur : 2 field
orderfields : ipk nama umurMari kita bedah baris-baris kode di atas:
- Baris 1 (
fieldnames(mahasiswa)): urutan field mengikuti urutan pembuatan —nama umur ipk; hasilnya cell 1×3 sehinggafn{:}menyebar sebagai tiga argumenfprintf. - Baris 3-4 (
isfielddengan char dan cell): versi char mengembalikan satu logical; versi cell mengembalikan vektor logical sepanjang daftar —nilaimemang belum ada (0). - Baris 6 (
rmfield(mahasiswa, 'umur')):rmfieldtidak mengubahmahasiswa— fungsi ini mengembalikan salinan; struct asli tetap utuh. - Baris 8 (
orderfields(mahasiswa, tmpl)): field disusun mengikuti urutantmpl(ipk nama umur) — berguna menjaga format konsisten sebelum menyimpan atau mencetak banyak struct.
Struct Nested: Field yang Berisi Struct #
Aturannya: isi sebuah field boleh struct lain — aksesnya cukup menyambung dot: mahasiswa(1).alamat.kota. Mekanismenya: field alamat menampung struct dengan field-nya sendiri (kota, jalan); elemen lain dalam array otomatis mendapat field alamat yang isinya masih array kosong [].
mahasiswa(1).alamat.kota = 'Bandung';
mahasiswa(1).alamat.jalan = 'Merdeka 10';
fprintf('alamat Budi : %s, jalan %s\n', ...
mahasiswa(1).alamat.kota, mahasiswa(1).alamat.jalan);Output yang Dihasilkan:
alamat Budi : Bandung, jalan Merdeka 10Kedua baris assignment menciptakan struct alamat di dalam elemen pertama. Kedalaman bersarang tidak dibatasi — a.b.c.d sah selama tiap lapis adalah struct — tetapi sarang lebih dari dua lapis umumnya menandakan kita butuh memecah data menjadi beberapa variabel.
Dynamic Field: Nama Field dari Variabel #
Aturannya: sintaks S.(namaVar) membuka field yang namanya tersimpan di variabel — nama field menjadi data yang bisa dihitung saat program berjalan. Mekanismenya: MATLAB membaca isi namaVar, lalu mencari field dengan nama itu persis seperti dot biasa.
f = 'umur';
fprintf('mahasiswa(2).(%s) : %d\n', f, mahasiswa(2).(f));Output yang Dihasilkan:
mahasiswa(2).(umur) : 20f bernilai 'umur', sehingga mahasiswa(2).(f) setara mahasiswa(2).umur. Pola ini menempatkan dynamic field sebagai jembatan alami ke loop lintas field: fieldnames menghasilkan daftar nama, lalu S.(fn{i}) mengunjungi tiap field satu per satu.
Dari Struct Array ke Tabel Ringkas #
Laporan akhir biasanya berbentuk tabel, bukan struct. Tanpa table (fitur MATLAB modern), kita merakitnya manual dengan loop — pola yang juga menjadi fondasi saat membangun table sungguhan di Chapter Table:
fprintf('\n%-6s %-5s %s\n', 'nama', 'umur', 'ipk');
for i = 1:numel(mahasiswa)
fprintf('%-6s %-5d %.2f\n', mahasiswa(i).nama, ...
mahasiswa(i).umur, mahasiswa(i).ipk);
endOutput yang Dihasilkan:
nama umur ipk
Budi 21 3.45
Siti 20 3.80
Andi 22 3.10Mari kita bedah baris-baris kode di atas:
- Baris 1 (
fprintfheader): specifier%-6smerata-kiri teks selebar 6 karakter sehingga kolom lurus — teknik format output dari Chapter Format Output. - Baris 2-4 (loop
i = 1:numel): setiap iterasi mengambil satu elemen struct lalu mencetak tiga field-nya;numel(mahasiswa)menjaga loop tetap benar saat array bertambah.
Ringkasan #
Struct dibuat lewat struct('field', nilai) atau assignment dot, dan struct adalah array — S(2).nama mengambil field elemen kedua, cell pada konstruktor memicu expansion menjadi N elemen. Komma list [S.field] mengumpulkan satu field lintas elemen menjadi vektor. Fungsi fieldnames, isfield, rmfield, dan orderfields mengelola skema field; field bisa menampung struct lain (nested), dan S.(namaVar) menjadikan nama field itu sendiri data. Berkas contoh.m menguji seluruh materi dengan data mahasiswa Budi, Siti, dan Andi.