在特征库Compute()中执行analyzePattern()和factorize()的成本

时间:2017-03-07 09:21:03

标签: c++ eigen

我指的是Eigen文档中的The Compute Step部分:

  

compute()函数中,矩阵通常是分解的:

     

...

     

准确地说,对于这类求解器,   计算步骤进一步细分为analyzePattern()和   factorize()

     

analyzePattern()的目标是重新排序。的非零元素   矩阵,使分解步骤产生较少的填充。这个   步骤仅利用矩阵的结构。 因此,结果   此步骤可用于矩阵具有的其他线性系统   相同的结构。 ....

     

factorize()中,计算系数矩阵的因子。   每次矩阵的值发生变化时,都应调用此步骤。   但是,矩阵的结构模式不应该改变   多次通话之间。

analyzePattern()

的文档
  

计算列排列以最小化填充

     
      
  • 将此排列应用于输入矩阵 -
  •   
  • 计算置换矩阵
  • 上的列消除树   
  • 对排除树和列排列进行后序排列
  •   

factorize()

  

数值分解与符号分解On交错   退出,信息是

     

= 0:成功分解

     

0:如果info = i,我就是

     

< = A-> ncol:U(i,i)正好为零。分解具有        已完成,但因子U完全是单数,        如果它用于解决a,则会出现除零        方程组。

     
    

A-> ncol:内存分配时分配的字节数         发生故障,加上A-> ncol。如果lwork = -1,那就是         所需的估计空间量加上A-> ncol。

  

我的问题是,我们是否知道调用analyzePattern()factorize()的相对费用?

这个问题对我很重要,因为我的应用程序具有稳定的矩阵结构,但不断改变系数矩阵。示例:在FEM模型中,FEM用户经常保持元素连接不变,但始终更改元素大小以获得最佳设计。

因此,如果analyzePattern()factorize()贵很多,那么我可以利用这个事实并重写我的代码。如果不是,我可以坚持使用compute()函数,并在每次元素大小更改时重新运行analyzePattern()

1 个答案:

答案 0 :(得分:1)

这很大程度上取决于矩阵的结构。根据我的经验,符号部分通常比数字部分便宜得多,但是,根据对此answer的评论,它有时是相反的。所以我担心在你替补之前你永远不会知道。