【问题标题】:Get upper triangular non-zero elements of a sparse matrix in R获取R中稀疏矩阵的上三角非零元素
【发布时间】:2014-04-30 18:30:03
【问题描述】:

我正在尝试找到一种有效的方法来检索 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 的上三角非零项)

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

【问题讨论】:

  • ?upper.tri 就是你要找的东西
  • 这会返回一个真假掩码,但看起来实际提取条目本身需要更多时间。更大的问题是矩阵不再是稀疏的,所以在我需要使用稀疏矩阵的地方(例如对于非常大的系统尺寸)是不可行的。
  • 你必须做x[upper.tri(x)]。但这是一个坏主意,因为upper.tri(x) 是一个完整(非解析)矩阵,因此它首先违背了使用稀疏矩阵的目的。如果您使用大型矩阵,它会很慢并且很容易让您耗尽内存。处理summary(或等效的稀疏表示)是可行的方法。
  • 嗯,你确实需要多弄点 GminiMat[upper.tri(GminiMat)] 会给你这些值。它不会保留结构!你想要什么值?还是将其他值转换为 NA 的结构?
  • 在这种情况下,我只需要这些值。这些用作边缘索引,矩阵的上三角部分和下三角部分对应于指向相反方向的有向边缘。我试图获得一个方向的边缘,这样我就可以对它们进行采样,然后找到相应的边缘在相反的方向上。它也很有用,如果我需要查找一个方向的边,我可以快速找到它的对应部分。

标签: r sparse-matrix


【解决方案1】:

在 Matrix 包中有一个方法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,] . . . . . . .  .  .  .  .  .  .  .  .

【讨论】:

    【解决方案2】:

    您应该使用summary 函数。见

    subset(summary(GminiMat), j > i)
    

    然后从那里拿走它。也许:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多