10

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

提前致谢

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

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

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

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

4

5 回答 5

6

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

你应该看看这个

于 2012-05-09T22:35:31.880 回答
5

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

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

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

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

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

于 2012-05-09T22:51:45.440 回答
5

您不能对非方阵求逆。

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

于 2012-05-09T22:33:57.670 回答
2

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

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

使用迭代算法,可以在上面的等式中找到w给定的X而无需反转。我想到的一种可能性是使用共轭梯度方法。这个算法可以用大约 10 行来实现,并且只需要能够计算给定向量的乘积。在我们的例子中,这甚至可以分两步完成,即计算和第二步,这将节省空间,因为您不需要存储产品。v X(X^T X) yyz := X yX^T zX^T X

于 2012-07-31T13:39:43.303 回答
0

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

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

于 2013-07-21T09:40:15.590 回答