微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

|| 我有一个返回大向量的函数,该函数被多次调用,两次调用之间发生了一些逻辑,使得向量化不是一种选择。 该功能一个示例是
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.12s,a(:)= X(:,i)的时间为0.22s。正如预期的那样,在“'zeros \'”行中每次调用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,a);    end
令我惊讶的是,在g内部进行的性能分析仍然显示在a(:)= X(:,i)处以相同的数量分配了内存;线,并且花费的时间非常像0.12 + 0.22s。 1)这是因为我正在写一个,所以只是“写入时可以复制”吗? 2)展望未来,有哪些选择? -(messy ..)的全局变量? -编写矩阵句柄类(真的吗?) (嵌套函数的方式意味着要进行大量的重新设计,以制作一个已知X的嵌套函数(矩阵A带有该答案的符号)。)     

解决方法

        也许这与您的问题有些关系,但是如果这是对性能至关重要的应用程序,我认为最好的方法是将函数重写为mex文件。这是来自http://www.mathworks.com/support/tech-notes/1600/1605.html#intro的报价,   编写MEX文件的主要原因是:...   速度;您可以将瓶颈计算(如for循环)重写为MEX文件以提高效率。 如果您不熟悉mex文件,则上面的链接应该可以帮助您入门。将现有函数转换为C / C ++应该不会太困难。 MATLAB附带的yprime.c示例与您尝试执行的操作类似,因为它被迭代调用以计算ode45等内部的导数。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。