R中奇异矩阵的平方根

时间:2015-01-30 00:12:01

标签: r matrix inverse square-root singular

我需要在-1/2的幂上计算矩阵 A ,这基本上意味着初始矩阵的平方根的倒数。

如果A是单数,则使用MASS包中的 ginv 函数计算Moore-Penrose广义逆,否则使用求解函数计算常规逆。

矩阵A定义如下:

A <- structure(c(604135780529.807, 0, 58508487574887.2, 67671936726183.9, 
            0, 0, 0, 1, 0, 0, 0, 0, 58508487574887.2, 0, 10663900590720128, 
            10874631465443760, 0, 0, 67671936726183.9, 0, 10874631465443760, 
            11315986615387788, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), .Dim = c(6L, 
                                                                                   6L))

我通过比较等级和维度来检查奇点。

rankMatrix(A) == nrow(A)

上面的代码返回FALSE,所以我必须使用 ginv 来获得反转。 A的倒数如下:

A_inv <- ginv(A)

使用expm包中的sqrtm函数计算逆矩阵的平方根。

library(expm)
sqrtm(A_inv)

该函数返回以下错误:

  

solve.default(X [ii,ii] + X [ij,ij],S [ii,ij] - sumU)出错:

  Lapack例程zgesv:系统完全是单数

那么在这种情况下我们如何计算平方根?请注意,矩阵A并不总是单数,因此我们必须为此问题提供一般解决方案。

1 个答案:

答案 0 :(得分:4)

您的问题涉及两个不同的问题:

  1. 矩阵的反转
  2. 矩阵的平方根
  3. <强>反

    奇异矩阵不存在逆。在一些应用中,Moore-Penrose或一些其他广义逆可以作为逆的合适替代。但请注意,计算机数字在大多数情况下会出现舍入错误;这些错误可能会使单个矩阵在计算机上显得规则,反之亦然。

    如果A总是展示你给出的矩阵的块结构,我建议只考虑它的非对角块

    A3 = A[ c( 1, 3, 4 ), c( 1, 3, 4 ) ]
    
    A3
                 [,1]         [,2]         [,3]
    [1,] 6.041358e+11 5.850849e+13 6.767194e+13
    [2,] 5.850849e+13 1.066390e+16 1.087463e+16
    [3,] 6.767194e+13 1.087463e+16 1.131599e+16
    

    代替所有A,以提高效率和减少舍入问题。其余的1对角线条目在平方根的倒数中保持为1,因此不需要使用它们来混淆计算。为了了解这种简化的影响,请注意R可以计算

    A3inv = solve(A3)
    

    虽然无法计算

    Ainv = solve(A)
    

    但是我们不需要A3inverse,下面将会明白。

    平方根

    作为一般规则,矩阵A的平方根仅在矩阵具有对角Jordan正规形式(https://en.wikipedia.org/wiki/Jordan_normal_form)时才存在。因此,根据需要,没有真正普遍的问题解决方案。

    幸运的是,像“大多数”(实数或复数)矩阵是可逆的,“大多数”(实数或复数)矩阵具有对角线复杂的Jordan正规形式。在这种情况下,乔丹正常形式

      

    A3 = T·J·T -1

    可以用R计算:

    X = eigen(A3)
    T = X$vectors
    J = Diagonal( x=X$values )
    

    要测试此配方,请比较

    Tinv = solve(T)
    T %*% J %*% Tinv
    

    A3。如果A3具有对角Jordan正规形式,它们应匹配(最多为舍入误差)。

    由于J是对角线,因此它的平方根只是平方根的对角矩阵

    Jsqrt = Diagonal( x=sqrt( X$values ) )
    

    以便Jsqrt·Jsqrt = J。而且,这意味着

      

    (T·Jsqrt·T -1)²= T·Jsqrt·T -1·T·Jsqrt·T -1 = T·Jsqrt·Jsqrt·T -1 = T·J·T -1 = A3 < / p>

    所以我们实际上得到了

      

    √A3= T·Jsqrt·T -1

    或在R代码中

    A3sqrt = T %*% Jsqrt %*% Tinv
    

    要测试此,请计算

    A3sqrt %*% A3sqrt
    

    并与A3进行比较。

    反向的平方根

    一旦计算出对角Jordan正规形式,就可以容易地计算逆的平方根(或者,同样地,平方根的倒数)。而不是J使用

    Jinvsqrt = Diagonal( x=1/sqrt( X$values ) )
    

    并计算,类似于上面,

    A3invsqrt = T %*% Jinvsqrt %*% Tinv
    

    并观察

       A3·A3invsqrt²= ... = T·(J /√J/√J)·T -1 = 1

    单位矩阵,以便A3invsqrt是所需的结果。

    如果A3不可逆,可以通过将Jinvsqrt中的所有未定义条目替换为0来计算广义逆(不一定是Moore-Penrose),但如上所述,这应该通过根据整体应用及其对圆角误差的稳定性进行适当的护理。

    如果A3没有对角Jordan正规形式,则没有平方根,因此上述公式将产生一些其他结果。为了在运气不好的情况下不遇到这种情况,最好实施一项测试是否

    A3invsqrt %*% A3 %*% A3invsqrt
    

    足够接近你认为的1矩阵(这只适用于A3首先是可逆的)。

    PS:请注意,您可以根据自己的喜好为Jinvsqrt的每个对角线条目添加符号±前缀。