On 28 February 2012 at 10:54, Chris DuBois wrote: | Hi all, | | Given a vector of integers x = sample(1:K,N,replace=TRUE) with N > K, | I want to return a list where element k is a vector of indices i where | x[i] = k. (If there is already an R function for this, please let me | know!) Here is the Rcpp code: | | // xr: vector of integers | // mr: max | superwhich <- cxxfunction(signature(xr="integer",Kr="integer"), | ' | int K = as<int>(Kr); | Rcpp::IntegerVector x(xr); | | // Initialize vector of vectors | std::vector< std::vector<int> > xx; | for (int i = 0; i < K; i++) { | std::vector<int> tmp(0); | xx.push_back(tmp); | } | | // Push onto appropriate vector for each element of x | for (int i = 0; i < x.size(); i++) { | xx[x[i]].push_back(i); | } | return wrap(xx); | ', plugin="Rcpp") | | For example: | > x <- c(1,3,3,1) | > superwhich(x,4) | [[1]] | integer(0) | | [[2]] | [1] 0 3 | | [[3]] | integer(0) | | [[4]] | [1] 1 2 | | | So with large vectors and large values of K, I occasionally get | segfaults. I believe I have thoroughly checked that I am not making
Second one today of that flavour :-/ | indexing errors. I believe I am running into garbage collection | issues. Isn't wrap() good enough to make R objects? I could use | Rcpp::List from the start, but is there an equivalent of push_back for | Rcpp::IntegerVectors? (I've read the documentation, and I apologize | in advance if I am missing something obvious.) I do not think you do. "Occassionally" things seem to go astray on large problems. I don't usually get hit by this. Doug Bates however had issues with RcppEigen and has been using memory debuggers like valgrind. The issue is that those are somewhat hard to use, slow everything down and maybe demand on idea of the underlying code. That said, you can also "just run" with valgrind and see if it reports something. Dirk -- "Outside of a dog, a book is a man's best friend. Inside of a dog, it is too dark to read." -- Groucho Marx _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel