Banyak operasi bawaan seperti sum
dan prod
sudah dapat beroperasi melintasi baris atau kolom, jadi Anda mungkin dapat memfaktor ulang fungsi yang Anda terapkan untuk memanfaatkan ini.
Jika itu bukan opsi yang layak, salah satu cara untuk melakukannya adalah dengan mengumpulkan baris atau kolom ke dalam sel menggunakan mat2cell
atau num2cell
, lalu gunakan cellfun
untuk beroperasi pada larik sel yang dihasilkan.
Sebagai contoh, katakanlah Anda ingin menjumlahkan kolom dari sebuah matriks M
. Anda dapat melakukannya hanya dengan menggunakan sum
:
M = magic(10); %# A 10-by-10 matrix
columnSums = sum(M, 1); %# A 1-by-10 vector of sums for each column
Dan inilah cara Anda melakukannya menggunakan opsi num2cell
/ yang lebih rumit cellfun
:
M = magic(10); %# A 10-by-10 matrix
C = num2cell(M, 1); %# Collect the columns into cells
columnSums = cellfun(@sum, C); %# A 1-by-10 vector of sums for each cell
true = false
yang pernyataannya valid, saya yakin ada cara untuk melakukannya (:sum(M, 1)
. Para pemula mungkin berpikirsum
bahwa cara ini dapat digunakan untuk matriks berukuran arbitrer dan kemudian menjadi bingung ketika matriks tersebut suatu hari nanti1-by-n
.Anda mungkin menginginkan fungsi Matlab bsxfun yang lebih tidak jelas . Dari dokumentasi Matlab, bsxfun "menerapkan operasi biner elemen demi elemen yang ditentukan oleh fungsi handle fun ke array A dan B, dengan ekspansi tunggal diaktifkan."
@gnovice yang disebutkan di atas bahwa jumlah dan fungsi dasar lainnya sudah beroperasi pada dimensi non-tunggal pertama (yaitu, baris jika ada lebih dari satu baris, kolom jika hanya ada satu baris, atau dimensi yang lebih tinggi jika semua dimensi yang lebih rendah memiliki ukuran == 1 ). Namun, bsxfun berfungsi untuk fungsi apa pun, termasuk (dan terutama) fungsi yang ditentukan pengguna.
Misalnya, Anda memiliki matriks A dan vektor baris BEg, katakanlah:
Anda menginginkan fungsi power_by_col yang mengembalikan dalam vektor C semua elemen di A pangkat dari kolom B.
Dari contoh di atas, C adalah matriks 3x3:
yaitu,
Anda bisa melakukan ini dengan cara brute force menggunakan repmat:
Atau Anda dapat melakukan ini dengan cara berkelas menggunakan bsxfun, yang secara internal menangani langkah repmat:
Jadi bsxfun menghemat beberapa langkah (Anda tidak perlu menghitung dimensi A secara eksplisit). Namun, dalam beberapa tes informal saya, ternyata repmat kira-kira dua kali lebih cepat jika fungsi yang akan diterapkan (seperti fungsi power saya, di atas) sederhana. Jadi, Anda harus memilih apakah Anda menginginkan kesederhanaan atau kecepatan.
sumber
Saya tidak dapat berkomentar tentang seberapa efisien ini, tetapi inilah solusinya:
sumber
Berdasarkan jawaban Alex , berikut adalah fungsi yang lebih umum:
Berikut perbandingan antara kedua fungsi tersebut:
sumber
Untuk kelengkapan / minat, saya ingin menambahkan bahwa matlab memang memiliki fungsi yang memungkinkan Anda mengoperasikan data per baris daripada per elemen. Ini disebut
rowfun
( http://www.mathworks.se/help/matlab/ref/rowfun.html ), tetapi satu-satunya "masalah" adalah beroperasi pada tabel ( http://www.mathworks.se/help/ matlab / ref / table.html ) daripada matriks .sumber
Menambah sifat jawaban yang terus berkembang untuk pertanyaan ini, dimulai dengan r2016b, MATLAB secara implisit akan memperluas dimensi tunggal, menghilangkan kebutuhan
bsxfun
dalam banyak kasus.Dari catatan rilis r2016b :
sumber
Tak satu pun dari jawaban di atas bekerja "di luar kotak" bagi saya, namun, fungsi berikut, diperoleh dengan menyalin ide dari jawaban lain berfungsi:
Dibutuhkan fungsi
f
dan menerapkannya ke setiap kolom matriksM
.Jadi contohnya:
sumber
Dengan versi Matlab terbaru, Anda dapat menggunakan struktur data Tabel untuk keuntungan Anda. Bahkan ada operasi 'rowfun' tetapi saya merasa lebih mudah melakukan ini:
atau ini yang lebih lama yang saya miliki yang tidak memerlukan tabel, untuk versi Matlab yang lebih lama.
sumber
Jawaban yang diterima tampaknya mengubah menjadi sel terlebih dahulu dan kemudian digunakan
cellfun
untuk beroperasi di semua sel. Saya tidak tahu aplikasi spesifiknya, tetapi secara umum saya akan berpikir menggunakanbsxfun
untuk mengoperasikan matriks akan lebih efisien. Pada dasarnyabsxfun
menerapkan operasi elemen-demi-elemen di dua larik. Jadi jika Anda ingin mengalikan setiap item dalamn x 1
vektor dengan setiap item dalamm x 1
vektor untuk mendapatkann x m
array, Anda dapat menggunakan:Ini akan memberi Anda matriks yang disebut di
result
mana entri (i, j) akan menjadi elemen ke-ivec1
dikalikan dengan elemen ke-jvec2
.Anda dapat menggunakan
bsxfun
untuk semua jenis fungsi bawaan, dan Anda dapat mendeklarasikannya sendiri. Dokumentasi memiliki daftar banyak fungsi bawaan, tetapi pada dasarnya Anda dapat menamai fungsi apa pun yang menerima dua larik (vektor atau matriks) sebagai argumen dan membuatnya berfungsi.sumber
Menemukan pertanyaan / jawaban ini sambil mencari cara menghitung jumlah baris dari sebuah matriks.
Saya hanya ingin menambahkan bahwa fungsi SUM Matlab sebenarnya memiliki dukungan untuk menjumlahkan dimensi tertentu, yaitu matriks standar dengan dua dimensi.
Jadi untuk menghitung jumlah kolom lakukan:
dan untuk jumlah baris, lakukan saja
Taruhan saya adalah ini lebih cepat daripada pemrograman for loop dan mengonversi ke sel :)
Semua ini dapat ditemukan di bantuan matlab untuk SUM.
sumber
jika Anda mengetahui panjang baris Anda, Anda dapat membuat sesuatu seperti ini:
sumber