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
提前致谢.
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)
SVD的svd也可以使用,同样不需要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)
添加了一些额外的信息.