[Rcpp-devel] Integer matrices in Rcpp and Armadillo
Simon Zehnder
szehnder at uni-bonn.de
Thu Jun 6 19:05:24 CEST 2013
Hi Romain,
sorry I had overseen this message from you. Okay, so the explicit cast to SEXP together with the assignment operator makes the deal. But it still includes the reuse of memory right, i.e. the '=' does not call the copy constructor?
Further, this only solves the ambiguity for the conversion from the class slot to an Rcpp::IntegerMatrix. in the next step then, I create the arma::it matrix:
cfunction <- cxxfunction(signature(myClass_R = "array"), body = 'Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS = (SEXP) myclass.slot("S"); arma::imat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);', plugin = "RcppArmadillo")
The result is an arma:imat matrix reusing the memory of the array in R (which of course has then to be array(integer(), dim = c(100,10)))?
Best
Simon
On Jun 6, 2013, at 6:37 PM, Romain Francois <romain at r-enthusiasts.com> wrote:
> Le 06/06/13 18:03, Simon Zehnder a écrit :
>> Hi Rcpp:Users, and Rcpp::Devels,
>>
>> I encountered the following problem when working today/yesterday on my project:
>>
>> 1. In R create an S4-object with the following slot:
>>
>> setClass("myclass", representation(S = "array"))
>>
>> mclass <- new("myclass", S = array(0, dim = c(100, 10)))
>>
>> 2. In C++ compile a function which does the following:
>>
>> library(inline)
>> cfunction <- cxxfunction(signature(myClass_R = "array"), body = 'Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS(myclass.slot("S")); arma::umat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);', plugin = "RcppArmadillo")
>>
>> I get the error:
>>
>> Error in compileCode(f, code, language = language, verbose = verbose) :
>> Compilation ERROR, function(s)/method(s) not created! file2508289bd859.cpp: In function ‘SEXPREC* file2508289bd859(SEXP)’:
>> file2508289bd859.cpp:30:70: error: call of overloaded ‘Matrix(Rcpp::RObject::SlotProxy)’ is ambiguous
>> Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS(myclass.slot("S")); arma::umat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);
>> ^
>> file2508289bd859.cpp:30:70: note: candidates are:
>> In file included from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/Vector.h:60:0,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/Promise.h:26,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp.h:34,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppArmadillo/include/RcppArmadillo.
>> In addition: Warning message:
>> running command '/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file2508289bd859.cpp 2> file2508289bd859.cpp.err.txt' had status 1
>
> There is compiler ambiguity, one way to deal with it is to use this;
>
> IntegerMatrix iS = (SEXP)myClass.slot("S");
>
> The (SEXP) will deal with the ambiguity.
>
>> --------------------------------------------------------
>> NEXT APPROACH:
>>
>> 1. Set the S to integers:
>>
>> mclass <- new("myclass", S = array(integer(), dim = c(100, 10)))
>>
>> 2. Compile the C++ function
>>
>> cfunction <- cxxfunction(signature(myClass_R = "array"), body = 'Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS(myclass.slot("S")); arma::umat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);', plugin = "RcppArmadillo")
>>
>> I get the error:
>>
>> Error in compileCode(f, code, language = language, verbose = verbose) :
>> Compilation ERROR, function(s)/method(s) not created! file2508f98cfe3.cpp: In function ‘SEXPREC* file2508f98cfe3(SEXP)’:
>> file2508f98cfe3.cpp:30:70: error: call of overloaded ‘Matrix(Rcpp::RObject::SlotProxy)’ is ambiguous
>> Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS(myclass.slot("S")); arma::umat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);
>> ^
>> file2508f98cfe3.cpp:30:70: note: candidates are:
>> In file included from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/Vector.h:60:0,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/Promise.h:26,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp.h:34,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppArmadillo/include/RcppArmadillo.h:30
>> In addition: Warning message:
>> running command '/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file2508f98cfe3.cpp 2> file2508f98cfe3.cpp.err.txt' had status 1
>> --------------------------------------------------------
>> NEXT APPROACH:
>>
>> 1. Create a class object:
>>
>> mclass <- new("myclass", S = array(0, dim = c(100, 10)))
>>
>> 2. Compile C++-function by using Rcpp::as<>() for type casting:
>>
>> cfunction <- cxxfunction(signature(myClass_R = "array"), body = 'Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS(Rcpp::as<Rcpp::IntegerMatrix>(myclass.slot("S"))); arma::umat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);', plugin = "RcppArmadillo")
>>
>> I get the error:
>>
>> Error in compileCode(f, code, language = language, verbose = verbose) :
>> Compilation ERROR, function(s)/method(s) not created! file250879784814.cpp: In function ‘SEXPREC* file250879784814(SEXP)’:
>> file250879784814.cpp:30:130: error: invalid conversion from ‘Rcpp::Matrix<13>::iterator {aka int*}’ to ‘unsigned int*’ [-fpermissive]
>> Rcpp::S4 myclass(myClass_R); Rcpp::IntegerMatrix iS(Rcpp::as<Rcpp::IntegerMatrix>(myclass.slot("S"))); arma::umat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);
>> ^
>> In file included from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppArmadillo/include/armadillo:138:0,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppArmadillo/include/RcppArmadilloForward.h:36,
>> from /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppArmadillo/include/RcppArmadillo.h:29,
>>
>> In addition: Warning message:
>> running command '/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file250879784814.cpp 2> file250879784814.cpp.err.txt' had status 1
>>
>> Further, I get the same errors for
>>
>> setClass("myclass", representation(S = "matrix")) instead of setClass("myclass", representation(S = "array"))
>>
>> --------------------------------------------------------
>>
>> It runs though, when I use the following:
>>
>> 1. Set the class:
>>
>> setClass("myclass", representation(S = "array"))
>> mclass <- new("myclass", S = array(0, dim = c(100, 10)))
>>
>> 2. Compile the function in C++:
>>
>> cfunction <- cxxfunction(signature(myClass_R = "array"), body = 'Rcpp::S4 myclass(myClass_R); Rcpp::NumericMatrix iS(Rcpp::as<Rcpp::NumericMatrix>(myclass.slot("S"))); arma::mat armaS(iS.begin(), 100, 10, false, true); armaS.print("armaS:"); return Rcpp::wrap(1);', plugin = "RcppArmadillo")
>>
>> 3. Run the function:
>>
>> cfunction(mclass)
>>
>>
>> ------------------------------------------------------
>>
>> What I need is an arma::umat in C++ and if possible in addition an integer array in R. Is this possible?
>>
>>
>> Best
>>
>> Simon
>>
>> _______________________________________________
>> 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
>>
>
>
> --
> Romain Francois
> Professional R Enthusiast
> +33(0) 6 28 91 30 30
>
> R Graph Gallery: http://gallery.r-enthusiasts.com
>
> blog: http://blog.r-enthusiasts.com
> |- http://bit.ly/Zs97qg : highlight 0.4.1
> `- http://bit.ly/10X94UM : Mobile version of the graph gallery
>
> _______________________________________________
> 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