块对角矩阵的反演

时间:2018-04-21 17:48:46

标签: r adjacency-matrix matrix-inverse

我有一个由不同块组成的矩阵。类似于这种块对角矩阵的东西:

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,因为我将更改行和列的顺序。

是否有建议更有效地执行此流程?

0 个答案:

没有答案