我正在网上学习R,正在通过一些实验室工作。 我有一个问题: "写一个递归函数,使用逐块反演技术反转任何矩阵。您的函数不能使用求解函数(或任何其他内置的R矩阵求逆/分解函数)"。
我曾尝试过尝试QR或Choleski分解,但这两种方法都是使用"内置函数"。 什么样的代码会阻塞反转?
以下是一个示例矩阵:
M1 = matrix(rnorm(120^2),120,120)
谢谢
答案 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行。我没有真正地解决这个问题。我只是将一些中间计算存储到变量中。最后,通过组合块来构建结果。