将3D矩阵与1D相乘

时间:2014-11-26 13:33:04

标签: matlab vectorization

我试图使用这篇文章中的解决方案:Multiply a 3D matrix with a 2D matrix,用三维向量化一维的乘法,但无济于事。任何帮助将不胜感激!

for s = 1: s_length
   for a = 1: a_length
      for g = g_length
         two_dim(s,a) = two_dim(s,a) + one_dim(g) * three_dim(s,a,g); 
      end
   end
end

2 个答案:

答案 0 :(得分:2)

我认为这可以做你想要的。

two_dim = reshape(three_dim, [], size(three_dim,3))*one_dim(:);
two_dim = reshape(two_dim, size(three_dim,1), size(three_dim,2));

其工作原理如下:

  • 第一行将您的3D数组重新整形为矩阵,将前两个维度折叠为一个。这样,您想要的操作是生成矩阵的标准乘法乘以列向量。
  • 第二行将结果重新整形为矩阵形状。

答案 1 :(得分:1)

mtimes不适用于尺寸大于2的输入,因此您必须自己找到一种方法来进行乘法运算。 Luis Mendo的解决方案是一个很好的解决方案;这是另一个使用bsxfun

的人
two_dim = two_dim + squeeze(sum(bsxfun(@times, three_dim, reshape(one_dim,[1 1 g_length])),3));

以下是它的工作原理:

  • reshape使向量one_dim看起来像3D数组。这必须这样做,因为矢量和3D数组之间的乘法是沿第三维执行的,所以Matlab需要提示大小。
  • bsxfun执行逐元素的乘法,因此结果必须沿第三维度(并且被挤压以符合2D矩阵格式)