我有一个由不同块组成的矩阵。类似于这种块对角矩阵的东西:
library(Matrix)
listElems <- list(matrix(1:4,ncol=2,nrow=2),
matrix(5:8,ncol=2,nrow=2),
matrix(c(0, 1, 0, 0, 0, 1, 0, 0, 1),ncol=3,nrow=3),
matrix(1:1,ncol=1, nrow=1),
matrix(0,ncol=1, nrow=1),
matrix(0,ncol=1, nrow=1))
mat <- bdiag(listElems)
mat <- bdiag(mat,mat)
mat <- as.matrix(mat)
反转此矩阵的一种方法是反转其块。
我想使用这个属性,并且:i)识别矩阵中的12个块,ii)反转它们,iii)生成反转矩阵。
我能做的是识别块并将它们反转
library(igraph)
x <- mat
diag(x) <- 1
g <- graph_from_adjacency_matrix(adjmatrix = as.matrix(x), mode = "directed", weighted = TRUE, diag = TRUE)
groups <- Map(sort, neighborhood(g, nrow(mat)))
groups <- unique(Map(as.numeric, groups))
sub.Mat <- Map(`[`, list(mat), groups, groups, drop = FALSE)
inv.sub.Mat <- Map(ginv,sub.Mat)
我现在应该做的是创建倒置矩阵。为此,我唯一能想到的就是使用循环:
n.blocks <- length(inv.sub.Mat)
mat.inv <- matrix(0,nrow(mat),ncol(mat))
for(i in 1:n.blocks){
mat.inv[groups[[i]],groups[[i]]] <- inv.sub.Mat[[i]]
}
all.equal(mat.inv,ginv(mat))
然而,由于我必须在大规模矩阵上迭代地应用这个过程,我担心最后一次操作可能不是生成倒置矩阵的最有效方法。
请注意,我不会仅使用块对角矩阵,因此我不能简单地将bdiag
应用于inv.sub.Mat
,因为我将更改行和列的顺序。
是否有建议更有效地执行此流程?