2012-10-21 64 views
5

我有一个3D(或一般n维)矩阵A与尺寸由列向量乘法三维矩阵

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

现在我想做的一个列向量v一个矢量乘法在一个维度(我会做在2个维度,在那里我得到返回的载体 - 例如用于d1 = 2d3 = 4size(v) = d2),使

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

因此,我想通过一个维度减少。

是否有用于返回d3维列向量v

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

我希望这是一个明确的MATLAB函数(除循环等)。

谢谢!

回答

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)]) 

基本上,你重塑成一个二维矩阵A2((九),(K))= A((I),(J ),(k))的:

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

然后,你做平常multiplcation:

所有(IJ)B2((IJ))= sum_k A2((IJ),(k))的* v ((k)):

B2=A2*v 

的你重塑回:

B((I),(J))= B((九))

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

我希望这是明确的

+1

好吗 - 非常感谢。我希望有更顺畅的事情,但我想这很公平。 – user1763302

+1

此方法仅适用于要相乘的维度是N-d矩阵的最后维度。如果代码适用于N-D矩阵的任何维1 ... N,那将会很好。似乎可以在开始和结束时使用'dimshift'。 – cjh

+0

确实可以用'permute'实现......这需要几分钟的时间来思考它。随意编辑我的答案,或者添加你自己的答案。我有一个最后期限。 – Oli

3

你可以这样做有点平滑。对于矩阵reshape只需要1个参数,如果没有指定,另一个会自动计算出来,这在这种情况下非常有用。

因此,由奥利奇提出的解决方案可以更简单地写成

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), []);