【发布时间】: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