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:

  • varargin sebagai penampung jumlah input yang bebas
  • penguraian pasangan name-value secara manual
  • varargout untuk 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:

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

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (function rata = rataRataFleksibel(varargin)): satu-satunya parameter adalah varargin — fungsi ini menerima nol input posisional tetap dan sisanya bebas.
  2. Baris 8-9 (abaikanNaN = false; data = [];): nilai awal opsi dan penampung data — keduanya wajib terisi agar error dan mean di bawah selalu punya operand.
  3. 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.
  4. 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:

DeklarasiInput minimalContoh pemanggilan sah
function f(x)1f(10)
function f(x, varargin)1f(10, [1 2], 'A', true)
function f(varargin)0f(), f('A', 1)

Skrip uji uji_rataRataFleksibel.m menguji jumlah vektor bervariasi dan pasangan opsi:

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

text
2 vektor          : 30.0000
4 vektor          : 4.0000
OmitNaN true      : 20.0000
tanpa OmitNaN     : NaN

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

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

Pemanggilan dengan jumlah output berbeda menghasilkan cangkupan berbeda:

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

text
infoData 1 output : rata-rata = 2.5000
infoData 3 output : rata-rata = 2.5000, simpangan = 1.2910, median = 2.5000

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

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

Pemanggilan berikut menggambar sinus berwarna merah, tebal, dan berjudul:

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