Update -- I've implemented all of R's sample (with identical results) except for the walker alias method. I used Armadillo for ProbSampleReplace and ProbSampleNoReplace, since there's no good STL replacement for R's revsort. I'll submit a patch to RcppArmadillo when I get a chance. If anyone wants this in the meantime, I can email the source as a package that contains some example glue and unit tests.<br>
<br>best,<br>Christian<br><br><div class="gmail_quote">On Sat, Nov 3, 2012 at 4:52 AM, Christian Gunning <span dir="ltr"><<a href="mailto:xian@unm.edu" target="_blank">xian@unm.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear all,<br><br>Code for uniform sampling is below, following the prototype from earlier post. Results/unit-tests (not included) are identical to R-core sample().<br><br>-Christian<br><br><div>template <class T> <br>
T sample(const T &x, const unsigned int size, const bool replace ) {<br>Â Â Â int ii, jj;<br>Â Â Â int nOrig = x.size();<br>Â Â Â T ret(size);<br>Â Â Â if ( size > nOrig && !replace) throw std::range_error( "Tried to sample more elements than in x without replacement" ) ;<br>
   IntegerVector index(size);<br>   if (replace) {<br>       SampleReplace(index, nOrig);<br>   } else {<br>       SampleNoReplace(index, nOrig);<br>   }<br><br>   for (ii=0; ii<size; ii++) {<br>       jj = index[ii];<br>
       ret[ii] = x[jj];<br>   }<br>   return(ret);<br>}<br><br>void SampleReplace( IntegerVector index, unsigned int nOrig) {<br>   int ii;<br>   int nSample = index.size();<br>   for (ii = 0; ii < nSample; ii++) {<br>
       index[ii] = nOrig * unif_rand();<br>   }<br>}<br><br>void SampleNoReplace( IntegerVector index, unsigned int nOrig) {<br>   int ii, jj;<br>   int nSample = index.size();<br>   IntegerVector sub(nOrig);<br>   for (ii = 0; ii < nOrig; ii++) {<br>
       sub[ii] = ii;<br>   }<br><br>   for (ii = 0; ii < nSample; ii++) {<br>       jj = nOrig * unif_rand();<br>       index[ii] = sub[jj];<br>       // replace sampled element with last, decrement<br>       sub[jj] = sub[--nOrig];<br>
   }<br>}<br></div>
</blockquote></div><br><br clear="all"><br>-- <br>A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!<br>