【问题标题】:3D matrix multiplication by 2D matrix3D 矩阵乘以 2D 矩阵
【发布时间】:2018-12-21 10:33:50
【问题描述】:

我有一个 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)]
...

【问题讨论】:

  • 您描述有一个N*N*4 矩阵和一个4*4 矩阵,而您的示例a 两者都不是!请显示您预期的输入/输出的minimal reproducible example,如果定义明确,这听起来相对容易,但目前还不清楚。
  • 现在怎么样了?
  • 这更清楚了,我唯一的另一个问题是您的预期输出是什么?每次乘法都会产生一个4*1 向量,我猜你的预期输出C 是一个与A 大小相同的矩阵?
  • 没错。 C 应该又是一个 NxNx4 矩阵。我选择多维矩阵而不是 4 个单独的矩阵来计算经典的乘法矩阵向量B*a
  • 根据您的解释,我不完全确定您是否只需要 bsxfun(@times, ...) 或更高级的东西,例如 mmx 或 mtimesx。

标签: matlab matrix


【解决方案1】:

您可以通过一个简单的循环来执行此操作,请注意较新的 MATLAB 版本中的 loops aren't necessarily slow。里程可能会有所不同。

循环具有提高代码可读性的优势,这里发生了什么非常清楚:

% 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

【讨论】:

  • 嗯,你可以向我确认这是我需要的,对吧?我期待四个中的两个零矩阵(第三个索引的矩阵)
  • 在 Luis 的回答中,C(m,n,:) 与 B*[A(m,n,1);A(m,n,2);A(m,n,3);A(m,n,4)]; 对于任何 m 和 n 相同 - 您应该能够自己很容易地确认这一点?
【解决方案2】:

一个循环解决方案,特别是当 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

【讨论】:

  • 相对于我对N >> B 的建议,这非常快。我喜欢您使用B*x 的定义来利用较短循环的后退一步。对于N = 1000, B = 4,我发现这要快约 30 倍。
【解决方案3】:

我认为这是你想要的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多