Проблемы с использованием библиотеки Eigen c ++ в Rcpp для Galerkin Matrix

Я пытаюсь разработать следующий код C ++ в RStudio.

// [[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;

}

При его запуске у меня появляется длинный список ошибок из строки 41 onwords, соответствующий:

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

ошибка: «расширенные списки инициализаторов доступны только с -std = c ++ 0x или -std = gnu ++ 0x [включено по умолчанию]»

Есть ли у кого-нибудь предложения?

Заранее спасибо за помощь.

0

Решение

Поскольку кажется, что вы не можете включить C ++ 11, альтернатива состоит в том, чтобы сделать код C ++ 98 совместимым. Вместо:

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

явно использовать конструктор:

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

Другие решения

Скрипт использует синтаксис, который требует более высокого стандарта C ++, чем c ++ 98. Чтобы исправить это, есть два способа приблизиться к этому.

  1. Включите C ++ 11, поскольку R поддерживает компиляцию под C ++ 98 или C ++ 11 с использованием плагина C ++ 11 Rcpp. Это предпочтительный способ решения этой проблемы. Добавьте следующее в начало вашего cpp кода:

    // [[Rcpp::plugins(cpp11)]]
    
  2. Это исправление является непереносимым (не перемещается с файлом кода) и основано на сеансах, поэтому его необходимо повторять в каждом новом сеансе или устанавливать в .Rprofile, Это устанавливает флаг компиляции, обычно встречающийся в ~/.R/Makevars

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

По вопросам рекламы [email protected]