RcppArmadillo中超大稀疏矩阵的处理

RcppArmadillo中超大稀疏矩阵的处理,r,rcpp,rcpparmadillo,R,Rcpp,Rcpparmadillo,我试图将对角矩阵W传递给Rcpp函数。问题是W的大小是1000000乘1000000,这(我认为)远远超出了Armadillo允许的限制(即使使用启用ARMA_64位单词的C++11编译器) 因为W是一个对角矩阵,所以它非常稀疏。因此,我首先生成了W的密集表示(使用矩阵包函数对角线)。然后,我将W的这些压缩表示形式传递给我的函数。我认为这可以解决任何内存问题。下面是一个小例子: C++代码: #define ARMA_64BIT_WORD 1 #include <RcppArmadillo

我试图将对角矩阵
W
传递给Rcpp函数。问题是
W
的大小是1000000乘1000000,这(我认为)远远超出了Armadillo允许的限制(即使使用启用ARMA_64位单词的C++11编译器)

因为
W
是一个对角矩阵,所以它非常稀疏。因此,我首先生成了
W
的密集表示(使用矩阵包函数对角线)。然后,我将
W
的这些压缩表示形式传递给我的函数。我认为这可以解决任何内存问题。下面是一个小例子:

C++代码:

#define ARMA_64BIT_WORD 1
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]

using namespace Rcpp;
using namespace arma;


// [[Rcpp::export]]
int test(sp_mat W){
  
  return 0;
  
}
# define the diagonal matrix
nrows <- 1e6
W <- Matrix::Diagonal(nrows)

# call Rcpp function
test(W)
有没有办法处理
W
,这样我就可以将它传递到
test
并执行矩阵运算


有人提出了类似的问题。然而,我认为@Dirk提供的解决方案在这种情况下起作用,因为与我的
W
相比,输入矩阵仍然很小。最初发布的代码实际上是正确的,但不知何故,它运行的机器不是---详细信息见上面的讨论

作为一个附加组件,这里是一个稍微编辑过的代码版本,没有全局名称空间,实际访问矩阵(传递就足够了,这只是更显式的)并返回
void
。我们还添加了使用Rcpp属性可以实现的常见“从R为我调用”技巧

代码
如果矩阵具有足够的稀疏性,并且您使用了正确的工具,那么您可以这样做。你需要做实验。$N$起作用的也是一个函数。。。你的机器和它的内存分配。有不同的方法来构造稀疏矩阵。我们有一些来自R的转换器,这要感谢几年前的Google代码夏令营项目;你也可以直接在C++中使用ARMADILO函数来三角化。BTW你的例子在我的机器上工作得很好——即使是1E7和1E8。也许我的内存比你的多——虽然不是那么多。很有趣,谢谢你的测试。我的机器上有16GB的内存。有没有什么方法可以告诉我是否确实使用了C++11编译器,并且启用了ARMA_64位_WORD?我从config.hpp文件中删除了注释,但仍然出现上述错误。也许我应该将其移到答案而不是注释。。。做<代码> SooCeCpp(文件名,VBOSE = TRUE)< /C> >,你应该看到C++标准调用--R 4。*现在它本身就变成了C++ 11。
g++--version
对您来说意味着什么?它说的是
g++-std=gnu++11
。输出中还列出了
C:/rtools40/mingw32/bin/g++
。这是否意味着我没有使用64位版本?还有对
dyn.load
.sourceCpp\u 1\u DLLInfo的调用
error: SpMat::init(): requested size is too large; suggest to compile in C++11 mode and/or enable ARMA_64BIT_WORD
// lightly edited version of question, working fine for me
#define ARMA_64BIT_WORD 1
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
void spmatTest(arma::sp_mat M) {
  // show a simple access of matrix,
  // here we just sum elements on diagonal
  Rcpp::Rcout << "Sum of diag is "
              << arma::as_scalar(arma::sum(M.diag()))
              << std::endl;
}

/*** R
spmatTest( Matrix::Diagonal( 1e6 ))
spmatTest( Matrix::Diagonal( 1e7 ))
spmatTest( Matrix::Diagonal( 1e8 ))
*/
R> Rcpp::sourceCpp("~/git/stackoverflow/64428776/answer.cpp")

R> spmatTest( Matrix::Diagonal( 1e6 ))
Sum of diag is 1e+06

R> spmatTest( Matrix::Diagonal( 1e7 ))
Sum of diag is 1e+07

R> spmatTest( Matrix::Diagonal( 1e8 ))
Sum of diag is 1e+08
R>