【问题标题】:How to avoid allocating memory for the returned value each time a function is called如何避免每次调用函数时为返回值分配内存
【发布时间】:2016-07-01 05:02:01
【问题描述】:

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

函数的一个例子是

function a=f(X,i)

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

end

我正在做

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

在分析此 (size(X,1)=5.10^5, n=100 ) 时,零线的时间为 0.12 秒,第二行的 a(:)=X(:,i) 时间为 0.22 秒。正如预期的那样,在“零”行中每次调用 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.22s..

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

【问题讨论】:

  • 最终我将不得不用 C++ 重写所有内容,将 n 循环包装在 MEX 文件中似乎很多工作 atm,因为实际情况是这样的: function fhandle=get_functor(X) fhandle =@f1; %X 实际上是 f1 函数中的一个参数 s=f1(i) s=sin(X./i); end end %begin script %X 以各种不同的方式定义(“代码 factorization”) f=get_functor(X);所以我想为 n 循环使用 MEX 文件,我需要让那个 C 函数知道 X。实际情况是我为几十个不同的 X 执行此操作,并且喜欢添加更多/取出一些只是为了测试东西..

标签: matlab


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多