2011-04-15 246 views
9

这使我困扰了一下:三维矩阵乘法与矢量

假设你有一个三层矩阵。

有一个简单的方法,以使第一层(所有元素)获取与向量的第一个元素相乘等三个元素的矢量乘这个矩阵...

现在我有用一个函数来做到这一点是这样的:

function out=fun(matrix,vector) 

out=matrix; 
for k=1:3 
    out(:,:,k)=out(:,:,k)*vector(k); 
end 

有没有一种有效的方法来做到这一点的只有一条线路,而不需要一个功能?

回答

17

一种非常简洁的解决方案是reshapevector成1×1×3矩阵,并使用该函数BSXFUN进行逐元素乘法(它将复制尺寸根据需要匹配两个的尺寸输入参数):

newMatrix = bsxfun(@times,matrix,reshape(vector,[1 1 3])); 
+0

正是我想要的,谢谢! – shant 2011-04-15 20:46:18

+1

希望我可以再次为你提供“rep乞丐”的赞赏:)令人惊讶的是,Jonas和其他人今天也有类似的评论,过去我不得不几次提醒人们礼节。当问题得到解决后,似乎确实有一批一次性问题提出者抛弃现场。但是,我在这里没有足够长的时间,所以这可能是正常的。 – abcd 2011-04-16 01:02:18

+0

@yoda:是的,看到一次发贴并永不返回的驾车用户很常见。不能做太多的事情。然而,当我看到一位新用户提出了一些明智的,写得很好的问题,对评论给出了很好的反馈,并且通常以积极的态度行事,我认为这值得*轻轻地*指向一些常见问题,详细说明更多内部工作的SO。我认为,如果他们了解更多信息,他们可能会更有可能返回,我们需要更多这样的用户。 – gnovice 2011-04-16 03:55:49

2

有一个叫做repmat的matlab函数可以帮助你。

M = [1 2 3] 
M * repmat([1 2 3], 3,1) 
ans = 

6 12 18 
6 12 18 
6 12 18 

M = [1 2 3] 
M .* repmat([1 2 3], 3,1) 
ans = 

1  4  9 
1  4  9 
1  4  9 

取决于你想如何组织你的矩阵。

1

另一种方式是重复矢量按大小矩阵匹配:

out = out.*shiftdim(repmat(vector(:),[1 size(out(:,:,1))]),1) 
1

除了gnovice的answer,你也可以沿着其他维度复制您的载体,做一个直接的元素方式乘法。

A=randn(1000,1000,3);%# this is your matrix 
vector=[1,2,3];%# this is your vector 

[dim1 dim2 ~]=size(A); 
replicatedVector=repmat(reshape(vector,1,1,3),[dim1,dim2,1]); 
out=A.*replicatedVector;