Fungsi statistikSederhana pada chapter sebelumnya menerima maksimal satu input dan mengembalikan dua output. Fungsi di dunia nyata sering lebih ramai dari itu: satu fungsi pemrosesan data bisa menerima data, skala, dan batas sekaligus, lalu mengembalikan rata-rata, simpangan, dan jumlah elemen sekaligus. Pertanyaannya: bolehkah pemanggil hanya mengambil sebagian? Dan bagaimana fungsi tahu berapa argumen yang benar-benar dikirim? Jawabannya ada pada dua variabel bawaan — nargin dan nargout — yang membaca niat pemanggil dari dalam fungsi. Cakupan chapter ini:
- deklarasi dan pemanggilan fungsi multi-input multi-output
- pembacaan
nargin/nargoutdi dalam badan fungsi - pola output opsional
if nargout > 1dan default inputif nargin < 2
Deklarasi Multi-Input Multi-Output #
Aturan sintaksnya: semua input ditulis dalam kurung, dipisah koma; semua output ditulis dalam kurung siku, dipisah koma. Mekanisme di balik layar: jumlah input yang dikirim dan output yang diminta tidak harus sama dengan jumlah deklarasi — pengirim boleh lebih sedikit, dan nargin/nargout memberi tahu fungsi angka aktualnya. Berkas ringkas.m memanfaatkan keduanya: input kedua opsional (default 1), dan dua output terakhir hanya dihitung bila diminta:
function [rataRata, simpangan, n] = ringkas(data, faktorSkala)
% ringkas Ringkasan statistik dengan jumlah input/output fleksibel.
% rataRata = ringkas(data) menghitung rata-rata data.
% [rataRata, simpangan] = ringkas(data) juga menghitung simpangan baku.
% [rataRata, simpangan, n] = ringkas(data, faktorSkala) mengalikan data
% dengan faktorSkala sebelum menghitung ketiga statistik.
if nargin < 2
faktorSkala = 1; % nilai default input kedua
end
dataSkala = data * faktorSkala;
rataRata = mean(dataSkala);
if nargout > 1
simpangan = std(dataSkala); % hanya dihitung bila diminta
end
if nargout > 2
n = numel(dataSkala);
end
endMari kita bedah baris-baris kode di atas:
- Baris 1 (
function [rataRata, simpangan, n] = ringkas(data, faktorSkala)): tiga output dan dua input dideklarasikan — urutan bebas, tetapi kebiasaan kita menaruh output utama di posisi pertama. - Baris 8-10 (
if nargin < 2 ...): bila pemanggil hanya mengirimdata, variabelfaktorSkalabelum terisi; cabang ini mengisinya dengan default1. - Baris 13 (
rataRata = mean(dataSkala);): output pertama selalu diisi — pemanggil pasti memintanya. - Baris 15-20 (
if nargout > 1 ... if nargout > 2): output kedua dan ketiga hanya diisi bila diminta — pola output opsional yang juga dipakai contoh resmi MATLABsubtract.
Kebiasaan penataannya: argumen wajib selalu di depan, argumen opsional di belakang — dokumentasi MATLAB menganjurkan urutan itu agar pemanggil tidak perlu mengisi slot yang tidak dipakai. Dengan urutan data, faktorSkala, pemanggil cukup menulis ringkas(data); membalik urutannya memaksa pemanggil mengirim [] untuk argumen pertama hanya demi mengisi argumen kedua. Konvensi yang sama berlaku untuk output: letakkan output utama (yang paling sering dibutuhkan) di posisi pertama, sehingga pemanggil sepintas cukup menangkap satu nilai.
Membaca nargin dan nargout dari Dalam Fungsi #
Untuk melihat langsung angka yang diterima sebuah fungsi, berkas laporanArgs.m mendeklarasikan tiga input dan dua output, lalu mengembalikan nargin dan nargout sebagai hasilnya:
function [ni, no] = laporanArgs(x1, x2, x3)
% laporanArgs Melaporkan nargin dan nargout pemanggilan aktif.
% [ni, no] = laporanArgs(x1) atau laporanArgs(x1, x2) atau
% laporanArgs(x1, x2, x3) mengembalikan jumlah input yang dikirim
% pemanggil (ni) dan jumlah output yang diminta pemanggil (no).
% Input x1..x3 sengaja tidak dipakai isi fungsinya.
ni = nargin;
no = nargout;
endSkrip uji memanggilnya dengan dua variasi:
% nilai nargin/nargout yang diterima fungsi saat dipanggil
[ni, no] = laporanArgs(10);
fprintf('laporanArgs(10) : nargin = %d, nargout = %d\n', ni, no);
[ni, no] = laporanArgs(10, 20, 30);
fprintf('laporanArgs(10, 20, 30) : nargin = %d, nargout = %d\n', ni, no);Output yang Dihasilkan:
laporanArgs(10) : nargin = 1, nargout = 2
laporanArgs(10, 20, 30) : nargin = 3, nargout = 2Pemanggilan laporanArgs(10) mengirim satu input meskipun deklarasi menyediakan tiga slot — x2 dan x3 hanya tidak terisi, dan itu sah selama isi fungsi tidak menyentuhnya. Sebaliknya, mengirim lebih banyak input daripada deklarasi menghasilkan galat Too many input arguments.
Pola Output Opsional: Hitung Hanya yang Diminta #
Pola if nargout > 1 punya dua manfaat. Pertama, pemanggil yang hanya butuh rata-rata tidak membayar biaya menghitung std. Kedua, fungsi tetap satu nama untuk semua kebutuhan — tidak perlu ringkasRingan dan ringkasLengkap. Skrip uji memperagakan tiga tingkat permintaan:
data = [70 85 90 60 78];
% satu output: hanya rata-rata yang dihitung
m = ringkas(data);
fprintf('1 output : rata-rata = %.4f\n', m);
% dua output: simpangan ikut dihitung (nargout > 1)
[m, s] = ringkas(data);
fprintf('2 output : rata-rata = %.4f, simpangan = %.4f\n', m, s);
% tiga output + input kedua (faktorSkala)
[m2, s2, n2] = ringkas(data, 1.1);
fprintf('3 output : rata-rata = %.4f, simpangan = %.4f, n = %d\n', ...
m2, s2, n2);Output yang Dihasilkan:
1 output : rata-rata = 76.6000
2 output : rata-rata = 76.6000, simpangan = 11.9499
3 output : rata-rata = 84.2600, simpangan = 13.1449, n = 5Perhatikan baris ketiga: input 1.1 menskalakan data menjadi [77 93.5 99 66 85.8] sebelum dihitung, sehingga seluruh statistiknya bergeser — input opsional mengubah isi perhitungan, output opsional mengubah cangkupannya. Prinsip ini adalah alasan fungsi bawaan MATLAB nyaman dipakai: mean(x) mengembalikan satu nilai, sementara [total, jumlah] = mean(x, 2) meminta rincian lebih — satu fungsi, beberapa tingkat layanan, tanpa nama ganda.
Ringkasan #
Deklarasi multi-input multi-output hanyalah daftar nama dalam tanda kurung dan kurung siku; kelenturan sebenarnya datang dari nargin dan nargout — dua angka yang MATLAB setel sesuai pemanggilan aktif. Pola if nargin < 2 mengisi input opsional dengan nilai default, dan pola if nargout > 1 menunda penghitungan output tambahan sampai benar-benar diminta — hemat sekaligus menjaga satu nama fungsi untuk semua tingkat kebutuhan. Aturan pengaman: kirim tidak lebih banyak dari deklarasi, dan isi setiap output yang diminta pada semua jalur. Berkas ringkas.m, laporanArgs.m, dan uji_ringkas.m di bagian bawah halaman memuat contoh lengkap yang sudah teruji.