[Rcpp-devel] Accessing list of list members to permute them
Dale Smith
dtsmith at mindspring.com
Fri Apr 3 19:10:43 CEST 2015
Hi,
Instead of posting this code to the list, a better idea is to write up your solution for RcppGallery. That way you can share code with a wider audience.
http://gallery.rcpp.org <http://gallery.rcpp.org/>
Dale Smith
dtsmith at mindspring.com
> On Apr 3, 2015, at 8:02 AM, ogami musashi <uragami at hotmail.com> wrote:
>
> Hello Romain and Christian,
>
> Following christian advice on learning how to walk before running but taking romain's hints i succeeded in writing a code that does the same permutation but on a list of matrices. I had in fact always access the same nested list element which is a matrix i simply created a new 1000 elements list with matrices inside.
>
> The whole thing took 54 sec in cpp versus 28 minutes in R! So thank you!
>
> When i have time i'll try to see if working on list of list is possible.
>
> Anyway so that it may be of use for anyone that would encounter the same problem here's my code:
>
> "#include <Rcpp.h>
> using namespace Rcpp;
>
> // [[Rcpp::export]]
>
> List RearrangeList(List x){
> List output;
> size_t ni=x.size();
>
> NumericMatrix matout=x[0];
> int nrows=matout.nrow();
> int ncols=matout.ncol();
>
>
>
>
> //create matrixes in the output list
> for (int k=0; k<ncols; k++)
> {
> NumericMatrix mat_init_out_i(nrows,x.size());
> output.push_back(mat_init_out_i);
>
> }
>
> //Permutation (needs same number of columns for all matrices in the list)
> for (int j=0;j<ncols;j++)
> {
>
>
> NumericMatrix matx_bind(nrows,x.size());
>
>
>
> for (int i=0;i<x.size();i++)
> {
> NumericMatrix matx=x[i];
> NumericVector vecx_i_j(matx.nrow());
> vecx_i_j=matx(_,j);
>
> matx_bind(_,i)=vecx_i_j;
> }
> //output.push_back(matx_bind);
> output[j]=matx_bind;
> }
>
>
>
> return output;
> }"
>
> On 30/03/15 11:05, ogami musashi wrote:
>> Hello
>>
>> I'm a Rcpp newbie, so sorry if the question is trivial.
>>
>> I have an R object which is a list of 1000 elements. Each elements is a result from a discrete wavelet transform (from package wmtsa) with 5 elements. One of them have a 50000 rows and 16 colums.
>>
>> The first level (1000) are in fact random signals of 50 000 days. On each of them i ran a DWT that separated each signal into 16 components (of decreasing frequency) for each day thus resulting in a 50000 days * 16 components matrix for each of the 1000 signals.
>>
>> I would like to sort it like that: for each component (a list of 16 elements) having for each day (50000 rows) the 1000 signals (1000 columns)
>>
>>
>> here are the objects in R:
>>
>> dwtlist: 1000 elements * 5 elements* (50000*16) matrix
>> sortdwtlist:16 elements*(50000*1000) matrix
>>
>> the code in R:
>>
>> for(i in 1:16){
>>
>> for(j in 1:50000){
>>
>> for (k in 1:1000){
>>
>> sortdwtlist[[i]][j,k]<-dwtlist[[k]][[1]][j,i]
>> }
>> }
>> }
>>
>>
>> This takes about 27 minutes to complete.
>>
>> I thus tried to put in C++ using Rcpp (i'm using sourceCpp):
>>
>> #include <Rcpp.h>
>> using namespace Rcpp;
>>
>> // [[Rcpp::export]]
>>
>> List rearrangelist(List x){
>> int ni=15;
>> int nj=49999;
>> int nk=999;
>> List output;
>>
>> for (int i= 0 ; i<ni ; i++){
>> for (int j=0 ; j<nj ; j++) {
>> for (int k=0 ; j<nk ; k++){
>> output[i](j,k)=x[k][0](j,i);
>> }
>> }
>> }
>> return output;
>> }
>>
>>
>> But it doesn't work. error stops at the line of permutation, so i'm sure there's something with the types inside the list.
>> Can someone help me?
>>
>> Thank you!
>>
>>
>>
>> _______________________________________________
>> 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
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20150403/578ec1a3/attachment.html>
More information about the Rcpp-devel
mailing list