【问题标题】:Inverse of matrix in RR中矩阵的逆
【发布时间】:2012-08-13 07:32:31
【问题描述】:

我想知道您推荐的计算逆矩阵的方法是什么?

我找到的方法似乎并不令人满意。例如,

> c=rbind(c(1, -1/4), c(-1/4, 1))  
> c  
      [,1]  [,2]  
[1,]  1.00 -0.25  
[2,] -0.25  1.00  
> inv(c)  
Error: could not find function "inv"  
> solve(c)    
          [,1]      [,2]  
[1,] 1.0666667 0.2666667  
[2,] 0.2666667 1.0666667  
> solve(c)*c  
            [,1]        [,2]  
[1,]  1.06666667 -0.06666667  
[2,] -0.06666667  1.06666667  
> qr.solve(c)*c  
            [,1]        [,2]  
[1,]  1.06666667 -0.06666667  
[2,] -0.06666667  1.06666667  

谢谢!

【问题讨论】:

  • 一般建议:避免给对象(如矩阵)一个已经使用过的名称(此处为c)。

标签: r matrix-inverse


【解决方案1】:

solve(c) 确实给出了正确的逆。您的代码的问题是您使用错误的运算符进行矩阵乘法。您应该使用solve(c) %*% c 在 R 中调用矩阵乘法。

当您调用 solve(c) * c 时,R 会执行逐个元素的乘法。

【讨论】:

    【解决方案2】:

    您可以使用 MASS 包中的函数 ginv()(Moore-Penrose 广义逆)

    【讨论】:

    • @xeon 不知道你怎么会错过它——见第我在上面的回答中提到的包裹手册中的 60 条
    • 感谢您的回答。从 FisherEM 包中运行函数 fem() 时出现此错误。运行 Mavericks Mac OS X。
    • 非常重要的是要注意@mathias_Schmidtblaicher 关于近奇异矩阵的 ginv 不准确和大型矩阵缺乏速度的回答
    【解决方案3】:

    请注意,如果您关心速度并且不需要担心奇点,则应该首选 solve() 而不是 ginv(),因为它更快,您可以查看:

    require(MASS)
    mat <- matrix(rnorm(1e6),nrow=1e3,ncol=1e3)
    
    t0 <- proc.time()
    inv0 <- ginv(mat)
    proc.time() - t0 
    
    t1 <- proc.time()
    inv1 <- solve(mat)
    proc.time() - t1 
    

    【讨论】:

    • +1:我只是用solve来反转一个近奇异矩阵(条件数10^15),它产生的答案与ginv不同。检查 XX^-1 发现 solve 做得很好,而 ginv 产生了垃圾
    【解决方案4】:

    solve(matrix) = 矩阵的逆,它完美地完成了这项工作。

    【讨论】:

    • 不幸的是,这个答案并没有提供其他答案尚未提及的任何内容。下次你可以提供更多细节,如果它有助于你的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多