Misalnya, jika saya ingin membaca nilai tengah dari magic(5)
, saya bisa melakukannya seperti ini:
M = magic(5);
value = M(3,3);
untuk mendapatkan value == 13
. Saya ingin dapat melakukan sesuatu seperti ini:
value = magic(5)(3,3);
value = (magic(5))(3,3);
untuk membuang variabel perantara. Namun, MATLAB mengeluh tentang Unbalanced or unexpected parenthesis or bracket
kurung pertama sebelum 3
.
Apakah mungkin untuk membaca nilai dari array / matriks tanpa terlebih dahulu menugaskannya ke variabel?
matlab
indexing
matrix
return-value
variable-assignment
Joe Kearney
sumber
sumber
testmatrix('magi', 5)(3, 3)
pada Scilab danmagic(5)(3, 3)
pada Oktaf berdua bekerja seperti pesona!Jawaban:
Ini sebenarnya adalah mungkin untuk melakukan apa yang Anda inginkan, tetapi Anda harus menggunakan bentuk fungsional dari operator pengindeksan. Saat Anda melakukan operasi pengindeksan menggunakan
()
, Anda sebenarnya membuat panggilan kesubsref
fungsi. Jadi, meskipun Anda tidak dapat melakukan ini:Anda bisa melakukan ini:
Jelek, tapi mungkin. ;)
Secara umum, Anda hanya perlu mengubah langkah pengindeksan menjadi panggilan fungsi sehingga Anda tidak memiliki dua set tanda kurung segera mengikuti satu sama lain. Cara lain untuk melakukan ini adalah dengan mendefinisikan fungsi anonim Anda sendiri untuk melakukan pengindeksan subskrip. Sebagai contoh:
Namun, ketika semua dikatakan dan dilakukan solusi variabel lokal sementara jauh lebih mudah dibaca, dan pasti apa yang akan saya sarankan.
sumber
clear
sementara (yang tidak seorang pun pernah melakukannya) - sementara cenderung bertahan lebih lamaHanya ada posting blog yang bagus di Loren pada Seni Matlab beberapa hari yang lalu dengan beberapa permata yang mungkin membantu. Secara khusus, menggunakan fungsi pembantu seperti:
dimana
paren()
bisa dipakai sukaakan kembali
Saya juga menduga bahwa ini akan lebih cepat daripada jawaban gnovice, tetapi saya belum memeriksa (Gunakan profiler !!!). Yang sedang berkata, Anda juga harus memasukkan definisi fungsi ini di suatu tempat. Saya pribadi telah menjadikannya fungsi independen di jalur saya, karena mereka sangat berguna.
Fungsi-fungsi ini dan lainnya sekarang tersedia di add-on Konstruk Pemrograman Fungsional yang tersedia melalui MATLAB Add-On Explorer atau di File Exchange .
sumber
myfunc().attr
?myfunc()
mengembalikan struktur yang menyertakan atributattr
, maka untuk mengaksesattr
saat ini perlu saya lakukanS = myfunc(); S.attr
. Pertanyaannya adalah apakah kita dapat memiliki fungsi pembantu sepertigetattr(myfunc(), 'attr')
analogi denganparen
dancurly
pembantu. Saya tidak mengerti apa hubungannya dengan kotak alat basis data.Bagaimana perasaan Anda tentang menggunakan fitur tidak berdokumen:
atau untuk array sel:
Sama seperti sihir :)
MEMPERBARUI:
Berita buruk, peretasan di atas tidak berfungsi lagi di R2015b ! Tidak apa-apa, itu fungsionalitas tidak berdokumen dan kami tidak dapat mengandalkannya sebagai fitur yang didukung :)
Bagi mereka yang bertanya-tanya di mana menemukan hal semacam ini, lihat di folder
fullfile(matlabroot,'bin','registry')
. Ada banyak file XML di sana yang mencantumkan semua jenis barang. Berhati-hatilah bahwa memanggil beberapa fungsi ini secara langsung dapat dengan mudah membuat crash sesi MATLAB Anda.sumber
':'
untuk menghindari kesalahanUndefined function or variable "builtin"
.builtin('_paren', magic(5), ':', 2)
(di tempat-tempat tertentu itu berfungsi tanpa kutipan secara langsung:
sebagai lawan':'
, seperti ketika menjalankan command prompt langsung bukan dari dalam fungsi. Saya kira itu bug di parser!)end
?end
-trickery tidak berfungsi dalam sintaks ini, Anda harus eksplisit dalam pengindeksan Anda .. (Batasan yang sama berlaku untuk sebagian besar jawaban terdaftar lainnya)Setidaknya dalam MATLAB 2013a Anda dapat menggunakan
getfield
seperti:untuk mendapatkan elemen di (1,2)
sumber
sayangnya syntax like
magic(5)(3,3)
tidak didukung oleh matlab. Anda perlu menggunakan variabel perantara sementara. Anda dapat membebaskan memori setelah digunakan, missumber
Perhatikan bahwa jika Anda membandingkan waktu berjalan dengan cara standar (letakkan hasilnya dan kemudian mengakses entri), mereka persis sama.
Menurut pendapat saya, intinya adalah: MATLAB tidak memiliki pointer, Anda harus hidup dengannya.
sumber
Ini bisa lebih sederhana jika Anda membuat fungsi baru:
dan kemudian menggunakannya:
sumber
subref
dilakukan ... tetapi dengan cara yang lebih umum.Notasi awal Anda adalah cara paling ringkas untuk melakukan ini:
Jika Anda melakukan ini dalam satu lingkaran, Anda bisa menetapkan ulang M setiap waktu dan mengabaikan pernyataan yang jelas juga.
sumber
Untuk melengkapi jawaban Amro, Anda dapat menggunakan
feval
bukanbuiltin
. Tidak ada perbedaan, sungguh, kecuali jika Anda mencoba untuk membebani fungsi operator:Yang menarik adalah itu
feval
tampaknya sedikit lebih cepat daripadabuiltin
(sekitar ~ 3,5%), setidaknya di Matlab 2013b, yang aneh mengingat bahwafeval
perlu memeriksa apakah fungsinya kelebihan beban, tidak sepertibuiltin
:sumber
feval
melakukan hal "normal" dan karenanya dapat menggunakan daftar ini sepenuhnya.builtin
harus mencari di tempat lain sehingga hanya menemukan fungsi bawaan. Kemungkinan kasus ini tidak dioptimalkan hampir sebanyak kasus "normal", karena mengapa Anda memasukkan uang ke dalam mengoptimalkan sesuatu yang tidak terlalu sering digunakan?