使用特征c++;Galerkin矩阵的Rcpp库 我正在尝试在RStudio./P>中编写下面的C++代码。 // [[Rcpp::depends(RcppEigen)]] #include <RcppEigen.h> using namespace Rcpp; // [[Rcpp::export]] #include <iostream> #include <cmath> using Eigen::Dense; using Eigen::SparseLU; using Eigen::Sparse; using Eigen::SparseMatrix; using namespace std; Eigen::SparseMatrix<double> getGalMat(int N) { // Note: N hast to bigger or equal to 5!!! assert(N >= 5); typedef Eigen::SparseMatrix<double>::Index index_t; typedef Eigen::Triplet<double> triplet_t; std::vector<triplet_t> triplets; // reserve "minimal" vector size (the number of non-zero entries) triplets.reserve(5*N - 6); // N minus 1 int Nm = N - 1; // set the (off-) diagonals double diag_m2 = + 16; double diag_m1 = - 64; double diag = + 96; double diag_p1 = - 64; double diag_p2 = + 16; // set first and last 2 rows by hand // A(1 ,:) triplets.push_back({0 ,0 ,diag }); // A(1,1) triplets.push_back({0 ,1 ,diag_p1}); // A(1,2) triplets.push_back({0 ,2 ,diag_p2}); // A(1,3) // A(2 ,:) triplets.push_back({1 ,0 ,diag_m1}); // A(2,1) triplets.push_back({1 ,1 ,diag }); // A(2,2) triplets.push_back({1 ,2 ,diag_p1}); // A(2,3) triplets.push_back({1 ,3 ,diag_p2}); // A(2,4) // A(N-1,:) triplets.push_back({Nm-1,Nm-3,diag_m2}); // A(N-1,N-3) triplets.push_back({Nm-1,Nm-2,diag_m1}); // A(N-1,N-2) triplets.push_back({Nm-1,Nm-1,diag }); // A(N-1,N-1) triplets.push_back({Nm-1,Nm ,diag_p1}); // A(N-1,N ) // A(N ,:) triplets.push_back({Nm ,Nm-2,diag_m2}); // A(N,N-2) triplets.push_back({Nm ,Nm-1,diag_m1}); // A(N,N-1) triplets.push_back({Nm ,Nm ,diag }); // A(N,N ) // loop over remaining rows for (int i = 2; i < Nm-1; i++) { triplets.push_back({i,i-2,diag_m2}); // A(i,i-2) triplets.push_back({i,i-1,diag_m1}); // A(i,i-1) triplets.push_back({i,i ,diag }); // A(i,i ) triplets.push_back({i,i+1,diag_p1}); // A(i,i+1) triplets.push_back({i,i+2,diag_p2}); // A(i,i+2) } // let EIGEN build the sparse matrix from our triplets Eigen::SparseMatrix<double> spMat(N,N); spMat.setFromTriplets(triplets.begin(), triplets.end()); // return return spMat; }

使用特征c++;Galerkin矩阵的Rcpp库 我正在尝试在RStudio./P>中编写下面的C++代码。 // [[Rcpp::depends(RcppEigen)]] #include <RcppEigen.h> using namespace Rcpp; // [[Rcpp::export]] #include <iostream> #include <cmath> using Eigen::Dense; using Eigen::SparseLU; using Eigen::Sparse; using Eigen::SparseMatrix; using namespace std; Eigen::SparseMatrix<double> getGalMat(int N) { // Note: N hast to bigger or equal to 5!!! assert(N >= 5); typedef Eigen::SparseMatrix<double>::Index index_t; typedef Eigen::Triplet<double> triplet_t; std::vector<triplet_t> triplets; // reserve "minimal" vector size (the number of non-zero entries) triplets.reserve(5*N - 6); // N minus 1 int Nm = N - 1; // set the (off-) diagonals double diag_m2 = + 16; double diag_m1 = - 64; double diag = + 96; double diag_p1 = - 64; double diag_p2 = + 16; // set first and last 2 rows by hand // A(1 ,:) triplets.push_back({0 ,0 ,diag }); // A(1,1) triplets.push_back({0 ,1 ,diag_p1}); // A(1,2) triplets.push_back({0 ,2 ,diag_p2}); // A(1,3) // A(2 ,:) triplets.push_back({1 ,0 ,diag_m1}); // A(2,1) triplets.push_back({1 ,1 ,diag }); // A(2,2) triplets.push_back({1 ,2 ,diag_p1}); // A(2,3) triplets.push_back({1 ,3 ,diag_p2}); // A(2,4) // A(N-1,:) triplets.push_back({Nm-1,Nm-3,diag_m2}); // A(N-1,N-3) triplets.push_back({Nm-1,Nm-2,diag_m1}); // A(N-1,N-2) triplets.push_back({Nm-1,Nm-1,diag }); // A(N-1,N-1) triplets.push_back({Nm-1,Nm ,diag_p1}); // A(N-1,N ) // A(N ,:) triplets.push_back({Nm ,Nm-2,diag_m2}); // A(N,N-2) triplets.push_back({Nm ,Nm-1,diag_m1}); // A(N,N-1) triplets.push_back({Nm ,Nm ,diag }); // A(N,N ) // loop over remaining rows for (int i = 2; i < Nm-1; i++) { triplets.push_back({i,i-2,diag_m2}); // A(i,i-2) triplets.push_back({i,i-1,diag_m1}); // A(i,i-1) triplets.push_back({i,i ,diag }); // A(i,i ) triplets.push_back({i,i+1,diag_p1}); // A(i,i+1) triplets.push_back({i,i+2,diag_p2}); // A(i,i+2) } // let EIGEN build the sparse matrix from our triplets Eigen::SparseMatrix<double> spMat(N,N); spMat.setFromTriplets(triplets.begin(), triplets.end()); // return return spMat; },c++,rcpp,eigen,pde,C++,Rcpp,Eigen,Pde,获取错误:“扩展初始值设定项列表仅在-std=c++0x或-std=gnu++0x[默认启用]时可用” 有人有什么建议吗 谢谢你的帮助。 < P>脚本使用的语法要求比C++ 98高C++标准。要解决这个问题,有两种方法 启用C++11,因为R支持使用C++11 Rcpp插件在C++98或C++11下进行编译。这是解决此问题的首选方法。将以下内容添加到您的cpp代码顶部: // [[Rcpp::plugins(cpp11)]] 此修复程序不可移植(不随代码文件一起移动),并且基于会话,因此必须

获取错误:“扩展初始值设定项列表仅在-std=c++0x或-std=gnu++0x[默认启用]时可用”

有人有什么建议吗


谢谢你的帮助。

< P>脚本使用的语法要求比C++ 98高C++标准。要解决这个问题,有两种方法

  • 启用C++11,因为R支持使用C++11 Rcpp插件在C++98或C++11下进行编译。这是解决此问题的首选方法。将以下内容添加到您的cpp代码顶部:

    // [[Rcpp::plugins(cpp11)]]
    
  • 此修复程序不可移植(不随代码文件一起移动),并且基于会话,因此必须在每个新会话中重复此修复程序,或者在
    .Rprofile
    中进行设置。这设置了一个编译标志,通常在
    ~/.R/Makevars

    Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
    

  • <>脚本使用的语法要求比C++ 98高C++标准。要解决这个问题,有两种方法

  • 启用C++11,因为R支持使用C++11 Rcpp插件在C++98或C++11下进行编译。这是解决此问题的首选方法。将以下内容添加到您的cpp代码顶部:

    // [[Rcpp::plugins(cpp11)]]
    
  • 此修复程序不可移植(不随代码文件一起移动),并且基于会话,因此必须在每个新会话中重复此修复程序,或者在
    .Rprofile
    中进行设置。这设置了一个编译标志,通常在
    ~/.R/Makevars

    Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
    

  • 由于您似乎无法启用C++11,另一种选择是使代码C++98兼容。而不是:

    triplets.push_back({0   ,0   ,diag   }); // A(1,1)
    
    显式使用构造函数:

    triplets.push_back(triplet_t(0   ,0   ,diag   )); // A(1,1)
    

    由于您似乎无法启用C++11,另一种选择是使代码C++98兼容。而不是:

    triplets.push_back({0   ,0   ,diag   }); // A(1,1)
    
    显式使用构造函数:

    triplets.push_back(triplet_t(0   ,0   ,diag   )); // A(1,1)
    

    正确,但不是“和”——它是“或”。无论哪种方法都可以,第二种方法更可取,因为它与代码保持一致。非常感谢您的提示。它工作了,但我仍然有另一个错误消息。不幸的是,我仍然不能用RStudio编译我的代码。我有以下错误:“log4cplus:错误文件未打开”和“cc1plus.exe:错误:无法识别的命令行选项'-std=c++11'”编译器缺少c++11支持。您是否在Windows上使用最新的if?很遗憾,我只有旧版本的Rtools,无法安装新版本。还有别的选择吗?顺便说一句,我需要使用Rcpp11软件包吗?不,Rcpp11软件包与此无关。正确,但不是“and”-它是“or”。无论哪种方法都可以,第二种方法更可取,因为它与代码保持一致。非常感谢您的提示。它工作了,但我仍然有另一个错误消息。不幸的是,我仍然不能用RStudio编译我的代码。我有以下错误:“log4cplus:错误文件未打开”和“cc1plus.exe:错误:无法识别的命令行选项'-std=c++11'”编译器缺少c++11支持。您是否在Windows上使用最新的if?很遗憾,我只有旧版本的Rtools,无法安装新版本。还有别的选择吗?顺便说一句,我需要使用Rcpp11软件包吗?不,Rcpp11软件包与此无关。