2017-12-27 56 views
1

이것은 Matrix package 대 일반 Rbase-matrix 클래스를 사용하여 드문 드문 고밀도 매트릭스의 행 추출을 비교 한 예입니다.Matrix 패키지의 추출 속도는 일반 매트릭스 클래스에 비해 매우 느림

는 밀도 행렬의 경우 속도가 거의 395 배 빠른 기본 클래스 matrix입니다 : 스파 스 매트릭스를 들어

library(Matrix) 
library(microbenchmark) 

## row extraction in dense matrices 
D1<-matrix(rnorm(2000^2), 2000, 2000) 
D2<-Matrix(D1) 
> microbenchmark(D1[1,], D2[1,]) 
Unit: microseconds 
    expr  min  lq  mean median  uq  max neval 
D1[1, ] 14.437 15.9205 31.72903 31.4835 46.907 75.101 100 
D2[1, ] 5730.730 5744.0130 5905.11338 5777.3570 5851.083 7447.118 100 

가 다시 matrix 찬성 거의 63 배이다.

## row extraction in sparse matrices 
S1<-matrix(1*(runif(2000^2)<0.1), 2000, 2000) 
S2<-Matrix(S1, sparse = TRUE) 
microbenchmark(S1[1,], S2[1,]) 
Unit: microseconds 
    expr  min  lq  mean median  uq  max neval 
S1[1, ] 15.225 16.417 28.15698 17.7655 42.9905 45.692 100 
S2[1, ] 1652.362 1670.507 1771.51695 1774.1180 1787.0410 5241.863 100 

왜 속도 차이, 그리고 Matrix 패키지에서 추출 속도를하는 방법은 무엇입니까?

답변

1

문제가 무엇인지 정확히 알 수는 없지만 S4 디스패치 (잠재적으로 이처럼 작은 전화의 큰 부분 일 수 있음). 나는 (1) 행 - 주요 형식으로 전환하고 (2) 내 자신의 특수 목적 접근 자 기능을 작성하여 matrix (이는 비교적 쉬운 작업, 인덱싱 + 인접한 메모리 청크에 액세스)과 동등한 성능을 얻을 수있었습니다.

set.seed(101) 
S1 <- matrix(1*(runif(2000^2)<0.1), 2000, 2000) 

변환에 열 전공 (dgCMatrix)와 행 주요 (: 그것은 문제가 가치가있을 것입니다 경우에 나는

예를 설정 ... 당신이 원하는 것을 정확히 모르거나하지 않습니다 dgRMatrix) 양식 :

library(Matrix) 
S2C <- Matrix(S1, sparse = TRUE) 
S2R <- as(S1,"dgRMatrix") 

사용자의 접근 :

my_row_extract <- function(m,i=1) { 
    r <- numeric(ncol(m)) ## set up zero vector for results 
    inds <- seq([email protected][i]+1,[email protected][i+1]) ## find indices 
    r[[email protected][inds]+1] <- [email protected][inds]  ## set values 
    return(r) 
} 

확인 평등 방법에서 결과 (모든 TRUE)의 :

all.equal(S2C[1,],S1[1,]) 
all.equal(S2C[1,],S2R[1,]) 
all.equal(my_row_extract(S2R,1),S2R[1,]) 
all.equal(my_row_extract(S2R,17),S2R[17,]) 

벤치 마크 :

benchmark(S1[1,], S2C[1,], S2R[1,], my_row_extract(S2R,1), 
      columns=c("test","elapsed","relative")) 
##      test elapsed relative 
## 4 my_row_extract(S2R, 1) 0.015 1.154 
## 1    S1[1, ] 0.013 1.000 
## 2    S2C[1, ] 0.563 43.308 
## 3    S2R[1, ] 4.113 316.385 

특수 목적 추출기는 기본 행렬과 경쟁이다. S2R은 행 추출 (놀랍게도)에도 초 저속입니다. 그러나, ?"dgRMatrix-class" 말을하지

참고 : 열 지향 '매트릭스'패키지에서 지원, 스파 스 클래스, 예를 들어, 'dgCMatrix가'바람직하고 더 나은.