有没有有效的方法来动态更改boost中的compress_matrix?

时间:2010-11-15 19:22:34

标签: c++ boost sparse-matrix solver umfpack

我正在使用ublas :: Compressed Matrix来处理UMFPACK,一种稀疏线性求解器。由于我正在进行模拟,所以每次线性系统的构造都略有不同,可能涉及扩大/缩小系数矩阵和一些稀疏矩阵乘法。线性系统的规模约为25k。

即使有一个绑定补丁用于使用UMFPACK,我仍然需要不时更改矩阵,有时甚至计算非零值的数量将是耗时的(理想情况下,我必须在初始化矩阵时给出非零值的数量。另外,我使用ublas :: range动态追加列/行。

所以我的问题是:有没有有效的方法来做到这一点?现在对我来说太慢了。转换尺寸为15k的矩阵成本接近6s并且附加大约12k行是很快的(因为我猜它是行主矩阵),但是将相同数量的列附加到矩阵可能花费多达20s(我想同样的如上所述,所以即使我使用了列主矩阵,所需的总时间也是相同的。)

有点在这里绝望。欢迎提出任何建议。

干杯。

4 个答案:

答案 0 :(得分:1)

我不熟悉您的软件包,但为什么(理想情况下)必须指定矩阵中非零元素的数量?你不能过度指定然后缩小规模吗?

我也很困惑为什么添加列应该花费这么多。稀疏格式应该能够处理它。我会得出结论,发生了两件事之一。你的矩阵在被转换回来之前以某种方式被转换为非稀疏矩阵(看起来很糟糕,在任何体面的稀疏矩阵包中都是不可能的)或插入的代码是二次的,因为它重复插入值,每个都转移到其他所有时间。

后者似乎很可能。我会尝试滚动我自己的“插入列”代码,该代码采用当前的稀疏矩阵,计算出有多少条目,分配更大的块,并按顺序复制,随时插入新列。这是线性的,基本上应该是瞬时的。我不知道这是否足以解决整个问题,但它应该是一个开始。

此外,如果矩阵具有大约25k个条目的顺序,则没有合理的答案为什么复制它或转置它应该花费超过几毫秒。我认为您需要对此问题的各个部分进行基准测试,并确切地确定时间的确切位置,除非上述添加列的解决方案能够解决您的问题。

答案 1 :(得分:0)

每次如何构建矩阵,你是否从某种不同的软件接口。在这种情况下,花在接口上的时间我估计非常低。

你使用-DNDEBUG标志,对于uBlas,对吗?

我不确定问题是什么......

最佳,了Umut

答案 2 :(得分:0)

您是否考虑将它们保存在单独的矩阵中并使用现有的求解器例程构建自己的整体求解器,而不是通过连接几个不同的值集来构造A?基本上,您可以将适当的分解(LU,QR等)应用于一个组件矩阵,对后续组件运行相应的更新/转换,并对每个后续矩阵重复。然后,您将使用因式分量矩阵来计算解决方案。目前尚不清楚你一直在使用的库是否会直接支持这个,或者你是否必须自己编写部分/全部数值例程。

答案 3 :(得分:0)

您是否尝试过Eigen这类问题?最近他们完成了稀疏矩阵支持。