2014-11-04 78 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來避免循環。