【发布时间】: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