0

我有一个矩阵 D,它是 m*n,我正在使用公式 inv(D'*D)*D' 计算伪逆,但它不会产生与 pinv(D) 相同的结果。我需要术语 inv( D'*D) 我需要增量操作。我的所有准确性都取决于不正确的 inv(D'*D)。有没有其他方法可以准确地获得 inv(D'*D) ?有人能帮帮我吗?

% D 是我从一个博客中复制的 3x4 矩阵,仅用于演示目的。其实我原来的一个也有同样的问题,但它的尺寸太大,我不能在这里发布。

D = -[1/sqrt(2) 1 1/sqrt(2) 0;0 1/sqrt(2) 1 1/sqrt(2);-1/sqrt(2) 0 1/sqrt(2) 1];

    B1 = pinv(D)
    B2 = D'*inv(D*D')

    B1 =

      -0.353553390593274   0.000000000000000   0.353553390593274
      -0.375000000000000  -0.176776695296637   0.125000000000000
      -0.176776695296637  -0.250000000000000  -0.176776695296637
       0.125000000000000  -0.176776695296637  -0.375000000000000

    Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
    1.904842e-017. 

    B2 =

      -0.250000000000000                   0   0.500000000000000
      -0.500000000000000                   0                   0
       0.250000000000000  -0.500000000000000                   0
                       0                   0  -0.750000000000000

我需要 inv(D'D) 进行增量操作。实际上在我的第 1 步问题中,每次都会在 D 的最后一个位置添加一个新行,并且在第 2 步中 D 的第一行将被删除。所以我想使用我在这两个步骤之前计算的逆找到最终的 D 逆。更确切地说,看看这里:

B = inv(D'*D); % if i can calculate it accurately then further work is as follows
D1 = [D;Lr];  %Lr is last row to be added
BLr = B-((B*Lr'*Lr*B)/(1+Lr*B*Lr')); % Row addition formula
Fr = D1(1,:); % First row to be removed 
D2 = removerows(D1,1);
BFr = BLr+ ((BLr*Fr'*Fr*BLr)/(1-Fr*BLr*Fr')); % row deletion formula
B = BFr;
Y = BFr*D2;
4

3 回答 3

4

您用于 Moore-Penrose 伪逆的公式 (D^TD)^-1 D^T 或 D^T (DD^T)^-1 仅在 D 分别具有完整列或完整行秩时才有效。

在您的情况下,情况并非如此,因为警告“矩阵接近单数”显示。

matlab pinv 命令适用于任意 D,即使矩阵既没有完整的行秩也没有完整的列秩。

于 2013-10-19T17:18:28.950 回答
1

尝试cond(D)在你的矩阵上运行,看看条件数是什么。数字越高,您的矩阵越病态。同样,您可以运行cond(D'*D). 矩阵可以是满秩的,但仍然是病态的。在纸面上,病态矩阵仍然是可逆的。但是,当您尝试在计算机上直接反转病态矩阵时,由量化和其他影响引起的小精度误差可能会导致解中的结果非常不可预测。

由于上述原因,通常有一种更好的方法(在数值上更稳定)来实现您所追求的,而不是直接计算逆。其中许多涉及矩阵分解技术,例如SVD。如果您帮助我们了解您需要的原因inv(D'*D),则可以更轻松地为您指明合适的替代方案的方向。例如,如果您只需要伪逆,请继续使用pinv(),即使它与使用 的结果不同inv()pinv()函数和\ (mldivide) 反斜杠运算符在数值上比inv().

于 2013-10-19T19:57:02.787 回答
0

请参阅http://www.mathworks.com/help/matlab/ref/pinv.html上的官方文档。

如果 A x ~ b,则解x = pinv(A) * b产生最小范数解,但x = A\b不会。请参阅上面链接中的数字示例。

于 2015-08-12T17:23:25.580 回答