[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