Fungsi tidak selalu berdiri sebagai satu berkas terpisah karena MATLAB menyediakan dua bentuk yang lebih ringkas, yaitu fungsi anonim dan fungsi lokal. Fungsi anonim didefinisikan dalam satu baris tanpa berkas, sedangkan fungsi lokal menjadi pembantu privat di dalam berkas fungsi lain. Topik ini membahas pembuatan fungsi anonim dengan operator @, penangkapan nilai saat fungsi itu dibuat, pengoperan handle fungsi sebagai argumen, penyusunan fungsi lokal, serta batas pandang fungsi lokal dari luar berkasnya. Kedua bentuk ini melengkapi berkas fungsi biasa untuk program yang strukturnya lebih rapat.
Fungsi anonim tanpa berkas#
Fungsi anonim didefinisikan dengan operator @ yang diikuti daftar argumen di dalam kurung dan satu ekspresi sebagai badannya, misalnya @(x) x.^2 + 1. Hasil operator @ adalah handle fungsi, yaitu rujukan yang dapat disimpan pada variabel dan dipanggil seperti fungsi biasa. Fungsi semacam ini cocok untuk rumus pendek yang hanya dipakai pada satu bagian program.
f = @(x) x.^2 + 1;
f(5)
f(0:3)ans = 26
ans =
1 2 5 10Pemanggilan melalui handle memakai bentuk yang sama dengan pemanggilan fungsi biasa, dan karena badannya memakai .^, handle ini melayani skalar maupun array. Daftar argumen boleh memuat lebih dari satu nama, dan jumlah argumen pemanggilan harus sesuai dengan daftar itu.
g = @(a, b) a + b;
g(2, 3)ans = 5Nilai yang ditangkap saat fungsi dibuat#
Ekspresi fungsi anonim boleh menyebut variabel yang sedang hidup di workspace, dan nilai variabel itu ditangkap pada saat fungsi dibuat. Penangkapan berlangsung sekali, sehingga perubahan variabel asli setelahnya tidak ikut ke dalam fungsi.
k = 3;
h = @(x) k * x;
h(2)
k = 10;
h(2)ans = 6
ans = 6Pemanggilan kedua tetap menghasilkan enam walaupun k sudah bernilai sepuluh, karena handle h membawa salinan nilai k yang bernilai tiga sejak dibuat. Perilaku ini menjaga fungsi anonim bersifat tetap terhadap perubahan workspace, sehingga hasilnya tidak berubah ketika variabel dengan nama yang sama diperbarui di tempat lain. Bila rumus memang harus mengikuti nilai terbaru, handle perlu dibuat ulang setelah variabelnya diperbarui.
Handle fungsi sebagai argumen#
Handle dapat dioper sebagai argumen ke fungsi lain. Fungsi penerima menyimpan handle itu pada parameter, lalu memanggil parameter tersebut seperti fungsi biasa. Fungsi berikut menerima sebuah handle beserta data, lalu mengevaluasi handle itu pada seluruh data.
function y = terapkan(f, x)
% TERAPKAN mengevaluasi sebuah fungsi pada sekumpulan data.
% y = TERAPKAN(f, x) sama dengan f(x).
% Tanpa argumen, contoh @(x) x.^2 + 1 dan 0:3 dipakai.
if nargin < 2
f = @(x) x.^2 + 1;
x = 0:3;
end
y = f(x);
endPemanggilan berikut membuat handle lalu mengopernya bersama data, dan terapkan mengeksekusinya tanpa pernah tahu rumus apa yang dibawa handle itu.
f = @(x) x.^2 + 1;
terapkan(f, 0:3)ans =
1 2 5 10Pola fungsi yang menerima fungsi lain adalah dasar banyak kelengkapan numerik MATLAB, misalnya fminsearch yang mencari minimum dan integral yang menghitung nilai integral. Keduanya menerima rumus dari pengguna berupa handle. Dengan pola yang sama, program sendiri dapat menyediakan mesin umum yang perilakunya ditentukan pemanggilnya. Handle juga dapat disimpan pada struktur atau array, sehingga pilihan fungsi dapat diatur sebagai data.
Fungsi lokal dalam satu berkas#
Berkas fungsi dapat memuat lebih dari satu definisi, yaitu satu fungsi utama di bagian atas dan fungsi lokal sesudahnya. Fungsi utama menjadi wajah berkas, yakni bagian yang dipanggil dari luar. Fungsi lokal adalah pembantu yang hanya dapat dipanggil dari dalam berkas itu, sehingga detail perhitungan dapat dipisah tanpa menambah berkas baru.
function statistik(data)
% STATISTIK mencetak ringkasan satu baris untuk sekumpulan data.
% STATISTIK(data) menampilkan banyak data, rerata, dan nilai terbesar.
% Tanpa argumen, contoh [10 20 30] dipakai.
if nargin < 1
data = [10 20 30];
end
fprintf('banyak data : %d\n', numel(data));
fprintf('rerata : %.2f\n', rerata_kecil(data));
fprintf('terbesar : %.2f\n', max(data));
end
function m = rerata_kecil(data)
% RERATA_KECIL pembantu lokal untuk STATISTIK.
% Fungsi ini tidak terlihat dari luar berkas statistik.m.
m = mean(data);
endFungsi utama statistik mencetak laporan tiga baris, dan perhitungan reratanya diserahkan kepada rerata_kecil sebagai fungsi lokal. Pemanggilan berikut membuktikan laporan itu berjalan lengkap.
statistik([2 4 6])banyak data : 3
rerata : 4.00
terbesar : 6.00Pembagian seperti ini menjaga berkas tetap terbaca ketika badan fungsi utama memanjang, karena tiap langkah bernama memiliki tempatnya sendiri. Fungsi lokal juga menjadi tempat perhitungan yang dipakai berulang di dalam satu berkas tanpa mengekspos namanya ke luar. Sebagai patokan, satu berkas layak memuat beberapa fungsi lokal selama semuanya melayani fungsi utamanya, dan berkas yang menampung dua kepentingan yang berbeda sebaiknya dipecah.
Fungsi lokal tidak terlihat dari luar berkasnya#
Batas pandang fungsi lokal dapat diuji dengan skrip yang sengaja mencoba memanggilnya dari berkas lain. Berkas berikut memanggil rerata_kecil di dalam try/catch sehingga error yang muncul tertangkap dan pesannya tercetak alih-alih menghentikan skrip.
% uji_lokal.m: mencoba memanggil fungsi lokal dari luar berkas statistik.m
try
rerata_kecil([2 4 6]);
catch e
fprintf('error: %s\n', e.message);
endUji ini memerlukan proses baru karena yang diuji adalah pandangan dari luar berkas statistik.m. Untuk itu, uji_lokal.m dijalankan dari terminal di folder topik.
# jalankan uji_lokal.m sebagai proses baru dari folder topik
octave --quiet uji_lokal.m 2>/dev/nullerror: 'rerata_kecil' undefined near line 3, column 3Pesan itu menyatakan rerata_kecil tidak dikenal sebagai fungsi yang dapat dipanggil, walaupun definisinya tertulis lengkap di dalam statistik.m. Saat berkas fungsi dimuat, hanya fungsi utamanya yang terdaftar sebagai nama yang dapat dipanggil dari luar, dan fungsi lokal tetap menjadi bagian dalam berkas itu. Bila sebuah perhitungan memang perlu dipakai dari luar, sediakan sebagai keluaran fungsi utama atau pindahkan menjadi berkas fungsi tersendiri.
Kesalahan umum#
- Memanggil fungsi lokal dari luar berkasnya. Pemanggilan berakhir dengan error karena hanya fungsi utama yang terdaftar saat berkas dimuat. Bila hasil fungsi lokal memang dibutuhkan di luar, kembalikan nilainya melalui keluaran fungsi utama atau pindahkan definisinya ke berkas sendiri.
- Menulis rumus tanpa daftar argumen. Pernyataan
f = x.^2 + 1langsung mengevaluasi ruas kanan sehingga error x tidak didefinisikan muncul saat penugasan, bukan saat pemanggilan. Gunakan operator @ dengan daftar argumennya, yaituf = @(x) x.^2 + 1. - Mengharapkan fungsi anonim membaca nilai variabel terbaru. Nilai variabel ditangkap saat fungsi dibuat, sehingga perubahan variabel asli tidak memengaruhi handle yang sudah ada. Buat ulang handle setelah variabelnya berubah bila rumus memang harus mengikuti nilai terbaru.
Ringkasan#
- Fungsi anonim didefinisikan satu baris dengan
@(argumen) ekspresidan menghasilkan handle yang dapat disimpan serta dipanggil. - Nilai variabel yang disebut pada ekspresi ditangkap saat fungsi dibuat, dan perubahan variabel asli setelahnya tidak diikuti.
- Handle dapat dioper sebagai argumen, dan fungsi penerima memanggilnya tanpa mengetahui rumus yang dibawanya.
- Fungsi lokal didefinisikan setelah fungsi utama dalam satu berkas dan hanya dapat dipanggil dari dalam berkas itu.
Referensi#
- Types of Functions — MathWorks — Peta resmi jenis fungsi MATLAB yang memuat fungsi lokal dan fungsi anonim.
- Anonymous Functions — MathWorks — Panduan resmi penulisan fungsi anonim dengan operator @.
- Create Function Handle — MathWorks — Penjelasan resmi pembuatan handle fungsi beserta pemanggilannya.