2014-11-04 122 views
1

我有一个AxBxC数组,其中AXB指向我采样的一个字段的各个网格(如坐标),C对应于下面的图层。现在我想通过将它与2D矩阵相乘来计算某些活动对这些单独点的影响。 例如Matlab:使用二维数组的三维阵列的子集

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 

Unfotunately我得到的错误:

Error using * 
Inputs must be 2-D, or at least one input must be scalar. 
To compute elementwise TIMES, use TIMES (.*) instead. 

任何帮助,这是赞赏si我对matlab还不是很熟悉。

+0

是你的'z'长度与'AppA'相同吗? – Rashid 2014-11-04 07:23:55

回答

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牧师1

如果你想在bsxfun代码摆脱squeeze的,你需要在那里使用额外的permute -

AreaN = sum(bsxfun(@times,permute(Area,[1 2 4 3]),permute(AppA,[4 3 1 2])),4) 
+0

感谢您的详细解答。我会和你一起去向量化的方法#1 – user2386786 2014-11-04 09:09:13

+0

@ user2386786同意,它必须是最快的地段! – Divakar 2014-11-04 09:36:02

0

这将解决矩阵乘法问题:

AreaN(i,j,:)= AppA*reshape(Area(i,j,:),3,[]); 

您可能要考虑使用bsxfun来避免循环。