Keluaran ganda

Menghasilkan beberapa nilai balik sekaligus dengan [a, b] = f(x) serta pengenalan varargout.

Daftar isi

Fungsi MATLAB dapat menghasilkan lebih dari satu nilai balik dalam satu pemanggilan, dan kemampuan ini menjadi ciri yang membedakannya dari banyak bahasa pemrograman lain. Topik ini membahas pendefinisian keluaran ganda pada baris function, cara menangkap seluruh maupun sebagian keluaran, pengabaian keluaran dengan tanda ~, serta varargout untuk fungsi yang jumlah keluarannya berubah mengikuti permintaan pemanggil. Setelah memahami materi ini, perhitungan yang menghasilkan beberapa hasil berpasangan dapat dibungkus menjadi satu fungsi yang utuh.

Dua hasil dari satu perhitungan#

Perhitungan teknik sering menghasilkan beberapa nilai yang lahir bersama dari masukan yang sama, misalnya luas dan keliling dari sepasang panjang dan lebar. Tanpa fungsi, kedua hasil dihitung dengan pernyataan yang berdiri sendiri berikut.

matlab Dua hasil sebagai dua variabel terpisah
panjang = 6;
lebar = 4;
luas = panjang * lebar;
keliling = 2 * (panjang + lebar);
fprintf('luas = %d, keliling = %d\n', luas, keliling);
text Keluaran
luas = 24, keliling = 20

Bentuk seperti itu memadai untuk perhitungan sekali jalan, tetapi pasangan hasil yang selalu lahir bersama lebih tepat dibungkus menjadi satu fungsi. Pembungkusan menjaga kedua rumus tetap berdampingan sehingga tidak ada salah satu yang tertinggal saat perhitungan dipindahkan ke tempat lain. Fungsi juga memberi nama pada keseluruhan perhitungan, dan pemanggil tidak perlu tahu urutan pernyataan di dalamnya.

Mendefinisikan keluaran ganda#

Keluaran ganda dideklarasikan dengan daftar nama di dalam kurung siku pada baris function, dan urutan daftar itu menjadi kesepakatan antara fungsi dan seluruh pemanggilnya. Fungsi berikut mendeklarasikan luas lebih dahulu, kemudian keliling, dan kedua nilai dihitung pada badan fungsi sebelum dikembalikan bersamaan.

matlab ukuran_persegi_panjang.m
function [luas, keliling] = ukuran_persegi_panjang(panjang, lebar)
% UKURAN_PERSEGI_PANJANG menghitung luas dan keliling persegi panjang.
%   [luas, keliling] = UKURAN_PERSEGI_PANJANG(p, l) menghasilkan
%   p*l dan 2*(p+l).
%   Tanpa argumen, contoh 6 x 4 dipakai.

if nargin < 2
  panjang = 6;
  lebar = 4;
end
luas = panjang * lebar;
keliling = 2 * (panjang + lebar);
end

Teks bantuan fungsi itu mencantumkan bentuk pemanggilan lengkap dengan kurung sikunya, sehingga urutan keluaran terbaca dari help tanpa membuka berkas. Urutan keluaran sebaiknya ditetapkan sejak fungsi pertama kali dipakai karena setiap perubahan urutan membatalkan seluruh pemanggilan yang sudah ada. Nilai bawaan pada blok nargin kembali hadir agar berkas fungsi tetap berjalan ketika diuji tanpa argumen.

Menangkap seluruh dan sebagian keluaran#

Pemanggil menangkap seluruh keluaran dengan daftar nama di dalam kurung siku, dan jumlah variabel penampung harus sesuai dengan jumlah keluaran yang dideklarasikan. Pemanggilan berikut menangkap kedua nilai dari ukuran_persegi_panjang.

matlab Menangkap dua keluaran sekaligus
[luas, keliling] = ukuran_persegi_panjang(6, 4)
text Keluaran
luas = 24
keliling = 20

Pemanggil juga boleh meminta lebih sedikit dari yang tersedia. Penampung tunggal menerima keluaran pertama saja, sedangkan tanda ~ pada posisi tertentu mengabaikan keluaran di posisi itu tanpa membuat variabel sementara.

matlab Menangkap sebagian keluaran
luas_saja = ukuran_persegi_panjang(6, 4);
fprintf('luas saja     : %d\n', luas_saja);
[~, keliling_saja] = ukuran_persegi_panjang(6, 4);
fprintf('keliling saja : %d\n', keliling_saja);
text Keluaran
luas saja     : 24
keliling saja : 20

Penampung tunggal bernilai 24 karena luas adalah keluaran pertama, dan pemanggilan tanpa penampung sama sekali menempatkan keluaran pertama pada variabel ans sementara sisanya dibuang. Tanda ~ menjadi cara baku membuang keluaran yang tidak diperlukan, misalnya saat fungsi pustaka mengembalikan nilai status yang tidak dipakai. Jumlah posisi pada daftar penampung tetap harus sesuai dengan deklarasi fungsi, dan tanda ~ mengisi posisi yang sengaja diabaikan.

varargout untuk jumlah keluaran yang berubah#

Fungsi dapat melayani permintaan jumlah keluaran yang berubah dengan mendeklarasikan varargout pada posisi terakhir daftar keluaran. varargout adalah array sel yang diisi fungsi sesuai jumlah keluaran yang diminta pemanggil. Jumlah itu dibaca dari nargout, yakni fungsi yang menghitung banyak keluaran yang diminta pada satu pemanggilan. Fungsi berikut menghasilkan satu sampai tiga ringkasan dari data yang sama.

matlab ringkas_data.m
function varargout = ringkas_data(data)
% RINGKAS_DATA menghasilkan ringkasan dengan jumlah keluaran berubah.
%   terkecil = RINGKAS_DATA(data) menghasilkan nilai terkecil.
%   [terkecil, terbesar] = RINGKAS_DATA(data) menambah nilai terbesar.
%   [terkecil, terbesar, rerata] = RINGKAS_DATA(data) menambah rerata.
%   Tanpa argumen, contoh [10 20 30] dipakai.

if nargin < 1
  data = [10 20 30];
end
varargout{1} = min(data);
if nargout >= 2
  varargout{2} = max(data);
end
if nargout >= 3
  varargout{3} = mean(data);
end
end

Tiga pemanggilan berikut meminta jumlah keluaran yang berbeda dari fungsi yang sama, dan tiap pemanggilan hanya menghitung ringkasan yang benar-benar diminta.

matlab Jumlah keluaran yang berbeda pada varargout
nilai = [10 20 30];
terkecil = ringkas_data(nilai)
[terkecil, terbesar] = ringkas_data(nilai)
[terkecil, terbesar, rerata] = ringkas_data(nilai)
text Keluaran
terkecil = 10
terkecil = 10
terbesar = 30
terkecil = 10
terbesar = 30
rerata = 20

Pemanggilan pertama hanya mengisi varargout pertama sehingga satu penampung cukup, sedangkan pemanggilan ketiga mengisi ketiganya karena nargout bernilai tiga. Pola if nargout >= k menjaga fungsi tetap murah, yaitu perhitungan yang tidak diminta tidak dikerjakan. varargout paling tepat dipakai untuk keluarga keluaran yang tumbuh bertingkat seperti contoh ini, bukan untuk mengembalikan nilai yang tidak berhubungan.

Kesalahan umum#

  • Urutan penampung yang tertukar. Penulisan [keliling, luas] tetap berhasil dijalankan karena kedua nilai berupa bilangan yang wajar, sehingga hasil yang tertukar tidak pernah terdeteksi sebagai error. Baca urutan pada teks bantuan fungsi, lalu susun daftar penampung persis mengikuti deklarasi keluarannya.
  • Pemanggilan tanpa penampung pada fungsi berkeluaran ganda. Hanya keluaran pertama yang masuk ke ans sementara sisanya hilang, dan pemanggil sering mengira seluruh hasil tersimpan. Gunakan daftar kurung siku setiap kali lebih dari satu nilai dibutuhkan.
  • varargout yang tidak terisi sampai nargout. Bila pemanggil meminta tiga keluaran sementara fungsi hanya mengisi elemen pertama dan kedua, pemanggilan berakhir dengan error karena elemen yang diminta tidak tersedia. Isi seluruh elemen varargout hingga bilangan nargout yang diminta pemanggil.

Ringkasan#

  • Daftar keluaran pada function [luas, keliling] = nama(...) mendeklarasikan keluaran ganda, dan urutannya menjadi kesepakatan dengan seluruh pemanggil.
  • Penampung tunggal menerima keluaran pertama, daftar kurung siku menerima semuanya, dan tanda ~ mengabaikan keluaran pada posisi tertentu.
  • varargout menerima jumlah keluaran yang berubah, dan nargout memberi tahu fungsi berapa banyak yang diminta pemanggil.
  • Pola if nargout >= k menjaga perhitungan yang tidak diminta tidak dikerjakan.

Referensi#