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

时间:2016-07-03 20:32:38

标签: r matrix sparse-matrix

我将在R中使用相当大(7 e6 x 4.5 e3)但非常稀疏的矩阵。所以我试图理解如何有效地处理稀疏矩阵。我有两个相关的问题。

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

> 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

a)我是否正确Matrix自动与上述两个编译库连接?如果没有,我如何链接到这些DLL? b)通常使用稀疏矩阵代数实际上比使用密集矩阵代数要慢得多吗?

第二:我已经安装了RcppEigenRcppArmadillo个软件包。我已经能够用RcppArmadillo编译一个测试程序(使用Dirk Eddelbuettel和Conrad Sanderson的论文)。但是,对于我的生活,我没有找到类似的RcppEigen介绍,它会给我一些我可以用来开始的模型代码。您是否可以指向类似于Eddelbuettel和Sanderson论文的文档,它可以帮助我开始使用RcppEigen

1 个答案:

答案 0 :(得分:8)

(评论有点太长了。)我首先要对更大的矩阵进行分析;我可以想象,当矩阵很小并且非常稀疏时(例如,在这种情况下,25%的单元非零),稀疏算法处于劣势。在下面的示例中(1000x1000矩阵),稀疏解算器比密集解算器快26倍。您可能会发现Matrix例程足够快,无需承担学习(Rcpp)Eigen / (Rcpp)Armadillo的额外认知开销......

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