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

Jelmer Ypma jelmerypma at gmail.com
Tue May 8 20:57:41 CEST 2012


Dear Douglas,

many thanks for your quick reply, that's exactly what I was looking for.

Best wishes,
Jelmer

On Tue, May 8, 2012 at 5:33 PM, Douglas Bates <bates at stat.wisc.edu> wrote:
> Thanks for the report.  It is a problem in the 'as' methods defined
> for Eigen objects.
>
> I will fix that but I think what you are trying to do is more easily
> accomplished by using a copy constructor in C++, as in the enclosed
>
> On Tue, May 8, 2012 at 10:45 AM, Jelmer Ypma <jelmerypma at gmail.com> wrote:
>> 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 )
>> } )
>> _______________________________________________
>> Rcpp-devel mailing list
>> Rcpp-devel at lists.r-forge.r-project.org
>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


More information about the Rcpp-devel mailing list