簡體   English   中英

3D 矩陣乘以 2D 矩陣

[英]3D matrix multiplication by 2D matrix

我有一個 NxNx4 矩陣( A )和一個 4x4 矩陣( B )。 我需要乘以由第一個矩陣A的四個元素組成的向量a ,比方說

a = A(1,1,1) 
    A(1,1,2)
    A(1,1,3)
    A(1,1,4)

通過 4x4 矩陣B但我不確定是否有比使用for循環構建向量a更快更聰明的解決方案。 是否存在一種用幾行代碼進行計算的方法?

我建立了A喜歡

A(:,:,1) = rand(20);
A(:,:,2) = rand(20);
A(:,:,3) = rand(20);
A(:,:,4) = rand(20);

和矩陣B

B = rand(4);

現在我想乘以B

B*[A(1,1,1);A(1,1,2);A(1,1,3);A(1,1,4)]

這對於 A 的每個元素

B*[A(1,2,1);A(1,2,2);A(1,2,3);A(1,2,4)]
B*[A(1,3,1);A(1,3,2);A(1,3,3);A(1,3,4)]
...

你可以用一個簡單的循環來做到這一點,注意循環在較新的 MATLAB 版本中不一定很慢 里程可能會有所不同。

循環具有提高代碼可讀性的優勢,這里發生的事情非常清楚:

% For matrix A of size N*N*4
C = zeros( size( A ) );
for ii = 1:N
    for jj = 1:N
        C( ii, jj, : ) = B * reshape( A( ii, jj, : ), [], 1 );
    end
end

特別是當 N 很大時具有良好性能的循環解決方案:

s = size(A, 3);
C = A(:,:,1) .* reshape(B(:,1),1,1,[]);
for k = 2:s
    C = C + A(:,:,k) .* reshape(B(:,k),1,1,[]);
end

我認為這可以滿足您的要求:

C = permute(sum(bsxfun(@times, permute(B, [3 4 2 1]), A), 3), [1 2 4 3]);

查看:

>> C(1,2,:)
ans(:,:,1) =
   1.501739582138850
ans(:,:,2) =
   1.399465238902816
ans(:,:,3) =
   0.715531734553844
ans(:,:,4) =
   1.617019921519029
>> B*[A(1,2,1);A(1,2,2);A(1,2,3);A(1,2,4)]
ans =
   1.501739582138850
   1.399465238902816
   0.715531734553844
   1.617019921519029

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM