C++ 在boost中有没有有效的方法来动态更改压缩矩阵?

C++ 在boost中有没有有效的方法来动态更改压缩矩阵?,c++,boost,sparse-matrix,solver,umfpack,C++,Boost,Sparse Matrix,Solver,Umfpack,我正在使用ublas::Compressed Matrix来处理UMFPACK,一个稀疏线性解算器。因为我在做模拟,所以每次线性系统的构造都略有不同,这可能涉及到放大/缩小系数矩阵和一些稀疏矩阵乘法。线性系统的规模约为25k 即使有一个绑定补丁让boost与UMFPACK一起工作,我仍然需要不时地更改矩阵,有时甚至计算非零值的数量也很耗时(理想情况下,我必须在初始化矩阵时给出非零值的数量)。此外,我还使用ublas::range动态追加列/行 所以我的问题是:有什么有效的方法可以做到这一点吗?现

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

即使有一个绑定补丁让boost与UMFPACK一起工作,我仍然需要不时地更改矩阵,有时甚至计算非零值的数量也很耗时(理想情况下,我必须在初始化矩阵时给出非零值的数量)。此外,我还使用ublas::range动态追加列/行

所以我的问题是:有什么有效的方法可以做到这一点吗?现在对我来说太慢了。转置一个维度为15k的矩阵需要花费近6s的时间,追加12k行的速度很快(因为我猜这是一个行主矩阵),但向矩阵追加相同数量的列可能需要花费20秒(我猜原因与上面相同,所以即使我使用了列主矩阵,所需的总时间也会相同)

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


干杯。

每次你是如何构建矩阵的,你是从某种不同的软件进行接口的。在这种情况下,我想花在接口上的时间是相当少的

对于uBlas,您使用-DNDEBUG标志,对吗

我还不确定问题出在哪里


最好的是,Umut

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

我还对为什么添加列要花这么多钱感到困惑。稀疏格式应该能够处理这个问题。我的结论是,有两件事正在发生。要么你的矩阵在被转换回来之前被转换成了非稀疏矩阵(这看起来很可怕,在任何一个像样的稀疏矩阵包中都是不可能的),要么插入的代码是二次的,因为它会重复插入值,每次都会在所有其他值上移动

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


此外,如果矩阵有25k个条目,那么没有合理的答案来解释为什么复制或转置它需要超过几毫秒。我认为您需要对这个问题的各个部分进行基准测试,并真正确定时间的准确方向,除非上述添加列的解决方案解决了您的问题。

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

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

因为我有将近30个观点,但没有答案,我想我的问题可能不是很清楚。这里有一些细节。因为我在做模拟,对于每一个时间步,我都会组装一个线性系统并求解它,基本上就是AX=B。然而,系数矩阵a通常由三个矩阵组成。一个权重矩阵,两个系数矩阵,分别用于软约束和硬约束,不能预先计算。(见下一条评论)因为求解线性系统是在最小二乘意义下最小化二次函数的结果,所以我必须进行矩阵乘法以得到矩阵T,矩阵向量乘法以得到B,从而将软约束矩阵与线性系统积分。然后,我必须将硬约束矩阵附加到T的底部和右侧,以生成A。最后,在A和B完成后,我可以将它们输入到UMFPack中。(参见下一条注释)正如您所想象的,必须有几个操作涉及数据复制、矩阵转置和调整大小。但我只是不知道如何让它更快。代码太长,不能放在这里。谢谢你抽出时间。既然还没有答案,谁能至少告诉我问题的哪一部分不够清楚吗?欢迎评论!谢谢Dov,从那以后我一直很忙,让问题在那里持续一段时间吧。我会一块一块地尝试你的建议。嗨,多夫,对于转置部分,我尝试转置一个行主稀疏矩阵并将其分配给行主稀疏矩阵,这比将其分配给列主稀疏矩阵慢得多。我想在转置时,内部表示也可能发生了变化。嗨,Umut,谢谢你的关注,我将对它进行更多的测试,并尝试在这里给出一个完整的图片。