似乎有很多关于反函数的问题,但它们不是我想要的(
matrix-inverse
标签中的结果也很多)。我正在尝试使用一个函数来获取矩阵的逆。例如,这是我使用的矩阵:
#### Create Matrix ####
mat <- matrix(
c(4,2,7,6),
nrow=2
)
mat
如下所示:
[,1] [,2]
[1,] 4 7
[2,] 2 6
当我手动计算行列式并使用
det
函数时,我得到了每个逆解的相同答案:
1/((4*6)-(7*2))*mat # 1/det
(1/det(mat))*mat # same
如下所示:
[,1] [,2]
[1,] 0.6 -0.7
[2,] -0.2 0.4
但是,如果我为此使用假设的功能,
solve(mat)
给了我这个解决方案:
[,1] [,2]
[1,] 0.4 0.7
[2,] 0.2 0.6
为什么结果不一样?我需要使用替代功能吗?
我重新启动 R 并运行相同的代码,没有任何变化。这是我的会话信息:
R version 4.2.1 (2022-06-23 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 22621)
Matrix products: default
locale:
[1] LC_COLLATE=Chinese (Simplified)_China.utf8
[2] LC_CTYPE=Chinese (Simplified)_China.utf8
[3] LC_MONETARY=Chinese (Simplified)_China.utf8
[4] LC_NUMERIC=C
[5] LC_TIME=Chinese (Simplified)_China.utf8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_4.2.1 tools_4.2.1 rstudioapi_0.14
出于某种原因,它说我安装了 4.2.1,但我很确定我使用的是 4.2.2,所以不确定这是否重要。运行
solve(mat) %*% mat
给了我这个矩阵:
[,1] [,2]
[1,] 1 8.881784e-16
[2,] 0 1.000000e+00
至少我们中的一个人感到困惑。
mat <- matrix(c(4,2,7,6),2)
inv1 <- solve(mat)
## or
inv2 <- matrix(c(mat[4],-mat[2], -mat[3], mat[1]), 2)/det(mat)
all.equal(inv1, inv2) ## TRUE
all.equal(inv1 %*% mat, diag(2)) ## TRUE
inv1
[,1] [,2]
[1,] 0.6 -0.7
[2,] -0.2 0.4
zapsmall(mat %*% inv1)
[,1] [,2]
[1,] 1 0
[2,] 0 1
inv3 <- mat/det(mat)
all.equal(mat %*% inv3, diag(2))
## [1] "Mean relative difference: 0.8823529"
inv3
[,1] [,2]
[1,] 0.4 0.7
[2,] 0.2 0.6
mat %*% inv3
[,1] [,2]
[1,] 3 7
[2,] 2 5
R Under development (unstable) (2023-02-25 r83903)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Pop!_OS 22.04 LTS
Matrix products: default
BLAS: /usr/local/lib/R/lib/libRblas.so
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3; LAPACK version 3.10.0
locale:
[1] LC_CTYPE=en_CA.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_CA.UTF-8 LC_COLLATE=en_CA.UTF-8
[5] LC_MONETARY=en_CA.UTF-8 LC_MESSAGES=en_CA.UTF-8
[7] LC_PAPER=en_CA.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C
time zone: America/Toronto
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices datasets utils methods base
loaded via a namespace (and not attached):
[1] compiler_4.3.0 bspm_0.3.10
我意识到我错误的基础是矩阵在计算之前没有转化为倒置形式。如果我刚刚得到这个定义的
dt
对象的行列式:
#### Obtain Determinant ####
dt <- 1/(
(mat[4] * mat[1]) - (-mat[3] * -mat[2])
)
dt
打印给了我我所期望的:
[1] 0.1
然后将原始矩阵乘以这个值:
dt*mat
我得到了错误的值,因为乘法是在原始矩阵上:
[,1] [,2]
[1,] 0.4 0.7
[2,] 0.2 0.6
所以我需要先将矩阵转换为倒置形式:
#### Convert Matrix to Inverted Form ####
mat.fix <- matrix(
c(6,-2,-7,4),
nrow=2
)
然后再次乘以
dt
对象,最终匹配solve
函数:
mat.fix*dt
solve(mat)
如下所示:
[,1] [,2]
[1,] 0.6 -0.7
[2,] -0.2 0.4