首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当插入顺序已知时填充Eigen3稀疏矩阵的策略

当插入顺序已知时填充Eigen3稀疏矩阵的策略
EN

Stack Overflow用户
提问于 2019-09-04 12:58:25
回答 1查看 154关注 0票数 0

因此,在我的非线性有限元求解器中,我使用了Eigen3稀疏矩阵和LDLT分解。

问题是,这种因式分解在动态仿真中需要多次执行,并且需要花费大量的时间将系数插入到基于三叉图的迭代矩阵中(存储是保留的)。

对于如何利用稀疏性不变和插入顺序相同这一事实,有什么好的策略吗?在形成该矩阵时,在模型中对单元、耦合等进行循环,在仿真过程中的每一时刻插入顺序是相同的。

使用coeffref增加了大约10倍的模拟时间。

我一直在考虑对模型进行一次传递,并直接形成指向系数矩阵中各自位置的指针,但这似乎有点危险,特别是因为LDLT分解是在两者之间运行的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 18:30:37

如果矩阵的稀疏模式没有在每个时间步骤中发生变化,那么您可以使用valuePtr()直接更改原始数据数组的值。这是非常简单的,如果需要的话可以并行进行。如果你能搞清楚如何用线性的方式来做这件事,比如

代码语言:javascript
运行
复制
SparseMatrix<double> A;

for(int i = 0; i < n; i++)
   A.valuePtr()[i] = ...

然后它会愚蠢的快(与避免缓存,失误和其他黑魔法有关)。至于前面关于LDLT因式分解不会改变的评论,从理论的角度来看,这是正确的。然而,根据特征文件:

在因式分解()中,计算系数矩阵的因子。这一步应在矩阵的值变化__时调用。然而,矩阵的结构模式不应在多次调用之间发生变化。

TopicSparseSystems.html

我认为这是因为这些因素存储在求解器对象中,尽管我可能错了。一个测试应该是相当容易确认的方式。尽管如此,我认为您必须在更改值之后调用factorize()。不过,只要调用一次analyzePattern()例程,就可以节省大量时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57788939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档