【问题标题】:inverse of a large block diagonal sparse matrix in rr中大块对角稀疏矩阵的逆
【发布时间】:2014-04-04 17:59:11
【问题描述】:

我想计算一些大块对角稀疏矩阵的逆。 行数和列数略超过 50,000。 这些块是 12 x 12 并且是稀疏的(27 个非零元素)。

我尝试计算整个矩阵的逆矩阵(使用求解)​​。这是不可能的,整个矩阵太大了。

之后,我使用了一个 for 循环。在每次迭代中,我取出一个块,计算其逆并将其放回原处。

该方法有效,但我需要大约 5 分钟。 我想知道是否有更快的方法。

非常感谢。

【问题讨论】:

  • 我想你可能会考虑在scicomp.SE 中提问,但他们可能只会告诉你不要反转任何大矩阵。为什么需要逆?顺便说一句,它这么慢的原因是移除块并将它们放回原处很慢。数学运算很快。
  • 您是否已经在使用稀疏矩阵和Matrix 包中的方法?你的问题还不清楚。
  • 是的,这是真的;一个 dgCMatrix

标签: r block sparse-matrix inverse diagonal


【解决方案1】:

你如何得到一个 50k x 50k 的矩阵?

反转 12 x 12 既简单又快捷。是反转导致矩阵对象的缓慢还是访问?

你打算如何处理你的大反转?

【讨论】:

  • 访问矩阵对象会导致缓慢...多次选择该矩阵的一个块
  • 我想这样做的原因并不容易解释......我想使用二次优化。我可以使用一个非常快速的模块来解决 (min (x* - x)'(x*-x) ) 形式的问题,部分用 C+ 编程。我的问题有点困难。它具有更一般的形式 min x'A'x + cx。我使用矩阵逆将我的问题转换为更简单的问题 min (x* - x)'(x*-x) )。我知道有一些 R 模块 Quadprog 可以解决更一般的二次程序,但它不如我的软件解决更简单的问题。
【解决方案2】:

我用代码写得更快,作者:

1) 将块对角矩阵的逆矩阵存储在列表中,而不是将它们放回大矩阵中。最后,我使用 bdiag() 命令从列表中构建了整个矩阵。 2) 不是一个一个地考虑块对角矩阵,而是以大约 10 个为一组 因此,我反复计算由 10 个块对角矩阵组成的子矩阵的逆。

在最初的问题中,我没有说我不仅取每个块的逆,而且我还在每个块上应用了一些变换。现在提前对整个块对角矩阵进行变换,也节省了时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多