<div dir="ltr">Sorry but I am still struggling (even after reformatting the source code) to understand what the problem is.  For one thing it is not clear to me what the Cm_class is for.<div><br></div><div style>The fundamental rule for me is that I always declare functions like</div>
<div style><br></div><div style>//[[Rcpp::Export]]</div><div style>Eigen::VectorXd testfunc(const MapVecd ytrait, const MapMatd xmat) {</div><div style>   ...</div><div style>}</div><div style><br></div><div style>If you need to get a pointer to the contents of the matrix you could use a const_cast but in that case I don't understand why you would use the Eigen classes.  If all you want is the dimensions and a pointer to the contents you should use NumericMatrix class.</div>
<div style><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jan 31, 2013 at 1:27 PM, M A <span dir="ltr"><<a href="mailto:markoilcan@gmail.com" target="_blank">markoilcan@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Right. The problem comes up because of the constructor with one of my<br>
classes. Here is a slightly extended minimal example:<br>
<div class="im"><br>
// [[Rcpp::depends(RcppEigen)]]<br>
<br>
#include <RcppEigen.h><br>
#include <Rcpp.h><br>
<br>
typedef Eigen::Map<Eigen::VectorXd> MapVecd;<br>
</div>typedef Eigen::Map<Eigen::MatrixXd> MapMatd; // (A). This one works<br>
with (1) below<br>
//typedef Eigen::Map<const Eigen::MatrixXd> MapMatd; // (B). This one<br>
fails with (1) below<br>
<br>
class Cm_class {<br>
public:<br>
    const MapMatd c_matrix;<br>
<br>
    //Cm_class( double *p_pdmat, const int nr, const int nc ) : //<br>
Works with (A) or (B)<br>
    Cm_class( const double *p_pdmat, const int nr, const int nc ) : //<br>
Works with (B) fails with (A)<br>
        c_matrix(p_pdmat, nr, nc) {}<br>
};<br>
<br>
//Eigen::VectorXd testfunc(const MapVecd ytrait, MapMatd xmat) { //<br>
(1). This only works with (A)<br>
// [[Rcpp::export]]<br>
Eigen::VectorXd testfunc(const MapVecd ytrait) {<br>
<br>
    return ytrait;<br>
}<br>
<br>
I really want testfunc to be as in (1) where xmat gets mapped into a<br>
double matrix, though I take it out above for simplicity. I have my<br>
class constructor taking a const double*, but that fails with the<br>
typedef (A), the way you recommend. To get that constructor<br>
initialization to work I have to use typedef (B), but that causes<br>
failure with (1), which is what I was originally writing about. I can<br>
certainly work around this by removing the const from the double* in<br>
the class constructor, etc, but I guess there's the larger question of<br>
whether the RcppEigen 'as' function should be able to form an<br>
Eigen::Map<const Eigen::MatrixXd>. Thanks for the info regarding the<br>
point of failure.<br>
<br>
Mark A<br>
<div class="HOEnZb"><div class="h5"><br>
On Thu, Jan 31, 2013 at 11:34 AM, Douglas Bates <<a href="mailto:bates@stat.wisc.edu">bates@stat.wisc.edu</a>> wrote:<br>
> I should check the syntax before sending the message.<br>
><br>
> On Thu, Jan 31, 2013 at 11:30 AM, Douglas Bates <<a href="mailto:bates@stat.wisc.edu">bates@stat.wisc.edu</a>> wrote:<br>
>><br>
>> The as function in RcppEigen can form an<br>
>><br>
>> Eigen::Map<Eigen::MatrixXd><br>
>><br>
>> but doesn't know how to form an<br>
>><br>
>> Eigen::Map<const Eigen::MatrixXd><br>
>><br>
>> Generally I find that I confuse myself less when the const is outside the<br>
>> Eigen::Map.  In other words, I use something like<br>
>><br>
>> typedef Eigen::Map<Eigen::MatrixXd> mMat;<br>
>><br>
>> const mMat M(mat_from_R);<br>
><br>
><br>
> That should be<br>
><br>
> const mMat M = as<mMat>(mat_from_R);<br>
><br>
> Well, at least I think so.<br>
><br>
> The bottom line is that I find it easier to use const in the declaration of<br>
> an instance of a class, not in the typedef.<br>
>><br>
>><br>
>> This tells me that M is a mapped MatrixXd object which is constructed from<br>
>> the SEXP mat_from_R and is read-only.<br>
>><br>
>><br>
>><br>
>> On Thu, Jan 31, 2013 at 11:01 AM, M A <<a href="mailto:markoilcan@gmail.com">markoilcan@gmail.com</a>> wrote:<br>
>>><br>
>>> I am compiling some source code using sourceCpp and getting a<br>
>>> compiling failure when the source has the line with the const keyword<br>
>>> but no failure when it does not, in the below source.<br>
>>><br>
>>> // file: minimaltest.cpp<br>
>>> // [[Rcpp::depends(RcppEigen)]]<br>
>>><br>
>>> #include <RcppEigen.h><br>
>>> #include <Rcpp.h><br>
>>><br>
>>> typedef Eigen::Map<Eigen::VectorXd> MapVecd;<br>
>>> //typedef Eigen::Map<Eigen::MatrixXd> MapMatd; // This one works<br>
>>> typedef Eigen::Map<const Eigen::MatrixXd> MapMatd; // This one fails<br>
>>><br>
>>> // [[Rcpp::export]]<br>
>>> Eigen::VectorXd testfunc(const MapVecd ytrait, MapMatd xmat) {<br>
>>><br>
>>>     return ytrait;<br>
>>> }<br>
>>><br>
>>> This is the error:<br>
>>><br>
>>> > sourceCpp("minimaltest.cpp")<br>
>>> g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include<br>
>>> -I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG<br>
>>> -I/usr/local/include<br>
>>><br>
>>> -I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include"<br>
>>><br>
>>> -I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include"<br>
>>>   -fPIC  -g -O2  -c minimaltest.cpp -o minimaltest.o<br>
>>> Error in sourceCpp("minimaltest.cpp") :<br>
>>>   Error 1 occurred building shared library.<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:<br>
>>> In constructor ‘Rcpp::traits::Exporter<T>::Exporter(SEXPREC*) [with T<br>
>>> = Eigen::Map<const Eigen::Matrix<double, -0x00000000000000001,<br>
>>> -0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,<br>
>>> 0, Eigen::Stride<0, 0> >]’:<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/as.h:67:<br>
>>>   instantiated from ‘T Rcpp::internal::as(SEXPREC*,<br>
>>> Rcpp::traits::r_type_generic_tag) [with T = Eigen::Map<const<br>
>>> Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
>>> -0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0><br>
>>> >]’<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/as.h:112:<br>
>>>   instantiated from ‘T Rcpp::as(SEXPREC*) [with T = Eigen::Map<const<br>
>>> Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
>>> -0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0><br>
>>> >]’<br>
>>> minimaltest.cpp:35:   instantiated from here<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:31:<br>
>>> error: no matching function for call to ‘Eigen::Map<const<br>
>>> Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
>>> -0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0><br>
>>> >::Map(SEXPREC*&)’<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:164:<br>
>>> note: candidates are: Eigen::Map<MatrixType, MapOptions,<br>
>>> StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,<br>
>>> MapOptions, StrideType>,<br>
>>> (Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,<br>
>>> MapOptions, StrideType> >::has_write_access ?  WriteAccessors :<br>
>>> ReadOnlyAccessors)>::PointerType, typename<br>
>>> Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,<br>
>>> StrideType> >::Index, typename<br>
>>> Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,<br>
>>> StrideType> >::Index, const StrideType&) [with PlainObjectType = const<br>
>>> Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
>>> -0x00000000000000001, -0x00000000000000001>, int MapOptions = 0,<br>
>>> StrideType = Eigen::Stride<0, 0>]<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:151:<br>
>>> note:                 Eigen::Map<MatrixType, MapOptions,<br>
>>> StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,<br>
>>> MapOptions, StrideType>,<br>
>>> (Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,<br>
>>> MapOptions, StrideType> >::has_write_access ?  WriteAccessors :<br>
>>> ReadOnlyAccessors)>::PointerType, typename<br>
>>> Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,<br>
>>> StrideType> >::Index, const StrideType&) [with PlainObjectType = const<br>
>>> Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
>>> -0x00000000000000001, -0x00000000000000001>, int MapOptions = 0,<br>
>>> StrideType = Eigen::Stride<0, 0>]<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:139:<br>
>>> note:                 Eigen::Map<MatrixType, MapOptions,<br>
>>> StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,<br>
>>> MapOptions, StrideType>,<br>
>>> (Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,<br>
>>> MapOptions, StrideType> >::has_write_access ?  WriteAccessors :<br>
>>> ReadOnlyAccessors)>::PointerType, const StrideType&) [with<br>
>>> PlainObjectType = const Eigen::Matrix<double, -0x00000000000000001,<br>
>>> -0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,<br>
>>> int MapOptions = 0, StrideType = Eigen::Stride<0, 0>]<br>
>>><br>
>>> /Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:106:<br>
>>> note:                 Eigen::Map<const Eigen::Matrix<double,<br>
>>> -0x00000000000000001, -0x00000000000000001, 0, -0x00000000000000001,<br>
>>> -0x00000000000000001>, 0, Eigen::Stride<0, 0> >::Map(const<br>
>>> Eigen::Map<const Eigen::Matrix<double, -0x00000000000000001,<br>
>>> -0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,<br>
>>> 0, Eigen::Stride<0, 0> >&)<br>
>>> make: *** [minimaltest.o] Error 1<br>
>>><br>
>>> Here is my session info:<br>
>>> > sessionInfo()<br>
>>> R version 2.15.2 (2012-10-26)<br>
>>> Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)<br>
>>><br>
>>> locale:<br>
>>> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8<br>
>>><br>
>>> attached base packages:<br>
>>> [1] stats     graphics  grDevices utils     datasets  methods   base<br>
>>><br>
>>> other attached packages:<br>
>>> [1] RcppEigen_0.3.1.2 Matrix_1.0-9      lattice_0.20-10   Rcpp_0.10.2<br>
>>><br>
>>> loaded via a namespace (and not attached):<br>
>>> [1] grid_2.15.2  tools_2.15.2<br>
>>><br>
>>> Note that the g++... portion works fine on the command line, so I<br>
>>> guess the failure is somewhere in the building of the library. Of<br>
>>> course I can get around this by not using the const keyword, but why<br>
>>> is there a problem and what is the right fix?<br>
>>><br>
>>> Thanks,<br>
>>> Mark A<br>
>>> _______________________________________________<br>
>>> Rcpp-devel mailing list<br>
>>> <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
>>> <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
>><br>
>><br>
><br>
</div></div></blockquote></div><br></div>