我需要在Armadillo中将一个非常大的块对角矩阵表示为稀疏矩阵。我将所有块的所有值放入两个arma::field<arma::mat>
列表中,因此我只需要将它们转换为arma::sp_mat
对象。
我可以做到:
arma::mat
并行执行,然后将密集矩阵转换为稀疏矩阵(更快)我想直接并行填充arma::sp_mat
,这应该是最快的路线。我尝试使用与下面的代码段相似的代码(使用Rcpp),但是它崩溃了,我猜这是由于Armadillo中稀疏矩阵的增长方式所致。有办法使它起作用吗?
#include <RcppArmadillo.h>
#include <omp.h>
arma::sp_mat test_ll(int blocks=10, int rowcol_per_block=250){
arma::mat mat1 = arma::randn() * arma::ones(rowcol_per_block, rowcol_per_block);
arma::sp_mat tester(blocks * rowcol_per_block,
blocks * rowcol_per_block);
#pragma omp parallel for
for(int i=0; i<blocks; i++){
tester.submat( i*rowcol_per_block, i*rowcol_per_block,
(i+1)*rowcol_per_block-1, (i+1)*rowcol_per_block-1) = mat1;
}
return tester;
}
我尝试预填充适当大小的sp_mat
的所有块,然后并行进行更改,但这也会崩溃。
更新
使用#2 constructor初始化sp_mat
并没有区别(提供非零位置并用1填充它们,然后并行更改它们)。那也失败了。