计算一个非常大的矩阵的逆

时间:2012-05-09 22:27:31

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

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

提前致谢

P.S
我应该将矩阵的大小更正为21500x21500。正如UmNyobe所说,这不是一个方阵。它实际上是观察矩阵, X ,我试图计算( X T X -1

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

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

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

5 个答案:

答案 0 :(得分:6)

假设矩阵方形,你可能正在寻找的是就地矩阵求逆算法。

您应该查看this

答案 1 :(得分:5)

您不能反转非方矩阵。

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

答案 2 :(得分:4)

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

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

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

如果库正在使用Strassen算法,这需要额外的相同大小的内存,那么你将前一个数字增加一倍。

因此,使用Strassen或高斯反转这种尺寸的双基矩阵将花费1.9 GB。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

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