我有一个返回大向量的函数,并且被多次调用,在调用之间进行一些逻辑,这使得矢量化不是一个选项。
该功能的一个例子是
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带有该答案的符号)..)
答案 0 :(得分:0)
也许这与您的问题有点相关,但如果这是一个性能关键的应用程序,我认为一个好的方法是将您的函数重写为mex文件。以下是http://www.mathworks.com/support/tech-notes/1600/1605.html#intro,
的引用编写MEX文件的主要原因是:... 速度;您可以将瓶颈计算(如for循环)重写为MEX文件以提高效率。
如果您不熟悉mex文件,上面的链接应该可以帮助您入门。将现有函数转换为C / C ++应该不会太困难。 MATLAB中包含的yprime.c示例与您尝试执行的操作类似,因为它被迭代地调用以计算ode45内的导数等。