Saya sedikit terkejut bahwa MATLAB tidak memiliki fungsi Peta, jadi saya meretasnya sendiri karena itu adalah sesuatu yang saya tidak bisa hidup tanpanya. Apakah ada versi yang lebih baik di luar sana? Apakah ada pustaka pemrograman fungsional standar untuk MATLAB di luar sana yang saya lewatkan?
function results = map(f,list)
% why doesn't MATLAB have a Map function?
results = zeros(1,length(list));
for k = 1:length(list)
results(1,k) = f(list(k));
end
end
penggunaan akan misalnya
map( @(x)x^2,1:10)
matlab
functional-programming
map-function
Will Ness
sumber
sumber
map
,foldl
(juga dikenal sebagaireduce
),select
(aliasfilter
), dan barang sangat diperlukan lainnya. Disarankan (jika Anda harus menggunakan Matlab).Jawaban:
Jawaban singkatnya: fungsi
arrayfun
bawaan melakukan persis sepertimap
fungsi Anda untuk larik numerik:Ada dua fungsi bawaan lainnya yang berperilaku serupa:
cellfun
(yang beroperasi pada elemen larik sel) danstructfun
(yang beroperasi pada setiap bidang struktur).Namun, fungsi-fungsi ini seringkali tidak diperlukan jika Anda memanfaatkan vektorisasi, khususnya menggunakan operator aritmatika yang bijaksana . Untuk contoh yang Anda berikan, solusi vektorisasi adalah:
Beberapa operasi akan secara otomatis beroperasi lintas elemen (seperti menambahkan nilai skalar ke vektor) sementara operator lain memiliki sintaks khusus untuk operasi elemen-bijaksana (dilambangkan dengan a
.
sebelum operator). Banyak fungsi bawaan di MATLAB dirancang untuk beroperasi pada argumen vektor dan matriks menggunakan operasi bijak-elemen (sering diterapkan pada dimensi tertentu, sepertisum
danmean
misalnya), dan karenanya tidak memerlukan fungsi peta.Untuk meringkas, berikut adalah beberapa cara berbeda untuk mengkuadratkan setiap elemen dalam sebuah array:
Tentu saja, untuk operasi sederhana seperti itu, opsi # 1 adalah pilihan yang paling masuk akal (dan efisien).
sumber
Selain operasi vektor dan elemen, ada juga
cellfun
untuk fungsi pemetaan melalui array sel. Sebagai contoh:Jika 'UniformOutput' benar (atau tidak disediakan), itu akan mencoba untuk menggabungkan hasil sesuai dengan dimensi larik sel, jadi
sumber
Solusi yang agak sederhana, menggunakan vektorisasi Matlab adalah:
Sekarang, mengetik
kembali
c (b) adalah referensi ke vektor berukuran 5 dengan elemen c pada indeks yang diberikan oleh b. Sekarang jika Anda memasukkan nilai ke vektor referensi ini, nilai asli di c ditimpa, karena c (b) berisi referensi ke nilai di c dan tidak ada salinannya.
sumber
Tampaknya arrayfun built-in tidak berfungsi jika hasil yang dibutuhkan adalah fungsi array: eg: map (@ (x) [xx ^ 2 x ^ 3], 1: 10)
sedikit mod di bawah membuat ini bekerja lebih baik:
sumber
..., 'UniformOutput', false);
untuk membuat output array sel yang berisi array Anda, lalu memformat dan menggabungkannya sesuai keinginan Anda ke dalam array non-sel.Jika matlab tidak memiliki fungsi map built in, bisa jadi karena pertimbangan efisiensi. Dalam implementasi Anda, Anda menggunakan loop untuk mengulangi elemen-elemen daftar, yang umumnya tidak disukai di dunia matlab. Sebagian besar fungsi matlab built-in adalah "vektorisasi", yaitu lebih efisien untuk memanggil fungsi pada seluruh larik, daripada mengulanginya sendiri dan memanggil fungsi untuk setiap elemen.
Dengan kata lain, ini
jauh lebih cepat dari ini
dengan asumsi definisi Anda tentang peta.
sumber
Anda tidak perlu
map
karena fungsi skalar yang diterapkan ke daftar nilai diterapkan ke setiap nilai dan karenanya berfungsi serupamap
. Coba sajaDalam kasus khusus Anda, Anda bahkan dapat menulis
sumber
Membuat vektor solusi seperti yang dijelaskan dalam jawaban sebelumnya mungkin merupakan solusi terbaik untuk kecepatan. Vektorisasi juga sangat Matlaby dan terasa menyenangkan.
Dengan itu Matlab sekarang memiliki kelas kontainer Map.
Lihat http://www.mathworks.com/help/matlab/map-containers.html
sumber
cellfun
dkk., Bukan tabel hash atau pasangan nilai kunci.