Apakah mungkin untuk memiliki argumen default di Matlab? Misalnya, di sini:
function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))
Saya ingin solusi yang sebenarnya menjadi argumen opsional untuk fungsi gelombang. Jika memungkinkan, adakah yang bisa menunjukkan cara yang tepat untuk melakukan ini? Saat ini, saya mencoba apa yang saya posting di atas dan saya dapatkan:
??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.
if nargin
statemens), mudah dirawat, kompak, dan fleksibel.Cara lain yang sedikit kurang mencurigakan adalah
sumber
Ya, mungkin sangat menyenangkan memiliki kemampuan untuk melakukan seperti yang Anda tulis. Tetapi itu tidak mungkin di MATLAB. Banyak utilitas saya yang memungkinkan default untuk argumen cenderung ditulis dengan pemeriksaan eksplisit di awal seperti ini:
Oke, jadi saya biasanya akan menerapkan pesan kesalahan yang lebih baik dan lebih deskriptif. Lihat bahwa tanda centang untuk variabel kosong memungkinkan pengguna untuk mengirimkan tanda kurung kosong, [], sebagai pengganti untuk variabel yang akan menggunakan nilai defaultnya. Penulis tetap harus menyediakan kode untuk mengganti argumen kosong itu dengan nilai defaultnya.
Utilitas saya yang lebih canggih, dengan parameter BANYAK, yang semuanya memiliki argumen default, akan sering menggunakan antarmuka pasangan properti / nilai untuk argumen default. Paradigma dasar ini terlihat pada perangkat grafik pegangan di matlab, serta dalam optimset, odeset, dll.
Sebagai sarana untuk bekerja dengan pasangan properti / nilai ini, Anda perlu belajar tentang varargin, sebagai cara memasukkan jumlah argumen yang sepenuhnya variabel ke suatu fungsi. Saya menulis (dan memposting) utilitas untuk bekerja dengan pasangan properti / nilai tersebut, parse_pv_pairs.m . Ini membantu Anda untuk mengubah pasangan properti / nilai menjadi struktur matlab. Ini juga memungkinkan Anda untuk memberikan nilai default untuk setiap parameter. Mengubah daftar parameter yang sulit menjadi struktur adalah cara yang SANGAT bagus untuk membagikannya di MATLAB.
sumber
Ini adalah cara sederhana saya untuk menetapkan nilai default ke suatu fungsi, menggunakan "coba":
Salam!
sumber
Saya telah menemukan bahwa fungsi parseArgs bisa sangat membantu.
sumber
Ada juga 'hack' yang dapat digunakan walaupun mungkin dihapus dari matlab di beberapa titik: Function eval sebenarnya menerima dua argumen yang mana yang kedua dijalankan jika kesalahan terjadi dengan yang pertama.
Jadi bisa kita gunakan
untuk menggunakan nilai 1 sebagai standar untuk argumen
sumber
Saya percaya saya menemukan cara yang cukup bagus untuk menangani masalah ini, hanya mengambil tiga baris kode (garis pembatas membungkus). Berikut ini diangkat langsung dari fungsi yang saya tulis, dan sepertinya berfungsi seperti yang diinginkan:
Saya pikir saya akan membagikannya.
sumber
Saya bingung tidak ada yang menunjukkan posting blog ini oleh Loren, salah satu pengembang Matlab. Pendekatan ini didasarkan pada
varargin
dan menghindari semua kasus yang tak berujung dan menyakitkanif-then-else
atauswitch
dengan kondisi yang berbelit-belit. Ketika ada beberapa nilai default, efeknya dramatis . Berikut ini contoh dari blog yang tertaut:Jika Anda masih belum mengerti, cobalah membaca seluruh posting blog oleh Loren. Saya telah menulis posting blog tindak lanjut yang berkaitan dengan nilai default posisi yang hilang . Maksud saya Anda dapat menulis sesuatu seperti:
dan masih memiliki nilai default
eps
untuktol
parameter (dan@magic
panggilan balik untukfunc
tentu saja ). Kode Loren memungkinkan ini dengan sedikit modifikasi tetapi rumit.Akhirnya, hanya beberapa keuntungan dari pendekatan ini:
if-then-else
pendekatan, yang lebih lama dengan setiap nilai default baru)Masalahnya, ada kerugian juga. Ketika Anda mengetik fungsi di Matlab shell dan melupakan parameternya, Anda akan melihat
varargin
petunjuk yang tidak membantu . Untuk mengatasinya, Anda disarankan untuk menulis klausa penggunaan yang bermakna.sumber
Setelah mengetahui ASSIGNIN (berkat jawaban ini oleh b3 ) dan EVALIN saya menulis dua fungsi untuk akhirnya mendapatkan struktur panggilan yang sangat sederhana:
Berikut daftarnya:
dan
sumber
Ini kurang lebih diangkat dari manual Matlab ; Saya hanya punya pengalaman lewat ...
sumber
Matlab tidak menyediakan mekanisme untuk ini, tetapi Anda dapat membangun satu di kode userland yang lebih pendek daripada inputParser atau urutan "jika nargin <1 ...".
Maka Anda dapat menyebutnya di fungsi Anda seperti ini:
Format adalah konvensi yang memungkinkan Anda membaca dari nama parameter ke nilai standarnya. Anda dapat memperpanjang getargs Anda () dengan spesifikasi tipe parameter opsional (untuk deteksi kesalahan atau konversi implisit) dan rentang jumlah argumen.
Ada dua kelemahan dari pendekatan ini. Pertama, lambat, jadi Anda tidak ingin menggunakannya untuk fungsi yang dipanggil dalam loop. Kedua, bantuan fungsi Matlab - petunjuk pelengkapan otomatis pada baris perintah - tidak berfungsi untuk fungsi varargin. Tapi ini cukup nyaman.
sumber
Anda mungkin ingin menggunakan
parseparams
perintah di matlab; penggunaannya akan terlihat seperti:sumber
misalnya
f(2,4,'c',3)
menyebabkan parameterc
menjadi 3.sumber
jika Anda akan menggunakan oktaf Anda bisa melakukannya seperti ini - tetapi sayangnya matlab tidak mendukung kemungkinan ini
(diambil dari doc )
sumber
Saya suka melakukan ini dengan cara yang lebih berorientasi objek. Sebelum memanggil wave () simpan beberapa argumen Anda dalam suatu struct, mis. satu parameter yang disebut:
Di dalam fungsi gelombang kemudian periksa, apakah parameter struct berisi bidang yang disebut 'flag' dan jika demikian, jika nilainya tidak kosong. Kemudian tetapkan dengan nilai default yang Anda tentukan sebelumnya, atau nilai yang diberikan sebagai argumen di struct parameter:
Ini membuatnya lebih mudah untuk menangani sejumlah besar argumen, karena tidak tergantung pada urutan argumen yang diberikan. Yang mengatakan, itu juga membantu jika Anda harus menambahkan lebih banyak argumen nanti, karena Anda tidak perlu mengubah fungsi tanda tangan untuk melakukannya.
sumber
wave(a,b,'flag',42,'fTrue',1)