2011-06-14 63 views
2

我有一個函數返回一個大的向量並被多次調用,在調用之間進行一些邏輯操作,這使得向量化不是一個選項。如何避免爲每次調用函數時返回的值分配內存

函數的一個例子是

function a=f(X,i) 

a=zeros(size(X,1),1); 
a(:)=X(:,i); 

end 

和我做

for i=1:n a=f(X,i); end 

如果在分析本(尺寸(X,1)= 5.10^5,N = 100)的時間是0.12 s爲零線,0.22s爲(:)= X(:,i)第二行。正如預期的那樣,在'零'行中每次調用f時都會分配內存。

爲了擺脫該行及其0.12S的,我想分配返回值只有一次,並在每一次將它作爲回報空間,以一個合適的函數g像這樣的:

function a=g(X,i,a) 
     a(:)=X(:,i); 
end 

和做

a=zeros(m,1); 
    for i=1:n a=g(X,i,a); end 

令人驚訝的對我來說是內部克該分析仍顯示存儲器被以相同的量在分配的一個(:)= X(:,i)的;線,所花費的時間非常像0.12 + 0.22s ..

1)這是隻是"lazy copy on write"因爲我正在寫入? 2)展望未來,有哪些選擇? -a(messy ..)的全局變量? - 寫入矩陣手柄類(必須我真的嗎?) (該nested function way指一些沉重的重新設計,使嵌套函數其中X是已知的(從這個答案符號)矩陣A ..)

+0

最終,我將不得不用C++重寫所有內容,在一個MEX文件中的n循環似乎有很多工作atm,因爲實際情況是這樣的: function fhandle = get_functor(X) fhandle = @ f1; %X實際上是參數f1 函數s = f1(i) s = sin(x./i); end end %begin script %X以各種不同的方式定義(「code * factorization *」) f = get_functor(X); 所以我想象使用MEX文件的n循環,我將需要使該C函數知道X.實際情況是,我爲幾個10的不同的X做這個,並喜歡增加更多/帶走一些只是測試東西.. – imateapot 2011-06-14 16:56:20

回答

0

也許這與你的問題有點切線,但如果這是一個性能關鍵的應用程序,我認爲一個好的方法是將你的函數重寫爲mex文件。下面是從http://www.mathworks.com/support/tech-notes/1600/1605.html#intro報價,

的主要原因寫一個MEX文件是:... 速度;您可以將瓶頸計算(如for循環)重寫爲MEX文件以提高效率。

如果你不熟悉mex文件,上面的鏈接應該讓你開始。將現有的函數轉換爲C/C++不應該太困難。 MATLAB中包含的yprime.c示例與您要做的相似,因爲它被迭代地調用以計算ode45內部的派生等。

+0

謝謝我會考慮它! – imateapot 2011-06-14 16:54:14

相關問題