10

我正在使用 ublas::Compressed Matrix 与稀疏线性求解器 UMFPACK 一起工作。由于我正在进行模拟,因此每次线性系统的构造都略有不同,这可能涉及放大/缩小系数矩阵和一些稀疏矩阵乘法。线性系统的规模约为 25k。

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

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

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

干杯。

4

4 回答 4

1

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

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

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

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

于 2010-12-18T13:51:47.000 回答
0

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

于 2012-03-21T08:11:44.153 回答
0

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

于 2011-05-21T06:32:40.757 回答
0

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

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

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

最好的,乌姆特

于 2010-12-10T15:45:36.573 回答