R 中的求解函数与逆计算不匹配

问题描述 投票:0回答:2

似乎有很多关于反函数的问题,但它们不是我想要的(

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
r matrix matrix-inverse determinants
2个回答
1
投票

至少我们中的一个人感到困惑。

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   

0
投票

我意识到我错误的基础是矩阵在计算之前没有转化为倒置形式。如果我刚刚得到这个定义的

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
© www.soinside.com 2019 - 2024. All rights reserved.