我有兴趣使用Eigen来求解稀疏矩阵方程。迭代求解器需要许多“划痕”向量,这些向量在每次迭代期间用中间值更新。据我了解,当使用迭代求解器(如共轭梯度法)时,这些向量通常在开始迭代之前分配一次,然后在每次迭代时重复使用以避免频繁的重新分配。据我所知,通过查看ConjugateGradient类,Eigen会在每次迭代时重新分配内存。熟悉Eigen的人能否告诉我,我的理解是否正确?似乎有可能在分配过程中有一些聪明的内存节省方案,结果是每次都没有实际重新分配内存,但我挖了下来,找不到这样的东西。或者,如果Eigen确实在每次通过循环时重新分配内存,那么与实际计算所需的时间相比,它是否是一个非实质性的负担?
答案 0 :(得分:0)
你在哪里看到重新分配?正如您在源代码code中看到的那样,四个辅助向量residual
,p
,z
和tmp
被声明并在{{{{}}之外分配1}}循环,即迭代发生之前。此外,回想一下,Eigen是一个表达式模板库,所以行代码为:
while
注意创建任何临时的。总之,不,Eigen的CG实现不会在迭代中执行任何(重新)分配。