如何在每次调用函数时避免为返回值分配内存

时间:2011-06-14 12:53:17

标签: matlab

我有一个返回大向量的函数,并且被多次调用,在调用之间进行一些逻辑,这使得矢量化不是一个选项。

该功能的一个例子是

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.12s,对于(:)= X(:,i)为第二行为0.22s。正如预期的那样,在“零”行中每次调用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

令我惊讶的是,在g内部进行分析仍然表明在a(:)= X(:,i)中以相同的数量分配内存;行,所用的时间非常像0.12 + 0.22 ..

1)这只是"lazy copy on write",因为我写的是? 2)展望未来,有哪些选择? - 一个(凌乱的......)的全局变量? - 写一个矩阵句柄类(我真的必须吗?) (nested function way意味着需要进行一些重新设计才能生成X已知的嵌套函数(矩阵A带有该答案的符号)..)

1 个答案:

答案 0 :(得分:0)

也许这与您的问题有点相关,但如果这是一个性能关键的应用程序,我认为一个好的方法是将您的函数重写为mex文件。以下是http://www.mathworks.com/support/tech-notes/1600/1605.html#intro

的引用
  

编写MEX文件的主要原因是:...   速度;您可以将瓶颈计算(如for循环)重写为MEX文件以提高效率。

如果您不熟悉mex文件,上面的链接应该可以帮助您入门。将现有函数转换为C / C ++应该不会太困难。 MATLAB中包含的yprime.c示例与您尝试执行的操作类似,因为它被迭代地调用以计算ode45内的导数等。