Argumen opsional pada chapter sebelumnya mengasumsikan jumlah slot tetap: diskon punya tepat tiga posisi. Fungsi tertentu tidak bisa menjanjikan itu — fungsi rata-rata yang mau menerima dua, tiga, atau sepuluh vektor sekaligus; fungsi plot yang opsinya datang per pasangan nama-nilai. Untuk kebutuhan semacam ini MATLAB menyediakan varargin (variable input arguments) dan varargout (variable output arguments) — dua mekanisme yang mengubah sisa argumen menjadi cell array yang bisa kita telusuri. Cakupan chapter ini:
vararginsebagai penampung jumlah input yang bebas- penguraian pasangan name-value secara manual
varargoutuntuk jumlah output yang bebas- contoh terapan: fungsi plot fleksibel
varargin: Semua Input dalam Satu Cell Array #
Aturannya: bila parameter terakhir pada deklarasi bernama varargin, MATLAB mengemas semua input dari posisi itu dan setelahnya ke dalam satu cell array. Mekanisme di balik layar: fungsi dengan function r = f(x, varargin) menerima minimal satu input (x) dan sebanyak mungkin input tambahan; di dalam fungsi, varargin{1} berisi argumen kedua, varargin{2} argumen ketiga, dan seterusnya. Berkas rataRataFleksibel.m menggabungkan vektor-vektor data dan satu pasangan opsi:
function rata = rataRataFleksibel(varargin)
% rataRataFleksibel Rata-rata gabungan dari sejumlah vektor.
% rata = rataRataFleksibel(v1, v2, ...) menggabungkan seluruh elemen
% vektor yang dikirim, lalu menghitung rata-ratanya.
% Pair name-value 'OmitNaN', true membuang elemen NaN sebelum menghitung.
abaikanNaN = false;
data = [];
% telusuri isi varargin sel demi sel
k = 1;
while k <= numel(varargin)
if ischar(varargin{k}) && strcmpi(varargin{k}, 'OmitNaN')
abaikanNaN = logical(varargin{k+1});
k = k + 2; % lompati nama opsi dan nilainya
else
data = [data, varargin{k}]; % kumpulkan elemen data
k = k + 1;
end
end
if isempty(data)
error('rataRataFleksibel:kosong', ...
'Minimal satu vektor data harus dikirim.');
end
if abaikanNaN
data = data(~isnan(data));
end
rata = mean(data);
endMari kita bedah baris-baris kode di atas:
- Baris 1 (
function rata = rataRataFleksibel(varargin)): satu-satunya parameter adalahvarargin— fungsi ini menerima nol input posisional tetap dan sisanya bebas. - Baris 8-9 (
abaikanNaN = false; data = [];): nilai awal opsi dan penampung data — keduanya wajib terisi agarerrordanmeandi bawah selalu punya operand. - Baris 12-21 (
while k <= numel(varargin)): loop menelusuri sel satu per satu; bila sel berisi char'OmitNaN', sel berikutnya dibaca sebagai nilainya dan indeks melompat dua langkah. - Baris 18 (
data = [data, varargin{k}]): sel numerik dianggap vektor data dan digabung — memanfaatkan concatenation horizontal dari Chapter Concatenation.
Perpaduan argumen tetap dengan varargin justru bentuk yang paling sering dipakai — plotFleksibel(x, y, varargin) di bawah memakainya: dua slot pertama wajib, sisanya bebas. Tabel ringkas berikut merangkum tiga bentuk deklarasi:
| Deklarasi | Input minimal | Contoh pemanggilan sah |
|---|---|---|
function f(x) | 1 | f(10) |
function f(x, varargin) | 1 | f(10, [1 2], 'A', true) |
function f(varargin) | 0 | f(), f('A', 1) |
Skrip uji uji_rataRataFleksibel.m menguji jumlah vektor bervariasi dan pasangan opsi:
% jumlah vektor input bebas
r1 = rataRataFleksibel([10 20 30], [40 50]);
fprintf('2 vektor : %.4f\n', r1);
r2 = rataRataFleksibel([1 2], [3 4], [5 6], [7]);
fprintf('4 vektor : %.4f\n', r2);
% name-value manual: 'OmitNaN' lalu nilainya
r3 = rataRataFleksibel([10 NaN 30], 'OmitNaN', true);
fprintf('OmitNaN true : %.4f\n', r3);
r4 = rataRataFleksibel([10 NaN 30]);
fprintf('tanpa OmitNaN : %g\n', r4);Output yang Dihasilkan:
2 vektor : 30.0000
4 vektor : 4.0000
OmitNaN true : 20.0000
tanpa OmitNaN : NaNBaris terakhir memperlihatkan default: tanpa opsi, satu elemen NaN menjadikan mean menghasilkan NaN — perilaku yang sudah kita kenal dari Chapter Missing Values dan NaN. Fungsi ini memakai strcmpi, versi strcmp yang mengabaikan perbedaan huruf besar-kecil, sehingga 'omitnan' pun dikenal.
varargout: Jumlah Output yang Bebas #
Kebalikan varargin, varargout mengemas output sesuai jumlah yang diminta pemanggil. Mekanismenya: varargout adalah cell array yang kita isi; elemen ke-1 menjadi output pertama, elemen ke-2 output kedua, dan seterusnya — pasangan sempurna untuk nargout. Berkas infoData.m melayani tiga tingkat permintaan:
function varargout = infoData(data)
% infoData Statistik vektor dengan jumlah output bebas.
% a = infoData(data) mengembalikan rata-rata.
% [a, b] = infoData(data) menambah simpangan baku.
% [a, b, c] = infoData(data) menambah median.
% varargout diisi sesuai jumlah output yang diminta pemanggil.
varargout{1} = mean(data);
if nargout >= 2
varargout{2} = std(data);
end
if nargout >= 3
varargout{3} = median(data);
end
endPemanggilan dengan jumlah output berbeda menghasilkan cangkupan berbeda:
a = infoData([1 2 3 4]);
fprintf('infoData 1 output : rata-rata = %.4f\n', a);
[a, b, c] = infoData([1 2 3 4]);
fprintf('infoData 3 output : rata-rata = %.4f, simpangan = %.4f, median = %.4f\n', ...
a, b, c);Output yang Dihasilkan:
infoData 1 output : rata-rata = 2.5000
infoData 3 output : rata-rata = 2.5000, simpangan = 1.2910, median = 2.5000Contoh Terapan: Fungsi Plot Fleksibel #
Pola varargin + penguraian name-value adalah resep klasik fungsi plot yang nyaman dipakai. Berkas plotFleksibel.m menerima x, y, lalu pasangan 'Warna', 'Judul', 'Lebar' dalam urutan apa pun:
function plotFleksibel(x, y, varargin)
% plotFleksibel Plot garis dengan opsi name-value manual lewat varargin.
% plotFleksibel(x, y) menggambar garis dari pasangan (x, y).
% plotFleksibel(x, y, 'Warna', w) mengatur warna garis (default 'b').
% plotFleksibel(x, y, 'Judul', j) memberi judul figure.
% plotFleksibel(x, y, 'Lebar', l) mengatur ketebalan garis (default 1).
warna = 'b';
judul = '';
lebar = 1;
% telusuri pasangan nama-nilai di dalam varargin
k = 1;
while k <= numel(varargin)
nama = varargin{k};
nilai = varargin{k+1};
switch lower(nama)
case 'warna'
warna = nilai;
case 'judul'
judul = nilai;
case 'lebar'
lebar = nilai;
otherwise
error('plotFleksibel:opsiTidakDikenal', ...
'Opsi tidak dikenal: %s', nama);
end
k = k + 2; % setiap opsi memakai dua sel: nama lalu nilai
end
plot(x, y, 'Color', warna, 'LineWidth', lebar);
title(judul);
xlabel('x');
ylabel('y');
endPemanggilan berikut menggambar sinus berwarna merah, tebal, dan berjudul:
x = 0:0.1:2*pi;
plotFleksibel(x, sin(x), 'Warna', 'r', 'Judul', 'Grafik Sinus', 'Lebar', 2);Kode tersebut membuat figure berisi kurva sin(x) merah dengan ketebalan 2 dan judul Grafik Sinus — pola yang membuat API buatan kita terasa seperti fungsi bawaan MATLAB yang menerima 'Color', 'LineWidth' semacam itu.
Ringkasan #
varargin menampung jumlah input bebas dalam satu cell array — telusuri isinya dengan while dan numel, lompat dua indeks untuk pasangan nama-nilai, dan gabungkan sel data dengan concatenation. varargout bekerja pada arah sebaliknya: cell array yang elemen-elemennya menjadi output ke-1, ke-2, dan seterusnya, biasanya diisi mengikuti nargout. Kombinasi keduanya memungkinkan API seperti rataRataFleksibel(v1, v2, ..., 'OmitNaN', true) dan plotFleksibel(x, y, 'Warna', 'r') yang fleksibel namun tetap punya default dan galat yang jelas. Berkas rataRataFleksibel.m, infoData.m, plotFleksibel.m, dan uji_rataRataFleksibel.m di bagian bawah halaman memuat implementasi lengkapnya.