Ошибка отображения собственных данных Rcpp с MatrixXf

#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 тип.