#c #r #eigen #rcpp
#c #r #eigen #rcpp
Вопрос:
Почему следующий код не компилируется?
library(Rcpp)
cppFunction('
int rows(const NumericMatrixamp; X) {
using Eigen::MatrixXf;
typedef Eigen::Map<MatrixXf> MapMat;
MapMat X1(as<MapMat>(X));
return X1.rows();
}', depends = "RcppEigen")
Выдает следующую ошибку:
error: no matching function for call to 'Eigen::Map<Eigen::Matrix<float, -1, -1> >::Map(Rcpp::Vector<14, Rcpp::PreserveStorage>::iterator, intamp;, intamp;)'
OUT get() {return OUT(vec.begin(), d_nrow, d_ncol );}
Тот же код отлично работает, когда я использовал вместо него MatrixXd.
Спасибо.
Комментарии:
1. Мы не поддерживаем
float
интерфейс R, поскольку R имеет толькоdouble
.2. Спасибо, я не знал об этом.
Ответ №1:
NumericMatrix
использует тип double
(в отличие от float
). Собственный код не поддерживает неявное приведение типов между матрицами, использующими разные типы. Похоже, что ваш код пытается прочитать память a double
NumericMatrix
как float
собственную матрицу. Вместо этого просто используйте MatrixXd
тип.