Fungsi ringkas pada chapter sebelumnya sudah mengenal input opsional: tanpa faktorSkala, fungsi memakai default 1. Kebutuhan di dunia nyata lebih kaya lagi — diskon default 10% yang kadang diubah pemanggil, batas harga yang jarang dipakai, gaya sapaan yang hampir selalu default. Ada dua generasi solusi di MATLAB: pola nargin klasik yang bekerja di semua versi (dan bisa kita uji), serta arguments block modern sejak R2019b yang mendeklarasikan default, tipe, dan validasi sekaligus. Chapter ini membahas keduanya. Cakupannya:

  • pola nargin klasik dengan nilai default, termasuk trik []
  • arguments block untuk argumen opsional (MATLAB R2019b+)
  • name-value pairs sederhana lewat arguments

Pola nargin Klasik: Default untuk Argumen yang Kosong #

Aturannya: setiap argumen opsional diawasi if nargin < k — bila pemanggil tidak mengirim argumen ke-k, fungsi mengisinya dengan nilai default. Mekanisme di balik layar: argumen yang tidak dikirim membuat parameter itu tidak terisi sama sekali (bukan nol atau kosong), sehingga pengecekan nargin harus dilakukan sebelum parameter dipakai. Berkas diskon.m menerapkan dua argumen opsional berurutan:

matlab
function hargaAkhir = diskon(harga, persenDiskon, hargaBatas)
% diskon Menghitung harga akhir setelah diskon dengan argumen opsional.
%   hargaAkhir = diskon(harga) memakai diskon default 10 persen.
%   hargaAkhir = diskon(harga, persenDiskon) memakai diskon sesuai
%   persenDiskon; kirim [] untuk tetap memakai default.
%   hargaAkhir = diskon(harga, persenDiskon, hargaBatas) membatasi
%   harga akhir agar tidak turun di bawah hargaBatas.

% pola nargin klasik: isi argumen yang tidak dikirim dengan nilai default
if nargin < 2 || isempty(persenDiskon)
    persenDiskon = 10;   % diskon default 10 persen
end
if nargin < 3
    hargaBatas = 0;      % tanpa batas bawah
end

hargaAkhir = harga - (harga * persenDiskon / 100);

if hargaAkhir < hargaBatas
    hargaAkhir = hargaBatas;
end
end

Mari kita bedah baris-baris kode di atas:

  1. Baris 10 (if nargin < 2 || isempty(persenDiskon)): dua kondisi digabung — argumen kedua tidak dikirim, atau dikirim sebagai []; keduanya bermuara ke default 10.
  2. Baris 13 (if nargin < 3): argumen ketiga opsional dengan default 0, artinya tanpa batas bawah harga.
  3. Baris 17 (hargaAkhir = harga - ...): perhitungan inti berjalan setelah semua parameter dijamin terisi.
  4. Baris 19-21 (if hargaAkhir < hargaBatas): batas bawah dipakai hanya bila hasil diskon jatuh di bawahnya.

Skrip uji uji_diskon.m memanggil keempat variasi:

matlab
% tanpa argumen opsional: diskon default 10 persen
h1 = diskon(200000);
fprintf('diskon(200000)             : %d\n', h1);

% satu argumen opsional: diskon 25 persen
h2 = diskon(200000, 25);
fprintf('diskon(200000, 25)         : %d\n', h2);

% dua argumen opsional: batas bawah harga akhir
h3 = diskon(200000, 25, 160000);
fprintf('diskon(200000, 25, 160000) : %d\n', h3);

% kirim [] untuk memakai nilai default argumen kedua
h4 = diskon(200000, []);
fprintf('diskon(200000, [])         : %d\n', h4);

Output yang Dihasilkan:

text
diskon(200000)             : 180000
diskon(200000, 25)         : 150000
diskon(200000, 25, 160000) : 160000
diskon(200000, [])         : 180000

Baris ketiga menunjukkan batas bekerja: diskon 25% dari 200000 seharusnya 150000, tetapi hargaBatas 160000 menahan hasilnya.

arguments Block: Default dan Validasi Deklaratif (R2019b+) #

Sejak R2019b, MATLAB menyediakan arguments block — blok deklarasi khusus di awal fungsi yang menampung ukuran, tipe, validasi, dan default tiap argumen. Versi diskon yang sama dalam gaya modern:

matlab
function hargaAkhir = diskon(harga, persenDiskon, hargaBatas)
% diskon Versi arguments block (MATLAB R2019b+).
    arguments
        harga (1,1) double {mustBeNonnegative}
        persenDiskon (1,1) double {mustBeNonnegative, ...
            mustBeLessThanOrEqual(persenDiskon, 100)} = 10
        hargaBatas (1,1) double {mustBeNonnegative} = 0
    end

    hargaAkhir = harga - (harga * persenDiskon / 100);
    if hargaAkhir < hargaBatas
        hargaAkhir = hargaBatas;
    end
end

Mari kita bedah sintaksisnya:

  1. (arguments ... end): blok ditulis sebelum baris executable pertama; MATLAB memperlakukannya sebagai deklarasi, bukan perintah.
  2. (harga (1,1) double {mustBeNonnegative}): argumen harus skalar 1×1 bertipe double (atau jenis yang bisa dikonversi) dan lolos validator mustBeNonnegative.
  3. (persenDiskon ... = 10): kehadiran nilai default otomatis menjadikan argumen opsional — tidak perlu if nargin sama sekali.
  4. (mustBeLessThanOrEqual(persenDiskon, 100)): validator berparameter boleh menyebut nama argumennya sendiri untuk membandingkan nilai.

Bila validasi gagal, MATLAB menghentikan program dengan pesan yang menyebut posisi dan aturan yang dilanggar, contohnya Error using diskon / Invalid argument at position 1. Value must be nonnegative. — fungsi error() manual tidak lagi diperlukan.

Name-Value Pairs Sederhana dengan arguments #

Argumen posisional berhenti nyaman begitu opsinya banyak — yang mana yang ke-5? Solusinya name-value pairs: pemanggil menyebut nama opsi lalu nilainya. Dalam arguments block, opsi demikian dideklarasikan sebagai field dari satu parameter struct:

matlab
function sapa(nama, opsi)
% sapa Menyapa dengan gaya opsional — name-value (MATLAB R2019b+).
    arguments
        nama (1,1) char
        opsi.Gaya (1,1) char = 'santai'
    end

    if strcmp(opsi.Gaya, 'formal')
        fprintf('Selamat datang, Bapak/Ibu %s.\n', nama);
    else
        fprintf('Halo, %s!\n', nama);
    end
end

Pemanggilan yang sah, termasuk dua gaya penulisan nama:

matlab
sapa('Budi')                    % semua opsi default
sapa('Siti', 'Gaya', 'formal')  % pasangan nama-nilai (R2019b+)
sapa('Siti', Gaya='formal')     % sintaks = yang lebih ringkas (R2021a+)

Sebelum R2021a, pasangan nama-nilai ditulis sebagai teks dan koma; sejak R2021a kedua gaya sah. Mengurai pasangan 'Gaya', 'formal' secara manual tanpa arguments kita bahas tuntas di Chapter Variable Number of Arguments.

nargin vs arguments #

AspekPola narginarguments block
Tersedia sejaksemua versi MATLAB & OctaveR2019b (MATLAB saja)
Nilai defaultif nargin < k manual= nilaiDefault di deklarasi
Validasi tipe/ukuranif + error() manual(dimensi) kelas {validator}
Name-valueparsing manual (ch. berikutnya)opsi.Nama bawaan
Pesan galatkita rumuskan sendiriotomatis, seragam

Keduanya boleh hidup berdampingan: banyak kode produksi memakai arguments untuk API baru sambil mempertahankan nargin untuk kompatibilitas.

Ringkasan #

Argumen opsional bergantung pada dua mekanisme. Pola klasik if nargin < k mengisi parameter yang tidak dikirim dengan nilai default dan berlaku di MATLAB semua versi maupun Octave — tambahkan || isempty(...) agar [] juga berarti default. arguments block (R2019b+, MATLAB-ONLY) mendeklarasikan ukuran, kelas, validator, dan default dalam satu blok, menghasilkan pesan galat otomatis, serta mendukung name-value pairs lewat field opsi.Nama. Pilih arguments untuk kode MATLAB modern; pilih nargin bila kompatibilitas lintas lingkungan penting. Berkas diskon.m dan uji_diskon.m di bagian bawah halaman memuat versi yang teruji.