2014-11-25 118 views
2

我感兴趣的是使用特征来求解稀疏矩阵方程。迭代求解器需要在每次迭代期间用中间值更新的许多“划痕”向量。据我所知,当使用迭代求解器如共轭梯度法时,这些向量通常在开始迭代之前分配一次,然后在每次迭代时重复使用以避免频繁重新分配。就我看到的ConjugateGradient类而言,Eigen可以在每次迭代时重新分配内存。能否熟悉Eigen的人告诉我,我的理解是否正确?看起来有可能在分配过程中出现了某种聪明的节省内存的方案,其结果是内存每次都不会实际重新分配,但是我挖了下来,找不到这样的东西。或者,如果Eigen确实在每次通过循环时都重新分配内存,那么与进行实际计算所需的时间相比,这是否是一种无关紧要的负担?Eigen中的迭代求解器在每次迭代中分配内存吗?

回答

0

你在哪里看到重新分配?正如您在源code中看到的那样,四个帮手向量residual,p,ztmpwhile循环之外(即迭代发生之前)被声明和分配。此外,记得征是一个表达式模板库,这样一行代码:

x += alpha * p; 

并注意创建任何暂时的。总之,不,Eigen的CG实现不会在迭代中执行任何(重新)分配。

+0

你说得很对 - 谢谢你让我变直!我误解了代码。我也关注 p = z + beta * p;但我发现Eigen有相当不错的线性代数表达式模板(http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html) – 2014-11-25 22:49:00