2015-09-01 2 views
0

Аналогичный вопрос был задан ранее, здесь:конвертировать Rcpp :: NumericVector в Эйгеном :: VectorXd

Converting between NumericVector/Matrix and VectorXd/MatrixXd in Rcpp(Eigen) to perform Cholesky solve

Дело в том, код, который я нашел в fastLm.cpp (в конце) не работает для меня.

Rcpp::NumericVector X((SEXP) R.parseEval("x <- 1:10")); 

Eigen::Map<Eigen::VectorXd> XS(Rcpp::as<Eigen::Map<Eigen::VectorXd>>(X)); //!!not working 

Это дает следующее сообщение об ошибке:

error: no matching constructor for initialization of 'Eigen::Map<Eigen::Matrix<double, -1, 1, 0, -1, 1>, 0, Eigen::Stride<0, 0> >' 
        Exporter(SEXP x) : t(x){} 

и (помимо прочего):

note: candidate constructor (the implicit copy constructor) not viable: cannot convert argument of incomplete type 'SEXP' (aka 'SEXPREC *') to 'const Eigen::Map<Eigen::Matrix<double, -1, 1, 0, -1, 1>, 0, Eigen::Stride<0, 0> >' 
template<typename PlainObjectType, int MapOptions, typename StrideType> class Map 

Это может иметь что-то делать с объектом Sexp?

ответ

2

Это работает для меня, если я добавлю еще одно пространство между >>:

R> cppFunction("bool conv(NumericVector X) { \ 
     Eigen::Map<Eigen::VectorXd> \ 
     XS(Rcpp::as<Eigen::Map<Eigen::VectorXd> >(X)); return true; } ", 
      depends="RcppEigen") 
R> conv(1:4) 
[1] TRUE 
R> 

Кроме того, я не думаю, что вы можете просто сказать

X((SEXP) R.parseEval("x <- 1:10")) 

если вы не используете RInside, который имеет его собственный пример для Eigen - и для этого просто

cd examples/eigen 
make 
./rinside_sample0 
./rinside_sample1 

Оба по-прежнему работают так, как должны в моя установка.

+0

Да, я использую RInside - забыл упомянуть об этом. Я посмотрел на rinside_eigen0 в примерах/на самом деле. После включения RcppEigen он работает сейчас. Благодаря! – beginneR

+0

Не проблема сама по себе, очевидно, но «шум» в контексте вашего актуального вопроса. Итак, вы, оказывается, просто использовали RInside неправильно, но это происходит. –

Смежные вопросы