[Rcpp-devel] Compilation error using Rcpp::as<Eigen::MatrixXd>

Jelmer Ypma jelmerypma at gmail.com
Tue May 8 17:45:34 CEST 2012


Hi all,

I've been happily using the RcppEigen package for a couple of
projects, but now I'm running into problems converting a matrix from R
into an Eigen::MatrixXd. Converting an R matrix to an
Eigen::Map<Eigen::MatrixXd> works fine, but I would like to (deep)copy
the values from R to a C++ Eigen::MatrixXd object. From the definition
for the Exporter for Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
in RcppEigen/inst/include/RcppEigenWrap.h, it looks like
Rcpp::as<Eigen::MatrixXd> could be used, but when compiling some
example code (see below) I get an error (see below). Compiling the
same code with an arma::mat or with Eigen::Map<Eigen::MatrixXd> does
not result in any errors.

Does anyone have an idea what is causing this?

Many thanks in advance and best wishes,
Jelmer


> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United
Kingdom.1252    LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] inline_0.3.8          RcppArmadillo_0.3.0.3 RcppEigen_0.2.0
Rcpp_0.9.10

loaded via a namespace (and not attached):
[1] grid_2.15.0    lattice_0.20-6 Matrix_1.0-6   tools_2.15.0



The error I get, is:

In file included from c:/tools/R/library/RcppEigen/include/Eigen/Core:282:0,
                 from c:/tools/R/library/RcppEigen/include/Eigen/Dense:1,
                 from
c:/tools/R/library/RcppEigen/include/RcppEigenForward.h:29,
                 from c:/tools/R/library/RcppEigen/include/RcppEigen.h:25,
                 from file160c52054c0.cpp:3:
c:/tools/R/library/RcppEigen/include/Eigen/src/Core/DenseCoeffsBase.h:
In member function 'Eigen::DenseCoeffsBase<Derived, 1>::Scalar&
Eigen::DenseCoeffsBase<Derived,
1>::operator[](Eigen::DenseCoeffsBase<Derived, 1>::Index) [with
Derived = Eigen::Matrix<double, -0x00000000000000001,
-0x00000000000000001>, Eigen::DenseCoeffsBase<Derived, 1>::Scalar =
double, Eigen::DenseCoeffsBase<Derived, 1>::Index = int]':
c:/tools/R/library/Rcpp/include/Rcpp/internal/export.h:89:3:
instantiated from 'void Rcpp::internal::export_indexing__impl(SEXP,
T&, Rcpp::traits::false_type) [with T = Eigen::Matrix<double,
-0x00000000000000001, -0x00000000000000001>, value_type = double, SEXP
= SEXPREC*, Rcpp::traits::false_type =
Rcpp::traits::integral_constant<bool, false>]'
c:/tools/R/library/Rcpp/include/Rcpp/internal/export.h:109:6:
instantiated from 'void
Rcpp::internal::export_indexing__dispatch(SEXP, T&,
Rcpp::traits::r_type_primitive_tag) [with T = Eigen::Matrix<double,
-0x00000000000000001, -0x00000000000000001>, value_type = double, SEXP
= SEXPREC*]'
c:/tools/R/library/Rcpp/include/Rcpp/internal/export.h:127:6:
instantiated from 'void Rcpp::internal::export_indexing(SEXP, T&)
[with T = Eigen::Matrix<double, -0x00000000000000001,
-0x00000000000000001>, value_type = double, SEXP = SEXPREC*]'
c:/tools/R/library/Rcpp/include/Rcpp/traits/Exporter.h:86:17:
instantiated from 'T Rcpp::traits::MatrixExporter<T,
value_type>::get() [with T = Eigen::Matrix<double,
-0x00000000000000001, -0x00000000000000001>, value_type = double]'
c:/tools/R/library/Rcpp/include/Rcpp/as.h:53:33:   instantiated from
'T Rcpp::internal::as(SEXP, Rcpp::traits::r_type_generic_tag) [with T
= Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>,
SEXP = SEXPREC*]'
c:/tools/R/library/Rcpp/include/Rcpp/as.h:75:89:   instantiated from
'T Rcpp::as(SEXP) [with T = Eigen::Matrix<double,
-0x00000000000000001, -0x00000000000000001>, SEXP = SEXPREC*]'
file160c52054c0.cpp:31:40:   instantiated from here
c:/tools/R/library/RcppEigen/include/Eigen/src/Core/DenseCoeffsBase.h:388:7:
error: 'THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD'
is not a member of 'Eigen::internal::static_assertion<false>'
make: *** [file160c52054c0.o] Error 1

ERROR(s) during compilation: source code errors or compiler
configuration errors!


The code I used for the example is:

library('RcppEigen')
library('RcppArmadillo')
library('inline')

# Define C++ some function that uses a matrix as input.
# MatrixType will be defined using a typedef in includes,
# when compiling the function below.
# MatrixType will take on values
#   * arma::mat
#   * Eigen::MatrixXd
#   * Eigen::Map<Eigen::MatrixXd>
printMatrix_code <- '
MatrixType _A( Rcpp::as<MatrixType>( A ) );

Rcpp::Rcout << "_A: " << std::endl << _A << std::endl;

return R_NilValue;
'

# Define some matrix A
set.seed( 3141 )
A <- matrix( rnorm( 10 ), nrow=5, ncol=2 )
A

# Compile using MatrixType = arma::mat
# (WORKS)
try( {
printArmaMatrix <- cxxfunction(
    signature(A="matrix"),
    printMatrix_code,
    plugin="RcppArmadillo",
    includes = 'typedef arma::mat MatrixType;',
    verbose=TRUE )

printArmaMatrix( A )
} )

# Compile using MatrixType = Eigen::MatrixXd
# (FAILS)
try( {
printEigenMatrix <- cxxfunction(
    signature(A="matrix"),
    printMatrix_code,
    plugin="RcppEigen",
    includes = 'typedef Eigen::MatrixXd MatrixType;',
    verbose=TRUE )

printEigenMatrix( A )
} )

# Compile using MatrixType = Eigen::Map<Eigen::MatrixXd>
# (WORKS)
try( {
printEigenMappedMatrix <- cxxfunction(
    signature(A="matrix"),
    printMatrix_code,
    plugin="RcppEigen",
    includes = 'typedef Eigen::Map<Eigen::MatrixXd> MatrixType;',
    verbose=TRUE )

printEigenMappedMatrix( A )
} )


More information about the Rcpp-devel mailing list