2017-12-27 1554 views
1

這是一個使用Matrix package與常規類比較大型矩陣(稀疏和密集)的行提取的示例。矩陣包中的提取速度與常規矩陣類相比非常緩慢

對於稠密矩陣速度爲基類matrix快幾乎395倍:

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 

專用提取與基礎基質的競爭力。即使對於行提取(令人驚訝),它也是超慢的。然而,?"dgRMatrix-class"確實說

注:稀疏類,例如,「dgCMatrix」,是優選的,更好的支持在「矩陣」包列取向。