我正在尝试编写代码来获取向量的'N维产品'。因此,例如,如果我有2个长度为L的矢量,则x& y,那么'二维乘积'就是常规矢量乘积,R = x * y',因此R,R(i,j)的每个项都是x的第i个元素的乘积和y的第j个元素,又名R(i,j)= x(i)* y(j)。
问题是如何在matlab中对任意维度进行优雅的概括。这是我有3个向量x,y,z,我想要3维数组R,使得R(i,j,k)= x(i)* y(j)* z(k)。
对于4个向量,x1,x2,x3,x4:R(i1,i2,i3,i4)= x1(i1)* x2(i2)* x3(i3)* x4(i4)等。 ..
另外,我事先并不知道尺寸的数量。代码必须能够处理任意数量的输入向量,输入向量的数量对应于最终答案的维数。
有没有任何简单的matlab技巧可以做到这一点,并避免专门通过R的每个元素?
谢谢!
答案 0 :(得分:3)
我认为“常规矢量产品”是指外部产品。
在任何情况下,您都可以使用ndgrid
功能。我比使用bsxfun
更喜欢这个,因为它更直接。
% make some vectors
w = 1:10;
x = w+1;
y = x+1;
z = y+1;
vecs = {w,x,y,z};
nvecs = length(vecs);
[grids{1:nvecs}] = ndgrid(vecs{:});
R = grids{1};
for i=2:nvecs
R = R .* grids{i};
end;
% Check results
for i=1:10
for j=1:10
for k=1:10
for l=1:10
V(i,j,k,l) = R(i,j,k,l) == w(i)*x(j)*y(k)*z(l);
end;
end;
end;
end;
all(V(:))
ans = 1
答案 1 :(得分:1)
内置函数bsxfun
是一个应该能够提供帮助的快速实用程序。它被设计为针对具有不匹配尺寸的两个输入在每个元件上执行2个输入功能。单例尺寸被扩展,非单例尺寸需要匹配。 (这听起来令人困惑,但一旦它在很多方面都很有用。)
根据我的理解你的问题,你可以调整每个向量的维度形状,以定义它应该定义的维度。然后使用嵌套的bsxfun
调用来执行乘法。
示例代码如下:
%Some inputs, N-by-1 vectors
x = [1; 3; 9];
y = [1; 2; 4];
z = [1; 5];
%The computation you describe, using nested BSXFUN calls
bsxfun(@times, bsxfun(@times, ... %Nested BSX fun calls, 1 per dimension
x, ... % First argument, in dimension 1
permute(y,2:-1:1) ) , ... % Second argument, permuited to dimension 2
permute(z,3:-1:1) ) % Third argument, permuted to dimension 3
%Result
% ans(:,:,1) =
% 1 2 4
% 3 6 12
% 9 18 36
% ans(:,:,2) =
% 5 10 20
% 15 30 60
% 45 90 180
要处理任意数量的维度,可以使用递归或循环结构进行扩展。循环看起来像这样:
allInputs = {[1; 3; 9], [1; 2; 4], [1; 5]};
accumulatedResult = allInputs {1};
for ix = 2:length(allInputs)
accumulatedResult = bsxfun(@times, ...
accumulatedResult, ...
permute(allInputs{ix},ix:-1:1));
end