R 密集矩阵代数与稀疏矩阵代数的速度

R 密集矩阵代数与稀疏矩阵代数的速度,r,matrix,sparse-matrix,R,Matrix,Sparse Matrix,我将在R中使用一个相当大(7e6x4.5e3)但非常稀疏的矩阵。因此,我试图了解如何有效地处理稀疏矩阵。我有两个相关的问题 第一:我了解到矩阵包会自动链接到LAPACK和SuiteSparse编译的DLL。(我在Windows中工作。)我的印象是,与使用LAPACK套件的密集矩阵相比,使用SuiteParse例程可以缩短执行时间。但是下面的测试运行表明,矩阵的稀疏版本的运行时间比密集版本慢得多 > library(Matrix) > sparse <- sparseMatrix

我将在R中使用一个相当大(7e6x4.5e3)但非常稀疏的矩阵。因此,我试图了解如何有效地处理稀疏矩阵。我有两个相关的问题

第一:我了解到
矩阵
包会自动链接到LAPACK和SuiteSparse编译的DLL。(我在Windows中工作。)我的印象是,与使用LAPACK套件的密集矩阵相比,使用SuiteParse例程可以缩短执行时间。但是下面的测试运行表明,矩阵的稀疏版本的运行时间比密集版本慢得多

> library(Matrix)
> sparse <- sparseMatrix(1:4, 1:4, x=rnorm(4))
> dense <- as.matrix(sparse)
> x <- 1:4
> system.time(for (i in 1:10000) sparse %*% x)
   user  system elapsed 
   0.23    0.00    0.23 
> system.time(for (i in 1:10000) dense %*% x)
   user  system elapsed 
      0       0       0 
> system.time(for (i in 1:1000) solve(sparse))
   user  system elapsed 
   3.94    0.00    3.94 
> system.time(for (i in 1:1000) solve(dense))
   user  system elapsed 
   0.05    0.00    0.05
>库(矩阵)
>稀疏密集x系统。时间(对于(1:10000中的i)稀疏%*%x)
用户系统运行时间
0.23    0.00    0.23 
>系统时间(对于(1:10000中的i)密集%*%x)
用户系统运行时间
0       0       0 
>系统时间(用于(1:1000中的i)求解(稀疏))
用户系统运行时间
3.94    0.00    3.94 
>系统时间(用于(1:1000中的i)求解(密集))
用户系统运行时间
0.05    0.00    0.05
a)
Matrix
自动连接上述两个编译库,对吗?如果没有,如何链接到这些DLL? b) 稀疏矩阵代数的使用实际上比密集矩阵代数的使用慢很多吗

第二:我已经安装了
RcppEigen
RcppArmadillo
软件包。我已经能够用
RcppArmadillo
编译一个测试程序(使用了Dirk Eddelbuettel和Conrad Sanderson的论文)。但是,在我的一生中,我还没有找到类似的
RcppEigen
介绍,它可以为我提供一些可以用于入门的模型代码。你们谁能指出一个类似于Eddelbuettel和Sanderson论文的文档,它可以帮助我开始学习
RcppEigen

(对于注释来说有点太长了。)我会从分析更大的矩阵开始;我可以想象,当矩阵较小且不是非常稀疏时(例如,在这种情况下,25%的单元为非零),稀疏算法处于劣势。在下面的示例(1000x1000矩阵)中,稀疏解算器比密集解算器快26倍。您可能会发现
矩阵
例程对于您的目的来说足够快,而不需要承担学习
(Rcpp)Eigen
/
(Rcpp)犰狳
的额外认知开销

library(rbenchmark)
library(Matrix)
set.seed(101)
sparse <- sparseMatrix(1:1000,1:1000,x=rnorm(1000))
dense <- as.matrix(sparse)
benchmark(solve(sparse),solve(dense),replications=20,
          columns = c(
       "test", "replications", "elapsed", "relative", "user.self"))
##            test replications elapsed relative user.self
## 2  solve(dense)           20   6.932   26.868     6.692
## 1 solve(sparse)           20   0.258    1.000     0.256
库(rbenchmark)
图书馆(矩阵)
种子集(101)

你的第二个问题是请求非现场资源(有人可能会在评论中作出回应,但从技术上讲,这与StackOverflow无关)谢谢,Ben!你让我的生活轻松多了。