Fungsi pertama dalam file-m (yaitu fungsi utama ), dipanggil ketika file-m dipanggil. Tidak perlu bahwa fungsi utama memiliki nama yang sama dengan file-m, tetapi untuk kejelasan seharusnya . Ketika fungsi dan nama file berbeda, nama file harus digunakan untuk memanggil fungsi utama.
Semua fungsi selanjutnya dalam file-m, yang disebut fungsi lokal (atau "subfungsi" dalam terminologi yang lebih lama), hanya dapat dipanggil oleh fungsi utama dan fungsi lokal lainnya dalam file-m itu. Fungsi di m-file lain tidak dapat memanggil mereka. Mulai di R2016b, Anda dapat menambahkan fungsi lokal ke skrip juga, meskipun perilaku pelingkupan masih sama (yaitu mereka hanya dapat dipanggil dari dalam skrip).
Selain itu, Anda juga dapat mendeklarasikan fungsi dalam fungsi lainnya. Ini disebut fungsi bersarang , dan ini hanya bisa dipanggil dari dalam fungsi yang disarangkan. Mereka juga dapat memiliki akses ke variabel dalam fungsi di mana mereka bersarang, yang membuatnya cukup berguna meskipun sedikit sulit untuk dikerjakan.
Lebih banyak makanan untuk dipikirkan ...
Ada beberapa cara di sekitar perilaku pelingkupan fungsi normal yang diuraikan di atas, seperti fungsi lewat berfungsi sebagai argumen keluaran seperti yang disebutkan dalam jawaban dari SCFrench dan Jonas (yang, dimulai pada R2013b, difasilitasi oleh localfunctions
fungsi). Namun, saya tidak akan menyarankan untuk membiasakan diri menggunakan trik seperti itu, karena ada banyak pilihan yang lebih baik untuk mengatur fungsi dan file Anda.
Sebagai contoh, katakanlah Anda memiliki fungsi utama A
dalam sebuah m-file A.m
, bersama dengan fungsi lokal D
, E
dan F
. Sekarang katakanlah Anda memiliki dua fungsi terkait lainnya B
dan C
dalam m-file B.m
dan C.m
masing-masing, bahwa Anda juga ingin dapat menelepon D
, E
dan F
. Berikut beberapa opsi yang Anda miliki:
Masukkan D
,, E
dan F
masing - masing dalam file-m terpisah masing-masing, yang memungkinkan fungsi lain untuk memanggil mereka. The downside adalah bahwa ruang lingkup fungsi ini adalah besar dan tidak terbatas hanya A
, B
dan C
, tapi terbalik adalah bahwa ini adalah cukup sederhana.
Buat defineMyFunctions
m-file (seperti dalam contoh Jonas') dengan D
, E
, dan F
sebagai fungsi lokal dan fungsi utama yang hanya kembali berfungsi menangani mereka. Ini memungkinkan Anda untuk menyimpan D
,, E
dan F
dalam file yang sama, tetapi tidak melakukan apa-apa mengenai ruang lingkup fungsi-fungsi ini karena fungsi apa pun yang dapat memanggil defineMyFunctions
dapat memanggil mereka. Anda juga harus khawatir tentang melewati fungsi menangani sebagai argumen untuk memastikan Anda memilikinya di mana Anda membutuhkannya.
Salin D
, E
dan F
ke dalam B.m
dan C.m
sebagai fungsi lokal. Ini membatasi ruang lingkup penggunaannya hanya A
,, B
dan C
, tetapi membuat pembaruan dan pemeliharaan kode Anda menjadi mimpi buruk karena Anda memiliki tiga salinan kode yang sama di tempat yang berbeda.
Gunakan fungsi pribadi ! Jika Anda memiliki A
, B
, dan C
dalam direktori yang sama, Anda dapat membuat subdirektori bernama private
dan tempat D
, E
dan F
di sana, masing-masing sebagai m-file terpisah. Hal ini membatasi ruang lingkup mereka sehingga mereka hanya dapat dipanggil oleh fungsi dalam direktori segera di atas (yaitu A
, B
, dan C
) dan membuat mereka bersama-sama di tempat yang sama (tapi masih berbeda m-file):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Semua ini agak di luar ruang lingkup pertanyaan Anda, dan mungkin lebih detail daripada yang Anda butuhkan, tapi saya pikir mungkin lebih baik untuk menyentuh pada keprihatinan yang lebih umum dari mengatur semua file-m Anda. ;)
^
, @idigasSecara umum, jawaban untuk pertanyaan Anda adalah tidak, Anda tidak dapat menetapkan lebih dari satu fungsi yang terlihat secara eksternal per file. Anda dapat mengembalikan gagang fungsi ke fungsi lokal, dan cara mudah untuk melakukannya adalah dengan membuatnya menjadi bidang struct. Berikut ini sebuah contoh:
Dan inilah cara penggunaannya:
sumber
Satu-satunya cara untuk memiliki beberapa fungsi yang dapat diakses secara terpisah dalam satu file adalah dengan mendefinisikan METODE STATIK menggunakan pemrograman berorientasi objek . Anda akan mengakses fungsinya sebagai
myClass.static1()
,myClass.static2()
dll.Fungsionalitas OOP hanya didukung secara resmi sejak R2008a, jadi kecuali Anda ingin menggunakan sintaks OOP yang lama dan tidak berdokumen, jawabannya tidak, seperti dijelaskan oleh @gnovice .
EDIT
Satu lagi cara untuk mendefinisikan beberapa fungsi di dalam file yang dapat diakses dari luar adalah dengan membuat fungsi yang mengembalikan banyak fungsi . Dengan kata lain, Anda akan memanggil fungsi pendefinisian Anda sebagai
[fun1,fun2,fun3]=defineMyFunctions
, setelah itu Anda dapat menggunakanout1=fun1(inputs)
dll.sumber
Saya sangat suka jawaban SCFrench - Saya ingin menunjukkan bahwa itu dapat dengan mudah dimodifikasi untuk mengimpor fungsi langsung ke ruang kerja menggunakan fungsi assignin. (Melakukannya seperti ini mengingatkan saya banyak cara "impor x dari y" Python untuk melakukan sesuatu)
Dan kemudian digunakan sebagai berikut:
sumber
assignin('caller',...)
akan lebih benar. Anda mungkin ingin menggunakan fungsi-fungsi ini dari dalam fungsi lain.Sejalan dengan jawaban SCFrench, tetapi dengan putaran gaya C # yang lebih banyak ..
Saya akan (dan sering melakukannya) membuat kelas yang berisi beberapa metode statis. Sebagai contoh:
Karena metodenya statis, Anda tidak perlu mengatur kelas. Anda memanggil fungsi sebagai berikut:
sumber
Saya mendefinisikan beberapa fungsi dalam satu file .m dengan Oktaf dan kemudian menggunakan perintah dari dalam file .m di mana saya perlu menggunakan fungsi dari file itu:
Tidak yakin apakah ini tersedia dengan Matlab.
sumber
Anda juga dapat mengelompokkan fungsi dalam satu file utama bersama dengan fungsi utama yang tampak seperti ini:
Kemudian memanggil subfun1 akan terlihat seperti ini: str = main ('subfun1')
sumber
Pada R2017b, ini tidak mungkin secara resmi. The dokumentasi yang relevan menyatakan bahwa:
Namun, solusi yang disarankan dalam jawaban lain dapat mencapai hal serupa.
sumber
Saya telah mencoba dengan SCFRench dan dengan Ru Hasha pada oktaf.
Dan akhirnya berhasil: tetapi saya telah melakukan beberapa modifikasi
Dapat dipanggil dalam file 'm' lain:
memperbarui:
Saya menambahkan jawaban karena tidak yang 72 maupun 20 bekerja di oktaf untuk saya. Yang saya tulis bekerja dengan sempurna (dan saya mengujinya Jumat lalu ketika saya kemudian menulis posting).
sumber