【发布时间】:2014-10-25 16:24:52
【问题描述】:
我正在在线学习 R,并且正在通过一些实验室工作。 我有一个问题: “编写一个递归函数,使用逐块求逆技术对任何矩阵进行求逆。您的函数不得使用求解函数(或任何其他内置的 R 矩阵求逆/分解函数)”。
我曾想过尝试 QR 或 Choleski 分解,但这两者都将使用“内置函数”。 逐块反转涉及哪种代码?
这是一个示例矩阵:
M1 = matrix(rnorm(120^2),120,120)
谢谢
【问题讨论】:
标签: r
我正在在线学习 R,并且正在通过一些实验室工作。 我有一个问题: “编写一个递归函数,使用逐块求逆技术对任何矩阵进行求逆。您的函数不得使用求解函数(或任何其他内置的 R 矩阵求逆/分解函数)”。
我曾想过尝试 QR 或 Choleski 分解,但这两者都将使用“内置函数”。 逐块反转涉及哪种代码?
这是一个示例矩阵:
M1 = matrix(rnorm(120^2),120,120)
谢谢
【问题讨论】:
标签: r
我试过这个,查看维基百科。 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。我并没有真正“解决”任何问题,我只是将一些中间计算存储到变量中。最后,通过组合块构建结果。
【讨论】: