[Rcpp-devel] Wrapping uBlas vectors into Rcpp Vectors.

Cedric Ginestet c.ginestet05 at googlemail.com
Wed Jun 1 14:28:08 CEST 2011


Dear Romain,

Thank you very much for your help. I tried what you suggested by 
including the following templated function in templatedFunction.h, as 
follows:
template <typename T>
Rcpp::Vector< Rcpp::traits::r_sexptype_traits<T>::rtype >
ublas2rcpp( const vector<T>& x ){
return Rcpp::Vector< r_sexptype_traits<T>::rtype >(
x.begin(), x.end()
) ;
}
In addition, I have tested the function using in subgraph.cpp:
Rcpp::Vector<int> xY = ublas2rcpp(Y);

And I got the following error messages:
templatedFunction.h: In function 
‘Rcpp::Vector<Rcpp::traits::r_sexptype_traits<T>::rtype> 
ublas2rcpp(const boost::numeric::ublas::vector<T>&)’:
templatedFunction.h:50:26: error: ‘r_sexptype_traits’ was not declared 
in this scope
templatedFunction.h:50:45: error: template argument 1 is invalid
subgraph.cpp: In function ‘SEXPREC* cxx_Mask2Graph(SEXPREC*, SEXPREC*, 
SEXPREC*, SEXPREC*)’:
subgraph.cpp:32:19: error: type/value mismatch at argument 1 in template 
parameter list for ‘template<int RTYPE> class Rcpp::Vector’
subgraph.cpp:32:19: error: expected a constant of type ‘int’, got ‘int’
subgraph.cpp:32:24: error: invalid type in declaration before ‘=’ token
subgraph.cpp:32:38: error: invalid conversion from ‘SEXPREC*’ to ‘int’
subgraph.cpp:34:8: error: invalid conversion from ‘int’ to ‘SEXPREC*’
...

Also, as an aside, I was wondering what I should use instead of 
push_back for Rcpp Vectors. Do I necessarily have to specify the size of 
the vector before I assign its elements to specific values?

Thanks a lot,
Cedric


On 01/06/11 11:44, Romain Francois wrote:
> Hi,
>
> I've not used uBlas, but what you are trying to do is quite similar to 
> what we do in RcppArmadillo.
>
> You can probably manage to guess the output type from the input type, 
> so you only have to parameterise your template on the input type. 
> something like (untested) :
>
> template <typename T>
> Rcpp::Vector< Rcpp::traits::r_sexptype_traits<T>::rtype >
> ublas2rcpp( const vector<T>& x ){
> return Rcpp::Vector< r_sexptype_traits<T>::rtype >(
> x.begin(), x.end()
> ) ;
> }
>
> This way you don't have to specify template parameter when you call 
> ublas2rcpp because the compiler is smart enough.
>
> Nicer than this would be to implement wrap and as for ublas vectors, 
> the way to go is documented in the Rcpp-extended vignettes, with 
> examples implementations in RcppArmadillo and RcppGSL.
>
> As a side note, you don't want to use push_back on Rcpp types, because 
> it creates a new vector each time, so this is HUGE memory waste.
>
> Now, this could get much smarter as ublas has vector expressions, 
> similar to armadillo, so I suppose someone could write something like 
> RcppUBlas with nice goodies. This is not me, at least not now ;-)
>
> Romain
>
>
> Le 01/06/11 12:24, Cedric Ginestet a écrit :
>> Dear Rcpp experts,
>>
>> I have started to use the uBlas library, and I am trying to ensure that
>> I can pass from uBlas vectors to Rcpp vectors relatively easily. So far,
>> I have tried the following templated function:
>>
>> ///////////////////////////////////////////////////////////////////////
>> using namespace Rcpp;
>> using namespace boost::numeric::ublas;
>>
>> template <class T1, class T2>
>> T1 ublas2rcpp(T2& uVec){
>> T1 rcppVec;
>> for(int i=0; i<uVec.size(); ++i) rcppVec.push_back(uVec(i));
>> return rcppVec;
>> }//ublas2rcpp.
>>
>> ////////
>> SEXP foo(vector<int> &y){
>> ...
>> IntegerVector rcppY=ublas2rcpp<IntegerVector,vector<int> >(y);
>> ....
>> return rcppY;
>> }
>> ///////////////////////////////////////////////////////////////////////
>>
>> I have got two questions:
>> a. This templated function doesn't work. It compiles fine, but hangs
>> when I try to run it in R. What do you think is faulty in the codes 
>> above?
>> b. Is there a better way to wrap uBlas vectors into Rcpp ones? Is that
>> something that you are planning to implement (or have already
>> implemented) within the Rcpp suite?
>>
>> Thank you very much for your help,
>>
>> -- 
>> Cedric Ginestet, PhD
>> Centre for Neuroimaging Sciences (L3.04)
>> NIHR Biomedical Research Centre
>> Department of Neuroimaging
>> Institute of Psychiatry, Box P089
>> King's College London
>> De Crespigny Park
>> London
>> SE5 8AF
>> http://arxiv.org/find/q-bio/1/au:+Ginestet_C/0/1/0/all/0/1
>


More information about the Rcpp-devel mailing list