我有以下問題,不能想到沒有for循環的方法。行和列的矩陣乘法,無需for循環在matlab中
考慮兩個矩陣:
a=rand(N,3), b=rand(3,N)
我想要得到的是:b(:, i)*a(i, :)
(3×3的矩陣)在第三維度串連所有i
。
因此,對於上面的例子,結果應該是(3 * 3 * N)矩陣。
我有以下問題,不能想到沒有for循環的方法。行和列的矩陣乘法,無需for循環在matlab中
考慮兩個矩陣:
a=rand(N,3), b=rand(3,N)
我想要得到的是:b(:, i)*a(i, :)
(3×3的矩陣)在第三維度串連所有i
。
因此,對於上面的例子,結果應該是(3 * 3 * N)矩陣。
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
啊!利用廣播!整齊。 –
謝謝! :)我添加了一個基準來顯示加速。我認爲這是值得的... – Florian
@AnderBiguri什麼是廣播?從未聽說過它。是[this](https://mathworks.com/help/distcomp/broadcast-variables.html)的定義?只是好奇。謝謝。 – codeaviator
不,它是一個因素'(3×1)*(1×3) - > 3x3' b的N列,其是向量3X1和具有N行其是1×3向量 – Paramar
我確定有一個非常好的解決方案,使用'kron'和'reshape',但我無法弄清楚。否則只是循環它 –
你確定你所做的更正是正確的嗎?我認爲這是一個1x3 x 3x1 - > 1x1的乘法。順便說一下克羅內克產品似乎在這裏做了比必要的更多的計算。你可以從尺寸3x3xN和3Nx3N中看到它。 – Paramar