2015-08-25 56 views
0

我需要代碼的以下代表性部分中的「for」循環儘可能高效地運行。代碼中的平均函數充當我自己的函數的代表佔位符。在Matlab中矢量化Meshgrid點的評估

x = linspace(-1,1,15); 
y = linspace(2,4,15); 
[xgrid, ygrid] = meshgrid(x,y); 
mc = rand(100000,1); 
z=zeros(size(xgrid)); 

for i=1:length(xgrid) 
    for j=1:length(ygrid) 
     z(i,j) = mean(xgrid(i,j) + ygrid(i,j) + xgrid(i,j)*ygrid(i,j)*mc); 
    end 
end 

我已經向量化的代碼和建立在該MC被複製爲每個網格點的矩陣由約2.5倍提高其速度。我的實現導致一個非常大的矩陣(3 x 22500000)充滿了重複的數據。我已經通過將矩陣轉換爲單精度來減輕了這種方法的內存損失,但似乎應該有一種更有效的方式來做我想做的事情,避免複製這麼多數據。

+0

你有沒有考慮只複製'mc'一個維度,並使用循環的外循環?也考慮將'i'移到內部循環。 – user3528438

+0

對於這樣的大型陣列,矢量化可能會導致內存問題。 For循環並不總是低效的,Matlab的JIT編譯有助於解決較小的問題,併爲更大的問題提供更好的內存使用。你可以考慮爲外部循環使用並行for循環。 – David

回答

1

你可以使用bsxfun很少reshapes -

A = bsxfun(@times,y,x.'); %//' 
B = bsxfun(@plus,y,x.'); %//' 
C = mean(bsxfun(@plus,bsxfun(@times,mc,reshape(A,1,[])) , reshape(B,1,[])),1); 
z_out = reshape(C,numel(x),[]).';