我有一个AxBxC数组,其中AXB指向我采样的字段(如坐标)的单个网格,C对应于下面的图层。现在我想通过将它们与2D矩阵相乘来计算某些活动对这些单个点的影响。 E.g。
x=5; %x-Dimensions of the sampled area
y=5; %y-Dimensions of the sampled area
z=3; %z-number of layers sampled
Area= zeros(x,y,z);
AreaN= zeros(x,y,z);
现在我想将X * Y中给定点的每一层乘以:
AppA=[0.4,0.4,0.2;0.4,0.5,0.1;0.1,0.2,0.7];
我试过了:
for i=1:x
for j=1:y
AreaN(i,j,:)= AppA*Area(i,j,:);
end
end
不幸的是我收到错误:
Error using *
Inputs must be 2-D, or at least one input must be scalar.
To compute elementwise TIMES, use TIMES (.*) instead.
由于我还不熟悉matlab,所以对此有任何帮助。
答案 0 :(得分:0)
正确的方法
我认为,要更正代码,您需要将Area(i,j,:)
转换为列向量,您可以使用squeeze
。因此,正确的基于循环的代码看起来像这样 -
AreaN= zeros(x,y,z);
for i=1:x
for j=1:y
AreaN(i,j,:)= AppA*squeeze(Area(i,j,:));
end
end
现在,可以在此处建议有效的无循环/矢量化方法以获得输出。
矢量化方法#1
第一种方法可能是矩阵乘法,必须非常有效 -
AreaN = reshape(reshape(Area,x*y,z)*AppA.',x,y,z)
矢量化方法#2
第二个 bsxfun
-
AreaN = squeeze(sum(bsxfun(@times,Area,permute(AppA,[3 4 2 1])),3))
矢量化方法#2 Rev 1
如果您想要删除squeeze
代码中的bsxfun
,则需要在其中使用额外的permute
-
AreaN = sum(bsxfun(@times,permute(Area,[1 2 4 3]),permute(AppA,[4 3 1 2])),4)
答案 1 :(得分:0)
这将解决矩阵乘法问题:
AreaN(i,j,:)= AppA*reshape(Area(i,j,:),3,[]);
您可能需要考虑使用bsxfun
来避免循环。