2014-04-30 2 views
4

R에서 희소 행렬의 0이 아닌 위쪽 삼각형 요소의 목록/벡터/배열을 검색하는 효율적인 방법을 찾으려고합니다. 예를 들어 :희소 행렬의 상위 삼각형이 아닌 0 요소를 가져 오기 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 (매트) 등이 getUpper (GminiMat) 이 1시 22분의 벡터 (GminiMat의 상단 삼각 비 - 제로 항목)을 얻을 것

을하고 싶습니다

이상적으로는 신청해야 할 수도 있기 때문에 상당히 기억이 빠르고 효율적인 방법이 필요합니다. 대형 시스템 (예. 행렬은 각 차원에서 수 백 개의 노드가있는 다차원 격자에서 나올 수 있습니다).

+0

'upper.tri'이 다시주는 당신이 – infominer

+0

찾고있다 사실과 거짓의 가면이지만 실제로 항목을 추출하는 데는 조금 더 걸리는 것처럼 보입니다. 더 큰 문제는 매트릭스가 더 이상 희박하지 않기 때문에 스파 스 매트릭스를 사용해야하는 장소 (예 : 매우 큰 시스템 크기의 경우)에서 실행 가능하지 않습니다. – wmsmith

+0

당신은'x [upper.tri (x)]'를해야 할 것입니다. 그러나'upper.tri (x)'는 풀 (파싱되지 않은) 행렬이기 때문에 나쁜 생각입니다. 그래서 처음에는 희소 행렬을 사용하는 목적을 무효로 만듭니다. 속도가 느려서 큰 행렬을 사용하는 경우 메모리가 부족해질 수 있습니다. 'summary' (또는 이에 상응하는 희소 표현)에 대한 작업이 필요합니다. – flodel

답변

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 
+0

이것은 매우 잘 작동하는 것 같습니다. 감사! – wmsmith