2015-08-29 122 views
1

在MATLAB中我有製作3D陣列MATLAB

[Z,S]=meshgrid(0.01:0.01:1) 

和我也有一個100000x2矩陣稱爲X,每一行有兩個數據集 - p是第一列和x是第二。我想計算exp ^( - S * X(j,2))。(* Z.^X(j,1))其中j爲行索引。結果應該是100x100x100000矩陣。然後這將沿着第三維平均,並且將產生網格圖。我試過使用for循環

[Z,S]=meshgrid(0.01:0.01:1) 
for j=1:100000 
phi(j)=exp^(-S.*X(j,2)).*(Z.^X(j,1)) 
end 

生成我需要的100x100x100000陣列。然而,這給了我錯誤

In an assignment A(I) = B, the number of elements in B and I must be the same. 
Error in phi (line 4) 
phi(j)=exp(-S.*X(j,2)).*(Z.^X(j,1)); 

我不知道爲什麼會發生這種情況?任何人都可以找出一種更好的方法來嘗試找到我想要的結果嗎?因爲我猜測可能有完全矢量化的解決方案(或者最少使用for循環)?

+0

我有以下的指數麻煩 - 你能說多一點有關你想創建的對象?這就像一個二維指數隨機噪聲或什麼? – ConfusinglyCuriousTheThird

+1

您正試圖將一個矩陣分配給'phi'中的一個點。因爲這個,你顯然會遇到尺寸不匹配的問題。 – rayryeng

+0

@ anon0909沒有那部分不是二維指數 - 我試圖計算e ^( - sp)z^x,其中p和x是存儲在數組X中的隨機變量。已採取100000個樣本,以便X的每一行都有p和x對應一個樣本。我的問題中的j只是數字,我們正在看哪個特定的樣本。然後,我將要對所有樣本進行平均。 – Ansh

回答

2

假設您使用兩個更多的嵌套循環來獲取ZS,因此該代碼總共將有三個嵌套循環。

現在,向量化技術在像這樣的可矢量化嵌套循環的情況下沒有改變 - 分別處理涉及不同迭代器的代碼的不同部分。因此,在這裏你有三個迭代器,其中兩個長度爲100,第三個迭代器直到100000。把以簡潔的註釋文本矢量化的思路和解決你的情況與bsxfun基於代碼 -

%// Get vectorized equivalent of exp(-S.*X(j,2)) and keeping in mind that 
%// since the last (3rd) dimension of final output has length same as the 
%// number of elements in X(:,2), so "throw" this to 3rd dim with permute. 
%// Then, use bsxfun to let the broadcasting being taken care off by MATLAB. 
p1 = exp(-bsxfun(@times,V.',permute(X(:,2),[3 2 1]))); %//' 

%// Going with same philosophy as before, get vectorized (Z.^X(j,1)) 
p2 = bsxfun(@power,V,permute(X(:,1),[3 2 1])); 

%// Finally "merge" earlier two parts for final output 
phi_out = bsxfun(@times,p1,p2); 
+0

這對我很有幫助。不幸的是,實際功能產生了很大的值,因此使用這個功能後,我能夠成功地消除在我的項目中生成我想要的圖(phi_out)。然而,你的答案有一些非常有用的提示,所以我非常欣賞這個幫助。 – Ansh