2010-11-15 69 views
10

我正在使用ublas :: Compressed Matrix与UMFPACK(一种稀疏线性求解器)一起工作。由于我正在做一个模拟,所以每当线性系统的构造略有不同时,可能会涉及放大/缩小系数矩阵和一些稀疏矩阵乘法。线性系统的规模约为25k。是否有任何有效的方法来动态更改boost中的compress_matrix?

即使有升压与UMFPACK工作,我还需要矩阵从不时改变,有时甚至搞清楚非零值的数量将是耗时的(理想情况下,我有一个结合补丁当我初始化矩阵时给出非零值的数量)。另外,我使用ublas :: range来动态追加列/行。

所以我的问题是:是否有任何有效的方式做到这一点?现在对我来说太慢了。转换一个像15k这样的维度的矩阵花费将近6秒,并且附加大约12k行很快(因为我猜它是一个行主矩阵),但是将相同数量的列附加到矩阵可能花费20s(我想对于相同的原因如上所以,即使我使用了列主矩阵,所需的总时间也是相同的)。

有点在这里变得绝望。任何建议都是值得欢迎的。

干杯。

+0

由于我有近30个意见,但没有答案,我想也许我的问题不是很清楚。所以这里有一些细节。 – He01 2010-11-16 10:59:17

+0

由于我正在做模拟,每一个时间步骤,我已经组装了一个线性系统并解决它,它基本上只是AX = B。然而,系数矩阵A通常由三个矩阵组成。一个权重矩阵,分别为软约束和硬约束的两个系数矩阵,不能预先计算。 (见下一条评论) – He01 2010-11-16 11:08:06

+0

因为求解线性系统是最小二乘函数最小化的结果,所以我必须做一个矩阵 - 矩阵乘法来产生一个矩阵T和一个矩阵 - 向量相乘以使得B线性系统的软约束矩阵。然后,我必须将硬约束矩阵附加到T的底部和右边以便使A生成。最后,在A和B完成之后,我可以将它们输入到UMFPack中(请参见下一条评论)。 – He01 2010-11-16 11:08:22

回答

0

你怎么每次都构建矩阵,你是从某种不同的软件的接口。在这种情况下,花费在接口上的时间是我认为很低。

你使用-DNDEBUG标志,为的uBLAS,对不对?

我不知道仍然是什么问题...

最佳,了Umut

+0

嗨乌穆特,感谢您的关注,我会更多地进行测试,并尝试在这里给出一个完整的图片。 – He01 2011-01-02 18:01:29

1

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

我也明白为什么添加列应该花费这么多的困惑。稀疏格式应该能够处理该格式。我会断定有两件事情正在发生。无论是你的矩阵在被转换回来之前都被转换为非稀疏矩阵(在任何体面的稀疏矩阵包中看起来很可怕,也不可能),或者插入的代码是二次的,因为它重复插入值,时间。

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

此外,如果基体具有25K条目的顺序上,没有合理的答案,为什么将其复制或调换它应该不会超过几毫秒以上。我认为你需要对这个问题的各个部分进行基准测试,并且确切地确定时间到了哪里,除非上述添加列的解决方案解决了你的问题。

+0

谢谢Dov,从那以后我一直很忙,让问题在那里停留了一段时间。我会一点一点地尝试你的建议。 – He01 2011-01-02 18:00:49

+0

Hi Dov,对于转置部分,我尝试转置行主稀疏矩阵并将其分配给行主稀疏矩阵,这比将其分配给列主稀疏矩阵要慢得多。我想不管怎么说,换位时也可能会改变内部表示。 – He01 2011-02-09 15:11:06

0

而不是通过连接几个不同的价值观的构建,你有没有考虑让他们在不同的矩阵,并利用现有的解算器例程来构建自己的整体求解?基本上,您可以将适当的分解(LU,QR,无论)应用于一个组件矩阵,对随后的组件运行相应的更新/转换,并对每个后续矩阵重复。然后,您将使用因式分解矩阵来计算您的解决方案。但是,你一直在使用的库是否会直接支持这个库,或者你是否必须自己编写一些/所有的数值例程,这并不清楚。

0

你有没有试过Eigen这种问题?最近他们完成了稀疏矩阵的支持。

相关问题