【问题标题】:Calculating inverse of a very large matrix计算一个非常大的矩阵的逆
【发布时间】:2012-05-09 22:27:31
【问题描述】:

我正在尝试在 C++ 中计算一个非常大的矩阵 (11300x21500) 的逆矩阵。到目前为止,我已经尝试过 Eigen 和 Armadillo 库,但在初始化阶段都失败了,说内存不足。有什么办法可以克服这种情况吗?

提前致谢

附言
我应该将矩阵的大小更正为 21500x21500。正如 UmNyobe 所建议的,这不是方阵。它实际上是观察矩阵,X,我正在尝试计算 (XTX)-1

我有一个 8GB 内存(在 64 位系统中),但我不认为我正在使用所有这些内存空间。任务管理器显示出错时的内存使用量为1GB。可能在 Windows7 中有一个操作系统命令,当应用程序的内存使用量超过 1GB 时会关闭它。

顺便说一句,我最初的目的是对这个观察矩阵进行回归。

还有一件事:观察矩阵 X 的每一行中的大多数列都为零。有没有办法利用这一点来限制反转操作中的内存使用?

【问题讨论】:

  • 为什么你的尺寸不相等??
  • 该矩阵包含大约 1GB 或 2GB 的数据,具体取决于您是 4 字节还是 8 字节矩阵条目。你是在 32 位机器上吗?
  • Steve 我本来要写关于内存的,你应该先写得更详细。
  • 你的意思是伪逆吗?为什么要计算逆?如果是用于线性回归,我建议使用其他技术。
  • 我认为您需要告诉我们更多关于您尝试执行此计算的机器的信息 - 例如内存、32 位或 64 位等。完成后重新打开的标志。

标签: c++ sparse-matrix matrix-inverse


【解决方案1】:

假设矩阵 是正方形的,那么您可能正在寻找一个就地矩阵求逆算法。

您应该查看this

【讨论】:

    【解决方案2】:

    您不能对非方阵求逆。

    http://en.wikipedia.org/wiki/Invertible_matrix

    【讨论】:

    • 即使它是方形的,内存在 32 位硬件上仍然很重要
    • 我已经更正了规范,它是一个 21000x21000 维度的方阵。
    • 我认为他想要一个 Moore-Penrose 伪逆,你可以采用非方阵。
    【解决方案3】:

    假设(11300 x 11300) 整数矩阵(32 位),你有

    4*(11300^2)/(1024^3) = 0.4757 GB
    

    如果您使用双精度,则将该数字加倍。

    如果库使用的是 Strassen 算法,这需要相同数量级的额外内存,则将之前的数字加倍。

    因此,使用 Strassen 或 gaussian 反转这种大小的双基矩阵将花费您 1.9 GB。

    【讨论】:

    • 所以他需要提供他正在使用的机器的详细信息。例如,他将无法在 32 位机器上反转 21500x21500...
    • 感谢您的意见。作为我的机器规格,我有 8gb 内存(在 64 位系统中)。但就我可以使用任务管理器跟踪内存使用情况而言,当使用的内存为 1gb 时,windows 会关闭应用程序。至少,这是任务管理器显示的数量。这实际上发生在取反之前。应用程序在矩阵的初始化阶段给出错误
    【解决方案4】:

    我想提出另一种解决方案,该解决方案仅在您对矩阵本身的逆不感兴趣但对逆与向量的乘积不感兴趣时​​才有效。例如,假设您想找到向量v 的逆乘积,即w := (X^T X)^{-1} v。在这种情况下,您实际上是在寻找问题的解决方案

    Find w such that (X^T X) w = v
    

    使用迭代算法,可以在上面的等式中找到w 给定Xv无需反转 X。我想到的一种可能性是使用Method of Conjugate Gradients。该算法可以在大约 10 行中实现,并且只需要能够计算具有给定向量 y 的乘积 (X^T X) y。在我们的例子中,这甚至可以分两步完成,即计算 z := X y 和第二步 X^T z,这将节省空间,因为您不需要存储产品 X^T X

    【讨论】:

      【解决方案5】:

      虽然您是在 64 位机器上编译程序,但您还应确保使用正确的 64 位库。否则,程序可能编译为 32 位,您仍然会遇到同样的内存问题。

      至于逆的计算,OpenCV的逆函数可能会有所帮助。确保使用 DECOMP_SVD 逆,因为我发现它对近奇异矩阵更有效。

      【讨论】:

        猜你喜欢
        • 2019-02-24
        • 2017-07-06
        • 2021-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-04-12
        • 1970-01-01
        • 2015-01-10
        • 1970-01-01
        相关资源
        最近更新 更多