首页 文章

获得R中稀疏矩阵的上三角非零元素

提问于
浏览
4

我试图找到一种有效的方法来检索R中稀疏矩阵的非零上三角形元素的列表/向量/数组 . 例如:

library(igraph)
    Gmini <- as.directed(graph.lattice(c(3,5)))
    GminiMat <- sparseMatrix(i=get.edgelist(Gmini)[,1],j=get.edgelist(Gmini)[,2],x=1:length(E(Gmini)))
    GminiMat

    15 x 15 sparse Matrix of class "dgCMatrix"

    [1,]  .  1  .  2  .  .  .  .  .  .  .  .  .  .  .
    [2,] 23  .  3  .  4  .  .  .  .  .  .  .  .  .  .
    [3,]  . 25  .  .  .  5  .  .  .  .  .  .  .  .  .
    [4,] 24  .  .  .  6  .  7  .  .  .  .  .  .  .  .
    [5,]  . 26  . 28  .  8  .  9  .  .  .  .  .  .  .
    [6,]  .  . 27  . 30  .  .  . 10  .  .  .  .  .  .
    [7,]  .  .  . 29  .  .  . 11  . 12  .  .  .  .  .
    [8,]  .  .  .  . 31  . 33  . 13  . 14  .  .  .  .
    [9,]  .  .  .  .  . 32  . 35  .  .  . 15  .  .  .
    [10,]  .  .  .  .  .  . 34  .  .  . 16  . 17  .  .
    [11,]  .  .  .  .  .  .  . 36  . 38  . 18  . 19  .
    [12,]  .  .  .  .  .  .  .  . 37  . 40  .  .  . 20
    [13,]  .  .  .  .  .  .  .  .  . 39  .  .  . 21  .
    [14,]  .  .  .  .  .  .  .  .  .  . 41  . 43  . 22
    [15,]  .  .  .  .  .  .  .  .  .  .  . 42  . 44  .

所以理想情况下我想创建一个函数getUpper(mat),这样getUpper(GminiMat)将产生1:22的向量(GminiMat的上三角非零项)

理想情况下,我需要一种相当记忆和速度有效的方法,因为我可能需要将其应用于大型系统(例如,矩阵可能来自每个维度中具有数百个节点的多维网格) .

2 回答

  • 3

    包矩阵中有一个方法 triu 将返回上三角形,同时保留稀疏性:

    triu(GminiMat)
    15 x 15 sparse Matrix of class "dtCMatrix"
    
     [1,] . 1 . 2 . . .  .  .  .  .  .  .  .  .
     [2,] . . 3 . 4 . .  .  .  .  .  .  .  .  .
     [3,] . . . . . 5 .  .  .  .  .  .  .  .  .
     [4,] . . . . 6 . 7  .  .  .  .  .  .  .  .
     [5,] . . . . . 8 .  9  .  .  .  .  .  .  .
     [6,] . . . . . . .  . 10  .  .  .  .  .  .
     [7,] . . . . . . . 11  . 12  .  .  .  .  .
     [8,] . . . . . . .  . 13  . 14  .  .  .  .
     [9,] . . . . . . .  .  .  .  . 15  .  .  .
    [10,] . . . . . . .  .  .  . 16  . 17  .  .
    [11,] . . . . . . .  .  .  .  . 18  . 19  .
    [12,] . . . . . . .  .  .  .  .  .  .  . 20
    [13,] . . . . . . .  .  .  .  .  .  . 21  .
    [14,] . . . . . . .  .  .  .  .  .  .  . 22
    [15,] . . . . . . .  .  .  .  .  .  .  .  .
    
  • 3

    您应该使用 summary 函数 . 看到

    subset(summary(GminiMat), j > i)
    

    并从那里拿走它 . 也许:

    getUpper <- function(mat) subset(summary(mat), j > i)$x
    

相关问题