大矩阵的Matlab求逆

4

这是我要解决的方程:

h = (X'*X)^-1*X'*y

其中 X 是一个矩阵,y 是一个向量((X'X)^-1 是 X 转置乘以 X 的逆)。我已经在 Matlab 中编写了以下代码:

h = (X'*X)\X'*y

我认为这是正确的。问题在于X的大小约为10000x10000,尝试计算其逆矩阵会导致Matlab崩溃,即使使用最强大的计算机(16核,24GB RAM)也无法解决。是否有将其拆分或专门用于处理如此大的逆矩阵的库的方法?

谢谢。


矩阵有多大?你能给我展示一下向量y和矩阵X吗?或者至少让我了解一下它们的情况? - Derek W
Xy的维度是多少?如果维度非常高,您可能需要计算逆矩阵的近似值。顺便问一下,您不会错过一些*吧? - sfotiadis
编辑后的问题附带信息。X 的大小约为 10,000x10,000。向量 y 的维度匹配(也约为 10,000)。 - Jordan
你了解矩阵的结构吗?比如说它是否是稀疏矩阵?顺便说一句,我认为你可以使用inv()函数代替'',因为''用于解决最小二乘问题(伪逆)。 - amas
它是稀疏的吗?您需要保持双精度吗?您有GPU访问权限吗? - bla
显示剩余2条评论
4个回答

1

这看起来像是一个伪逆矩阵。也许你只是在寻找

h = X \ y;

0
如果您有多台计算机可供使用,并且可以按照@Ben提出的形式将问题重新表述为h = X\y,那么您可以使用分布式数组。此演示展示了如何实现这一点。

0

0

我生成了一个随机的10,000乘以10,000的矩阵X和一个随机的10,000乘以1的向量y。

我按步骤分解了我的计算过程。(代码如下)

  1. 计算转置并将其保存在矩阵K中
  2. 然后通过将K乘以X来计算矩阵A
  3. 通过将K乘以向量y来计算向量b
  4. 最后,我使用反斜杠运算符在A和b上进行求解

我没有遇到计算问题。虽然需要一些时间,但将操作分解为尽可能小的组有助于防止计算机被压垮。但是,这可能与您使用的矩阵的组成有关(例如,稀疏矩阵、小数等)。

X = randi(2000, [10000, 10000]);
y = randi(2000, 10000, 1);
K = X';
A = K*X;
b = K*y;
S = A\b;

3
randi会在1-10000范围内生成单个值,而不是一个10,000x10,000的矩阵。最终结果应该是一个向量。 - Jordan
我的错误!我完全查错了randint的语法!我会更新我的答案。 - Derek W
谢谢。然而,我需要实现代码的方式有一个小问题:我需要将同样的X应用于许多不同的y向量值,并且我不想每次都要反转。因此,在最后一步之前不能引入y。 - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接