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.

matlab
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:

text
S   : Budi, 21 tahun
Mhs : kota Bandung, IPK 3.45

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (struct('nama', 'Budi', ...)): pasangan argumen field-nilai dibaca bergantian — field nama berisi char, field umur berisi double; keduanya bisa berbeda kelas dalam satu struct.
  2. Baris 2-3 (Mhs.kota = ...): variabel Mhs belum ada, jadi MATLAB menciptakan struct skalar dengan dua field; menambah field ketiga cukup dengan satu assignment dot baru.
  3. Akses field (S.nama, Mhs.ipk) memakai dot dan mengembalikan isi field apa adanya — char untuk nama, double untuk ipk.

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.

matlab
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:

text
mahasiswa : 2 elemen, isstruct = 1
elemen ke-3 : Andi, 22 tahun, IPK 3.10
semua umur : 21 20 22
rata-rata IPK : 3.45

Mari kita bedah baris-baris kode di atas:

  1. 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).
  2. Baris 3 (mahasiswa(3).nama = 'Andi'): assignment ke elemen baru menumbuhkan array dari 2 ke 3 elemen; field umur dan ipk elemen 3 sementara berisi [] hingga baris 4-5 mengisinya.
  3. Baris 11 ([mahasiswa.umur]): mahasiswa.umur adalah comma list berisi umur seluruh elemen; kurung siku mengumpulkannya menjadi vektor [21 20 22] siap olah.
  4. Baris 12 (mean([mahasiswa.ipk])): pola sama pada field ipk — 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:

FungsiTugasContoh
fieldnames(S)daftar nama field (cell of char)fn = fieldnames(mahasiswa)
isfield(S, 'x')uji satu field → logicalisfield(mahasiswa, 'ipk')
isfield(S, {'a','b'})uji banyak field → vektor logical[1 1 0]
rmfield(S, 'x')salinan tanpa fieldringkas = rmfield(S, 'umur')
orderfields(S)urutkan field menurut abjadorderfields(mahasiswa)
orderfields(S, T)samakan urutan dengan Torderfields(S, template)
matlab
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:

text
fieldnames : nama umur ipk
isfield ipk   : 1
isfield list  : 1 1 0
setelah rmfield umur : 2 field
orderfields  : ipk nama umur

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (fieldnames(mahasiswa)): urutan field mengikuti urutan pembuatan — nama umur ipk; hasilnya cell 1×3 sehingga fn{:} menyebar sebagai tiga argumen fprintf.
  2. Baris 3-4 (isfield dengan char dan cell): versi char mengembalikan satu logical; versi cell mengembalikan vektor logical sepanjang daftar — nilai memang belum ada (0).
  3. Baris 6 (rmfield(mahasiswa, 'umur')): rmfield tidak mengubah mahasiswa — fungsi ini mengembalikan salinan; struct asli tetap utuh.
  4. Baris 8 (orderfields(mahasiswa, tmpl)): field disusun mengikuti urutan tmpl (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 [].

matlab
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:

text
alamat Budi : Bandung, jalan Merdeka 10

Kedua 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.

matlab
f = 'umur';
fprintf('mahasiswa(2).(%s) : %d\n', f, mahasiswa(2).(f));

Output yang Dihasilkan:

text
mahasiswa(2).(umur) : 20

f 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:

matlab
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);
end

Output yang Dihasilkan:

text
nama   umur  ipk
Budi   21    3.45
Siti   20    3.80
Andi   22    3.10

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (fprintf header): specifier %-6s merata-kiri teks selebar 6 karakter sehingga kolom lurus — teknik format output dari Chapter Format Output.
  2. 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.