RcppEigen中的MappedSparseMatrix
我想使用RcppEigen包中实现的共轭梯度算法来求解大型稀疏矩阵 <>因为我是Rcpp和C++的新手,我刚开始的时候是用密集矩阵。< /P>RcppEigen中的MappedSparseMatrix,r,sparse-matrix,eigen,rcpp,R,Sparse Matrix,Eigen,Rcpp,我想使用RcppEigen包中实现的共轭梯度算法来求解大型稀疏矩阵 因为我是Rcpp和C++的新手,我刚开始的时候是用密集矩阵。< /P> // [[Rcpp::depends(RcppEigen)]] #include <Rcpp.h> #include <RcppEigen.h> #include <Eigen/IterativeLinearSolvers> using Eigen::SparseMatrix;
// [[Rcpp::depends(RcppEigen)]]
#include <Rcpp.h>
#include <RcppEigen.h>
#include <Eigen/IterativeLinearSolvers>
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::as;
using Eigen::ConjugateGradient;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
// [[Rcpp::export]]
VectorXd getEigenValues(SEXP As, SEXP bs) {
const Map<MatrixXd> A(as<Map<MatrixXd> > (As));
const Map<VectorXd> b(as<Map<VectorXd> > (bs));
ConjugateGradient<MatrixXd> cg;
cg.compute(A);
VectorXd x=cg.solve(b);
return x;
}
// [[Rcpp::depends(RcppEigen)]]
#include <Rcpp.h>
#include <RcppEigen.h>
#include <Eigen/IterativeLinearSolvers>
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::as;
using Eigen::ConjugateGradient;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
// [[Rcpp::export]]
VectorXd getEigenValues(SEXP As, SEXP bs) {
const MSpMat A = as<MSpMat>(As);
const Map<VectorXd> b(as<Map<VectorXd> > (bs));
ConjugateGradient<SparseMatrix<double> > cg;
cg.compute(A);
VectorXd x=cg.solve(b);
return x;
}
/[[Rcpp::depends(RcppEigen)]]
#包括
#包括
#包括
使用Eigen::SparseMatrix;
使用Eigen::MappedSparseMatrix;
使用特征::映射;
使用特征::矩阵XXD;
使用特征::VectorXd;
使用Rcpp::as;
使用本征::共轭梯度;
typedef Eigen::MappedSparseMatrix MSpMat;
//[[Rcpp::导出]]
向量xd获取特征值(SEXP As,SEXP bs){
常数映射A(as(as));
常数映射b(as(bs));
共轭梯度;
cg.计算(A);
向量xd x=cg.solve(b);
返回x;
}
这正如预期的那样有效。因此,我想把它扩展到稀疏矩阵
// [[Rcpp::depends(RcppEigen)]]
#include <Rcpp.h>
#include <RcppEigen.h>
#include <Eigen/IterativeLinearSolvers>
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::as;
using Eigen::ConjugateGradient;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
// [[Rcpp::export]]
VectorXd getEigenValues(SEXP As, SEXP bs) {
const Map<MatrixXd> A(as<Map<MatrixXd> > (As));
const Map<VectorXd> b(as<Map<VectorXd> > (bs));
ConjugateGradient<MatrixXd> cg;
cg.compute(A);
VectorXd x=cg.solve(b);
return x;
}
// [[Rcpp::depends(RcppEigen)]]
#include <Rcpp.h>
#include <RcppEigen.h>
#include <Eigen/IterativeLinearSolvers>
using Eigen::SparseMatrix;
using Eigen::MappedSparseMatrix;
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::as;
using Eigen::ConjugateGradient;
typedef Eigen::MappedSparseMatrix<double> MSpMat;
// [[Rcpp::export]]
VectorXd getEigenValues(SEXP As, SEXP bs) {
const MSpMat A = as<MSpMat>(As);
const Map<VectorXd> b(as<Map<VectorXd> > (bs));
ConjugateGradient<SparseMatrix<double> > cg;
cg.compute(A);
VectorXd x=cg.solve(b);
return x;
}
/[[Rcpp::depends(RcppEigen)]]
#包括
#包括
#包括
使用Eigen::SparseMatrix;
使用Eigen::MappedSparseMatrix;
使用特征::映射;
使用特征::矩阵XXD;
使用特征::VectorXd;
使用Rcpp::as;
使用本征::共轭梯度;
typedef Eigen::MappedSparseMatrix MSpMat;
//[[Rcpp::导出]]
向量xd获取特征值(SEXP As,SEXP bs){
常数MSpMat A=as(as);
常数映射b(as(bs));
共轭梯度;
cg.计算(A);
向量xd x=cg.solve(b);
返回x;
}
然而,这往往会产生非常奇怪的结果。代码本身也没有给出任何错误。希望有人能帮我纠正这个错误
谢谢。您需要在Eigen::共轭梯度函数中使用Eigen::MappedSparseMatrix类型。请尝试以下代码:
#include <RcppEigen.h>
typedef Eigen::MappedSparseMatrix< double > mappedSparseMatrix ;
typedef Eigen::Map< Eigen::VectorXd > mappedVector ;
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
Eigen::VectorXd cgSparse(
const mappedSparseMatrix A,
const mappedVector b
) {
Eigen::ConjugateGradient< mappedSparseMatrix, Eigen::Lower > cg( A ) ;
return cg.solve( b ) ;
}
#包括
typedef Eigen::MappedSparseMatrixMappedSparseMatrix;
typedef-Eigen::MapmappedVector;
//[[Rcpp::depends(RcppEigen)]]
//[[Rcpp::导出]]
特征::矢量xd cgSparse(
常量mappedSparseMatrix A,
常量映射向量b
) {
特征::共轭梯度cg(A);
返回cg.solve(b);
}
与R的solve()函数相比:
B <- matrix( c( 1, 2, 0, 2, 5, 0, 0, 0, 3 ), 3, 3, TRUE )
b <- c( 5, 1, 7 )
B %*% solve( B, b )
[,1]
[1,] 5
[2,] 1
[3,] 7
B %*% cgSparse( as( B, 'dgCMatrix' ), b )
[,1]
[1,] 5
[2,] 1
[3,] 7
B请不要交叉投递。您将相同的示例发送给了rcpp-devel,这是一个很好的地方。