我有一個函數返回一個大的向量並被多次調用,在調用之間進行一些邏輯操作,這使得向量化不是一個選項。如何避免爲每次調用函數時返回的值分配內存
函數的一個例子是
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 ..)
最終,我將不得不用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