矩阵的功能

时间:2014-10-25 16:24:52

标签: r

我正在网上学习R,正在通过一些实验室工作。 我有一个问题:  "写一个递归函数,使用逐块反演技术反转任何矩阵。您的函数不能使用求解函数(或任何其他内置的R矩阵求逆/分解函数)"。

我曾尝试过尝试QR或Choleski分解,但这两种方法都是使用"内置函数"。 什么样的代码会阻塞反转?

以下是一个示例矩阵:

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

谢谢

1 个答案:

答案 0 :(得分:2)

我试过这个,看着维基百科。 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)

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