2011-04-06 60 views
1

假設我有三個向量a,b,c並且想對所有組合應用功能f。因此,我使用[A,B,C] = ndgrid(a,b,c); result = f(A,B,C)並使用逐點評估來實現f,例如, (A.^B).*CMatlab:如何嵌套ndgrid?

但是,第二個函數g的單獨評估僅取決於ab而不是c。因此,G=g(A,B)(在我的示例中爲A.^B)的調用將通過冗餘地調用具有相同參數length(c)次的函數來浪費時間。我可以使用單獨的ndgrid,但我希望g的結果存儲在相同的維度中,如A,BC,因此我可以稍後調用h(G,A,C)沒有進一步修改。

如何才能實現這一目標,以及如何沒有使用嵌套循環for反而拖慢程序浪費這個冗餘空間?

回答

3

只需使用的AB第一面的計算,然後複製結果與功能REPMAT使G相同大小的其他變量:

G = g(A(:,:,1),B(:,:,1));  %# Compute one unique plane of G 
G = repmat(G,[1 1 length(c)]); %# Replicate that plane for a 3-D matrix 

編輯:

如果複製G看起來可能會浪費內存(即如果您處理的是非常大的矩陣),那麼for循環可能是更好的方法。另外,您可以嘗試在計算中使用功能BSXFUN。例如,你的3-d C乘以2-d G,你可以這樣做:

bsxfun(@times,G,C); 

這最終會給出相同的結果:

repmat(G,[1 1 length(c)]).*C; 

將其保存在記憶?我不能確定,因爲我不知道BSXFUN是如何實現的。您必須針對您的特定問題嘗試一下,看看哪種方法可以提高速度或內存使用率。

+0

我不知道這個'repmat'ing(或使用'ndgrid')不會浪費大量的內存通過增加冗餘,或者matlab是否以複雜的方式存儲它... – 2011-04-06 12:25:39

+0

...顯然不是。 'a = linspace(0,1,1e3); [A,B,C] = ndgrid(a,a,a)''在我的matlab會話中死了 – 2011-04-06 12:31:48

+0

感謝您的更新,我會嘗試並查看'bsxfun'。目前內存可能並不是我主要關心的問題,但我只是好奇 – 2011-04-06 12:42:00