3d列矩阵矢量乘法

时间:2012-10-21 16:01:52

标签: matlab multiplication

我有一个3d(或一般是n维)矩阵A,其尺寸为

size(A) = [d1 d2 d3 ... dn]. 

现在我想在其中一个维度上使用列向量v进行向量乘法(就像我在2维中所做的那样,我得到一个向量返回 - 例如d1 = 2d3 = 4size(v) = d2),以便

(A*d)_i = sum(a_ij*v_j). 

因此我希望减少一个维度。

是否有一个Matlab函数(除了循环)返回d3 - 维列向量v

(A*v)_ij = sum(A_ijk*v_k). 

我希望这很清楚。

谢谢!

2 个答案:

答案 0 :(得分:3)

你可以用一些reshape来做到这一点:

A=rand(2,3,4);
v=rand(1,4);
reshape(reshape(A,[size(A,1)*size(A,2),size(A,3)])*v,[size(A,1) size(A,2)])

基本上,您将A重塑为2D矩阵A2((ij),(k))= A((i),(j),(k)):

A2=reshape(A,[size(A,1)*size(A,2),size(A,3)])

然后你进行常规的多重化:

for all(ij)B2((ij))= sum_k A2((ij),(k))* v((k)):

B2=A2*v

你重塑:

B((I),(J))= B((IJ))

B=reshape(B2,[size(A,1) size(A,2)])

我希望这很清楚

答案 1 :(得分:3)

你可以做得更顺畅一点。对于矩阵reshape,只需要1个参数,如果没有指定则另一个自动计算,这在这种情况下非常有用。

因此,Oli提出的解决方案可以简单地写成

A = rand(2,3,4);
v = rand(4,1);

A2 = reshape(A, [], numel(v));      % flatten first two dimensions
B2 = A2*v;
B  = reshape(B2, size(A, 1), []);