【问题标题】:function for matrix矩阵函数
【发布时间】:2014-10-25 16:24:52
【问题描述】:

我正在在线学习 R,并且正在通过一些实验室工作。 我有一个问题: “编写一个递归函数,使用逐块求逆技术对任何矩阵进行求逆。您的函数不得使用求解函数(或任何其他内置的 R 矩阵求逆/分解函数)”。

我曾想过尝试 QR 或 Choleski 分解,但这两者都将使用“内置函数”。 逐块反转涉及哪种代码?

这是一个示例矩阵:

M1 = matrix(rnorm(120^2),120,120)

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    我试过这个,查看维基百科。 http://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion

    getInverse <- function(mat) {
    
      if(nrow(mat) == 1)
      {
        return (matrix( 1.0/ mat[1,1] ))
      }
    
      idx <- nrow(mat) / 2
      A <- mat[1:idx, 1:idx, drop=F]
      B <- mat[1:idx, -1:-idx, drop=F]
      C <- mat[-1:-idx, 1:idx, drop=F]
      D <- mat[-1:-idx, -1:-idx, drop=F]
    
      invA <- getInverse(A)
      temp <- getInverse(D - C %*% invA %*% B)
      element11 <- invA + invA %*% B %*% temp %*% C %*% invA
      element12 <- -invA %*% B %*% temp
      element21 <- -temp %*% C %*% invA
      element22 <- temp
    
      result <- cbind(rbind(element11, element21), rbind(element12, element22))
    }
    
    set.seed(1)
    mat <- matrix(rnorm(9), nrow=3)
    print("Function test:")
    print(getInverse(mat))
    print("Using Solve:")
    solve(mat)
    

    更新 cmets 中的问题:
    我选择了这些名称来匹配 wiki 页面块矩阵反转公式中的 4 个不同元素或块。我将结果视为矩阵矩阵,因此为第 1 行第 1 列选择 element11,为第 2 行第 1 行选择 element21。我并没有真正“解决”任何问题,我只是将一些中间计算存储到变量中。最后,通过组合块构建结果。

    【讨论】:

    • 哇,非常感谢!它似乎完美运行!你有没有机会解释一下代码,因为我仍然不确定它是如何完成的
    • 您好,我只是关注 wiki 页面。如果矩阵是 1x1,我直接返回逆矩阵。这也是逃避递归部分所必需的。否则,我将矩阵拆分为块,类似于 A、B、C 和 D 的维基百科符号。拆分被分成两半。然后使用 wiki 页面中的公式,调用相同的 getInverse 函数,使其递归。 element11 对应左上块等。最后我把块组合成结果。
    • 好吧,我想我现在已经理解了大部分内容了 :) 再问一个问题 - 你是如何计算出“element11 对应于左上块等”的 抱歉所有问题。非常感谢您的帮助!
    • 要回答 cmets 中的其他问题,请编辑您的答案,不要发布其他答案。我刚刚复制了这个答案的第二个答案,因为那里提供的信息很有帮助。第二个答案可能会被删除,因为它被标记为删除,因为它不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2014-03-18
    • 2021-08-07
    • 2020-03-14
    • 2014-07-01
    相关资源
    最近更新 更多