矩阵包中的提取速度与常规矩阵类相比非常缓慢

这是一个使用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包装加快提取?

回答:

我不知道究竟是什么问题,可能是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”,是优选的,更好的支持在“矩阵”包列取向。

以上是 矩阵包中的提取速度与常规矩阵类相比非常缓慢 的全部内容, 来源链接: utcz.com/qa/266966.html

回到顶部