在插入顺序已知时填充 Eigen3 稀疏矩阵的策略
Strategies for filling an Eigen3 sparse matrix when the order of insertion is known
所以在我的非线性有限元求解器中,我使用了 Eigen3 稀疏矩阵和 LDLT 分解。
问题是,这种因式分解需要在动态模拟期间多次执行,并且花费大量时间在基于三元组的迭代矩阵中插入系数(存储是保留的(。
关于如何利用稀疏性不变且插入顺序相同的事实,是否有任何好的策略?当形成这个矩阵,循环模型中的元素、耦合等时,在仿真过程中的每个时间步的插入顺序都是相同的。
使用 coeffref 将仿真时间延长了大约 10 倍。
我一直在考虑对模型进行单次传递并形成指向系数矩阵中相应位置的指针,但这似乎有点危险,特别是因为 LDLT 分解介于两者之间。
如果矩阵的稀疏模式没有在每个时间步长都改变,那么您可以使用valuePtr()
直接更改原始数据数组的值。这非常简单,如果需要,可以并行完成。如果你能弄清楚如何以线性方式做到这一点,即
SparseMatrix<double> A;
for(int i = 0; i < n; i++)
A.valuePtr()[i] = ...
然后它会愚蠢地快速(与避免缓存未命中和其他黑魔法有关(。至于之前关于LDLT分解不会改变的评论,从理论角度来看是正确的。但是,根据特征文档:
"在因式分解((中,计算系数矩阵的因子。每次矩阵的值更改时,都应调用此步骤。但是,矩阵的结构模式不应在多次调用之间更改。
https://eigen.tuxfamily.org/dox/group__TopicSparseSystems.html
我认为这是因为因子存储在求解器对象中,尽管我可能是错的。测试应该很容易以一种或另一种方式确认。也就是说,我认为您必须在更改值后调用factorize()
。不过,您仍然可以通过仅调用一次analyzePattern()
例程来节省大量时间。
相关文章:
- C++17中的并行执行策略
- 运行时执行策略不同
- 编译器上的策略数据结构不起作用
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- CLion 无法在 macOS 上找到 Eigen3
- 使用 Qt5 SQL 进行异步数据库访问的策略
- 在 Eigen3 中实现 Bartels-Stewart 算法 -- 仅实矩阵?
- C++基于策略的设计:继承与组合
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 如何删除 Eigen3 矩阵中某些不连续的行和列?
- 当PSO细粒度策略对使用AdsGetObject MSDN API的Windows操作系统生效时,如何获取用户密码到期日
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 如何实例化基于输入的策略模式
- 使用策略模式设计软件时出现的问题
- 在发送源代码时省略未使用的boost src文件的策略
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 在插入顺序已知时填充 Eigen3 稀疏矩阵的策略