我将在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)稀疏矩阵代数的使用实际上真的比密集矩阵代数的使用慢了很多吗?
第二:我已经安装了RcppEigen
和RcppArmadillo
软件包。我已经能够使用RcppArmadillo
(使用Dirk Eddelbuettel和Conrad Sanderson的论文)来编译测试程序。但是对于我的一生,我还没有找到类似的介绍来RcppEigen
为我提供一些可以用来入门的模型代码。你们中有人可以指向类似于Eddelbuettel和Sanderson的论文可以帮助我入门的文档RcppEigen
吗?
(发表评论的时间太长了。)我将首先对更大的矩阵进行概要分析。我可以想象,当矩阵较小且不是非常稀疏时(例如,在这种情况下,有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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句