2017-02-13 96 views
3

我有以下問題,不能想到沒有for循環的方法。行和列的矩陣乘法,無需for循環在matlab中

考慮兩個矩陣:

a=rand(N,3), b=rand(3,N)

我想要得到的是:b(:, i)*a(i, :)(3×3的矩陣)在第三維度串連所有i

因此,對於上面的例子,結果應該是(3 * 3 * N)矩陣。

+0

不,它是一個因素'(3×1)*(1×3) - > 3x3' b的N列,其是向量3X1和具有N行其是1×3向量 – Paramar

+0

我確定有一個非常好的解決方案,使用'kron'和'reshape',但我無法弄清楚。否則只是循環它 –

+0

你確定你所做的更正是正確的嗎?我認爲這是一個1x3 x 3x1 - > 1x1的乘法。順便說一下克羅內克產品似乎在這裏做了比必要的更多的計算。你可以從尺寸3x3xN和3Nx3N中看到它。 – Paramar

回答

6

Matlab的R2016b版本:

c = reshape(a.',[1,3,N]) .* reshape(b,[3,1,N]); 

此前Matlab的版本:

c = repmat(reshape(a.',[1,3,N]),[3,1,1]) .* repmat(reshape(b,[3,1,N]),[1,3,1]); 

編輯:這是基於Matlab R2016b(Win7x64)快速基準。矢量的加速是周圍的50

Benchmark on R2016b (Win7x64)

+0

啊!利用廣播!整齊。 –

+1

謝謝! :)我添加了一個基準來顯示加速。我認爲這是值得的... – Florian

+0

@AnderBiguri什麼是廣播?從未聽說過它。是[this](https://mathworks.com/help/distcomp/broadcast-variables.html)的定義?只是好奇。謝謝。 – codeaviator