Matlab:将三维数组的子集与二维数组相乘

时间:2014-11-04 07:20:10

标签: arrays matlab matrix

我有一个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,所以对此有任何帮助。

2 个答案:

答案 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来避免循环。