计算非常大的矩阵的逆运算

Calculating inverse of a very large matrix

本文关键字:逆运算 计算 非常      更新时间:2023-10-16

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

提前致谢


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

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

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

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

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

你应该看看这个。

不能反演非方阵。

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

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

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

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

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

因此,用斯特拉森或高斯反转这种大小的基于双精度的矩阵将花费您 1.9 GB。

我想

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

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

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

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

至于逆函数的

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