Apakah mungkin untuk mendapatkan nilai kembalian 'n' dari suatu fungsi tanpa harus membuat variabel dummy untuk semua n-1
nilai kembalian sebelumnya?
Katakanlah, saya memiliki fungsi berikut di MATLAB:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Sekarang misalkan, saya hanya tertarik pada nilai pengembalian ketiga . Ini dapat dilakukan dengan membuat satu variabel dummy:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Tapi saya pikir ini agak jelek . Menurut saya, Anda mungkin dapat melakukan sesuatu seperti salah satu dari hal-hal berikut, tetapi Anda tidak dapat:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
Adakah cara elegan untuk melakukan ini yang berhasil?
Sejauh ini, solusi terbaik adalah dengan hanya menggunakan variableThatIWillUse
variabel dummy. Ini menyelamatkan saya dari keharusan membuat variabel dummy nyata yang mencemari ruang kerja (atau yang perlu saya bersihkan). Singkatnya: solusinya adalah menggunakan variableThatIWillUse
for setiap nilai pengembalian hingga nilai yang menarik. Kembalikan nilai setelah dapat dengan mudah diabaikan:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Saya masih berpikir ini adalah kode yang sangat jelek, tetapi jika tidak ada cara yang lebih baik, maka saya kira saya akan menerima jawabannya.
sumber
Jawaban:
Ini agak retas tetapi berhasil:
Pertama, fungsi contoh cepat:
Sekarang kuncinya di sini adalah jika Anda menggunakan variabel dua kali di sisi kiri dari tugas ekspresi ganda, tugas sebelumnya dikalahkan oleh tugas selanjutnya:
(edit: hanya untuk memeriksa, saya juga memverifikasi bahwa teknik ini berfungsi
[mu,mu,mu]=polyfit(x,y,n)
jika semua yang Anda pedulikanpolyfit
adalah argumen ke-3)edit: ada pendekatan yang lebih baik; lihat jawaban ManWithSleeve .
sumber
Dengan MATLAB Versi 7.9 (R2009b) Anda dapat menggunakan ~, misalnya,
Perhatikan bahwa
,
ini bukan opsional. Hanya mengetik[~ ~ var]
tidak akan berhasil, dan akan menimbulkan kesalahan.Lihat catatan rilis untuk detailnya.
sumber
not
operator sepertidon't care
ini juga tidak terlalu buruk,
ini bukan opsional. Hanya mengetik tidak[~ ~ var]
akan berhasil, dan akan menimbulkan kesalahan.Jika Anda ingin menggunakan gaya di mana variabel akan dibiarkan jatuh ke keranjang bit, maka alternatif yang masuk akal adalah
ans tentu saja merupakan variabel sampah default untuk matlab, sering ditimpa selama sesi.
Sementara saya menyukai trik baru yang sekarang memungkinkan MATLAB, menggunakan ~ untuk menunjuk variabel pengembalian yang diabaikan, ini adalah masalah kompatibilitas mundur, karena pengguna rilis lama tidak akan dapat menggunakan kode Anda. Saya biasanya menghindari menggunakan hal-hal baru seperti itu sampai setidaknya beberapa rilis MATLAB telah dikeluarkan untuk memastikan akan ada sangat sedikit pengguna yang tersisa dalam kesulitan. Misalnya, bahkan sekarang saya menemukan orang-orang masih menggunakan rilis MATLAB yang cukup lama sehingga mereka tidak dapat menggunakan fungsi anonim.
sumber
Berikut opsi lain yang dapat Anda gunakan. Pertama buat larik sel untuk menangkap semua keluaran (Anda dapat menggunakan fungsi NARGOUT untuk menentukan berapa banyak keluaran yang dikembalikan oleh fungsi tertentu):
Kemudian panggil fungsinya sebagai berikut:
Kemudian hanya menghapus elemen dari suatu yang Anda inginkan, dan menimpa sebuah :
sumber
Saya menulis fungsi kth out:
Anda kemudian dapat menelepon
Anda juga bisa menyelesaikan fungsi seperti
setelah itu Anda gunakan
perhatikan bahwa ada overhead yang terkait dengan penggunaan fungsi anonim seperti ini, dan ini bukan sesuatu yang akan saya lakukan dalam kode yang akan dipanggil ribuan kali.
sumber
Di Matlab 2010a, saya menemukan cara yang rapi untuk melakukan apa yang Anda minta. Ini hanya dengan menggunakan karakter "~" (tanpa tanda kutip tentunya) sebagai variabel dummy Anda (sebanyak yang Anda inginkan saat mengembalikan beberapa parameter). Ini juga berfungsi untuk parameter masukan agar berfungsi jika fungsi dirancang untuk menangani data yang hilang. Saya tidak tahu apakah ini ada di versi sebelumnya, tetapi saya baru saja menemukannya baru-baru ini.
sumber
Anda dapat membuat fungsi (atau fungsi anonim) yang hanya mengembalikan keluaran yang dipilih, mis
Kemudian Anda dapat memanggil fungsi Anda seperti ini:
Atau Anda dapat menetapkan output ke variabel:
sumber
decimatedfftx = select(fft(x,12),1:4:12);
select(func,2)
panggilanfunc(2)
. Saya tidak melihat di mana ini memilih argumen keluaran.Apakah ada alasan untuk tidak menggunakan ans (n), seperti ini:
Memberikan b = 10, dan apakah cara ini tidak kompatibel dengan semua versi Matlab?
Selain itu, ini berfungsi untuk mendapatkan argumen keluaran kedua ketika Anda tidak tahu berapa banyak argumen yang ada! Sedangkan jika Anda melakukan ini:
Maka b = 8000! (Anda harus mengakhirinya dengan ~, untuk menangkap lebih banyak argumen!)
sumber
size(a)
dan[b,c]=size(a)
mengembalikan hal yang berbeda. Fungsi dalam MATLAB mengubah perilaku berdasarkan jumlah argumen keluaran.