【问题标题】:Matlab inverse of large matrix大矩阵的Matlab逆
【发布时间】:2013-02-28 17:54:17
【问题描述】:

这是我要解决的方程式:

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

其中 X 是矩阵,y 是向量((X'X)^-1 是 X 转置乘以 X 的倒数)。我在 Matlab 中将其编码为:

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

我认为这是正确的。问题是 X 大约是 10000x10000,即使是我能找到的最强大的计算机(16 核,24GB RAM),试图计算这个逆也会使 Matlab 崩溃。有什么办法可以将其拆分,或者有一个专为进行如此大的反转而设计的库吗?

谢谢。

【问题讨论】:

  • 矩阵有多大?你能告诉我向量 y 和矩阵 X。或者至少让我知道它是什么样的吗?
  • Xy的维度是多少?如果维度非常高,您可能需要计算逆的近似值。你不会错过一些*s btw 吗?
  • 已编辑问题的信息。 X 约为 10,000x10,000。向量 y 的维度匹配(也大约 10,000 长)。
  • 你知道矩阵的结构吗?就像它的稀疏等?顺便说一句,我认为您可以使用 inv() 函数代替 '\',因为 '\' 解决了最小二乘问题(伪逆)
  • 是稀疏的吗?你需要保持double 精度吗?你可以使用 gpu 吗?

标签: matlab matrix-inverse


【解决方案1】:

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

h = X \ y;

【讨论】:

    【解决方案2】:

    我生成了一个随机 10,000 x 10,000 矩阵 X 和一个随机 10,000 x 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;
    

    【讨论】:

    • randi 正在创建 1-10000 范围内的单个值,而不是 10,000x10,000 矩阵。最终的解决方案应该是一个向量。
    • 我的错!完全查找 randint 语法!我会更新我的答案。
    • 谢谢。不过,我需要实现代码的方式存在一个小问题:我需要将相同的 X 应用于 y 向量的许多不同值,并且我不想每次都进行反转。所以,直到最后一步才能引入 y。
    【解决方案3】:

    如果您有多台机器可供使用,并且您可以按照@Ben 的建议将您的问题重新转换为h = X\y 的形式,那么您可以使用分布式数组。 This demo 展示了如何做到这一点。

    【讨论】:

      【解决方案4】:

      约旦, 您的方程式正是“摩尔-彭罗斯矩阵逆”的定义。

      检查:http://mathworld.wolfram.com/Moore-PenroseMatrixInverse.html

      直接使用h = X \ y; 应该会有所帮助。 或者查看 Matlab pinv(X)*y

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多