计算R中非方矩阵的倒数

Rea*_*ion 4 r matrix matrix-inverse

我对R语言很陌生,试图找出如何计算非平方矩阵的逆矩阵.(非正方形?不规则?我不确定正确的术语).

从我的书和快速谷歌搜索,(见源代码),我发现你可以solve(a)用来找到矩阵的逆矩阵,如果 a是正方形.

我创建的矩阵是,据我所知,不是正方形:

  > matX<-matrix(c(rep(1, 8),2,3,4,0,6,4,3,7,-2,-4,3,5,7,8,9,11), nrow=8, ncol=3);
  > matX

       [,1] [,2] [,3]
  [1,]    1    2   -2
  [2,]    1    3   -4
  [3,]    1    4    3
  [4,]    1    0    5
  [5,]    1    6    7
  [6,]    1    4    8
  [7,]    1    3    9
  [8,]    1    7   11
  > 
Run Code Online (Sandbox Code Playgroud)

是否有一个函数来解决这个大小的矩阵,还是我必须对每个元素做一些事情?因为该solve()函数给出了这个错误:

  Error in solve.default(matX) : 'a' (8 x 3) must be square
Run Code Online (Sandbox Code Playgroud)

我想从上面的矩阵中实现的计算是: (matX'matX)^-1

提前致谢.

G. *_*eck 6

ginvMASS包中的ginv将给出矩阵的广义逆.通过它预乘原始矩阵将给出身份:

library(MASS)
inv <- ginv(matX)

# test it out
inv %*% matX
##               [,1]         [,2]          [,3]
## [1,]  1.000000e+00 6.661338e-16  4.440892e-15
## [2,] -8.326673e-17 1.000000e+00 -1.110223e-15
## [3,]  6.938894e-17 8.326673e-17  1.000000e+00
Run Code Online (Sandbox Code Playgroud)

正如评论中所建议的那样,可以使用zapsmall以下方式更好地显示:

zapsmall(inv %*% matX)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1
Run Code Online (Sandbox Code Playgroud)

反过来matX'matX现在是:

tcrossprod(inv)
##              [,1]         [,2]         [,3]
## [1,]  0.513763935 -0.104219636 -0.002371406
## [2,] -0.104219636  0.038700372 -0.007798748
## [3,] -0.002371406 -0.007798748  0.006625269
Run Code Online (Sandbox Code Playgroud)

解决但是,如果你的目标是要计算其反的matX'matX,你不需要它摆在首位.这不涉及MASS:

solve(crossprod(matX))
##              [,1]         [,2]         [,3]
## [1,]  0.513763935 -0.104219636 -0.002371406
## [2,] -0.104219636  0.038700372 -0.007798748
## [3,] -0.002371406 -0.007798748  0.006625269
Run Code Online (Sandbox Code Playgroud)

SVDsvd也可以使用,同样不需要MASS:

with(svd(matX), v %*% diag(1/d^2) %*% t(v))
##              [,1]         [,2]         [,3]
## [1,]  0.513763935 -0.104219636 -0.002371406
## [2,] -0.104219636  0.038700372 -0.007798748
## [3,] -0.002371406 -0.007798748  0.006625269
Run Code Online (Sandbox Code Playgroud)

添加了一些额外的信息.