计算非常大的矩阵的逆运算
Calculating inverse of a very large matrix
我正在尝试在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
使用迭代算法,可以在上述等式中找到给定X
和v
w
,而无需反转X
。我想到的一种可能性是使用共轭梯度方法。该算法可以在大约 10 行中实现,并且只需要能够使用给定的向量y
计算乘积(X^T X) y
。在我们的例子中,这甚至可以分两步完成,即计算z := X y
和第二步X^T z
,这将节省空间,因为您不需要存储产品X^T X
。
尽管在 64 位计算机上编译程序,但还应确保使用正确的 64 位库。否则,程序可能会以 32 位编译,您仍然会遇到相同的内存问题。
至于逆函数的计算,OpenCV的逆函数可能会有所帮助。确保使用逆DECOMP_SVD,因为我发现它对近奇异矩阵更有效。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 计算非常大的矩阵的逆运算