<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>@font-face {
        font-family: Calibri;
}
@page WordSection1 {margin: 72.0pt 72.0pt 72.0pt 72.0pt; }
P.MsoNormal {
        MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
LI.MsoNormal {
        MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
DIV.MsoNormal {
        MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
A:link {
        COLOR: blue; TEXT-DECORATION: underline
}
SPAN.MsoHyperlink {
        COLOR: blue; TEXT-DECORATION: underline
}
A:visited {
        COLOR: purple; TEXT-DECORATION: underline
}
SPAN.MsoHyperlinkFollowed {
        COLOR: purple; TEXT-DECORATION: underline
}
SPAN.EmailStyle17 {
        FONT-FAMILY: "Calibri","sans-serif"; COLOR: windowtext
}
.MsoChpDefault {
        FONT-FAMILY: "Calibri","sans-serif"
}
</style><style id="owaParaStyle">P {
        MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
}
</style>
</head>
<body lang="EN-GB" vlink="purple" link="blue" fPStyle="1" ocsi="0">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">
<div>Hi list - although not strictly (or not really at all..) an&nbsp;Rcpp<a></a> problem - I thought that since there are so many 'better-than-I'&nbsp;c&#43;&#43;<a></a> coders here - whom are familiar with R... it might be a good place to ask.</div>
<div>&nbsp;</div>
<div></div>
<div>I have a &quot;naive&quot; piece of code - that in essence replicates what the R function &quot;sample&quot; does.</div>
<div>&nbsp;</div>
<div>Here is a full/toy example using inline, below.&nbsp;</div>
<div>&nbsp;</div>
<div>My problem is this is used in part of a&nbsp;larger piece of code.. and it is a major bottleneck... Where I have put 50,000 in the function below - what I am really using is</div>
<div>10,000,000 so sscpp2(ttin,10000000,1.0,126) is the real function call.</div>
<div>&nbsp;</div>
<div>I have toyed with the idea of running all the &quot;runifs<a></a>&quot; at once (hence the&nbsp;make_matrix<a></a> function) but R complains about allocating large vectors..sometimes<a></a>.</div>
<div>&nbsp;</div>
<div>I have also tried using std::random_shuffle<a></a> (to get rid of the runifs<a></a>) - although performance is then dependent upon the size of the incoming vector 'RetIn<a></a>' (why shuffle all the elements when I only need some, etc).</div>
<div>&nbsp;</div>
<div>I have thought (but not tried) importing R's sample function...but I suspect this may be a totally rude idea.</div>
<div>&nbsp;</div>
<div>If anyone has time, or inclination, if they spot a dumb idea in my code - or know a better&nbsp;Rcpp<a></a>&nbsp;way to do this - Id much appreciate it!</div>
<div>&nbsp;</div>
<div>Thanks, chris<a></a></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="FONT-FAMILY: Times New Roman; COLOR: #000000; FONT-SIZE: 16px">
<hr tabindex="-1">
<br>
<div></div>
<div>
<div class="WordSection1">
<p class="MsoNormal">library(inline); library(Rcpp);</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">inc&lt;-'</p>
<p class="MsoNormal">using namespace Rcpp<a></a>;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">double Fn(double a, double b)</p>
<p class="MsoNormal">{</p>
<p class="MsoNormal">return std::max(0.0,exp(a)-b);</p>
<p class="MsoNormal">}</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>SEXP&nbsp;make_matrix<a></a>(int<a></a> nr,&nbsp;int<a></a> nc<a></a>,&nbsp;int<a></a> d){</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumericVector<a></a> y=floor(runif<a></a>(nr*nc<a></a>)*(d-1));</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y.attr<a></a>(&quot;dim&quot;)=Dimension(nr,nc<a></a>);</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return y;</p>
<p class="MsoNormal">}</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">'</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>src&lt;-'</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>NumericVector&nbsp;RetIn<a></a>(RetVec<a></a>);</p>
<p class="MsoNormal"><a></a>int&nbsp;SS_C<a></a>=as&lt;int<a></a>&gt;(SamSize<a></a>);</p>
<p class="MsoNormal">double St_C<a></a>=as&lt;double&gt;(StM<a></a>);</p>
<p class="MsoNormal"><a></a>int&nbsp;ES_C<a></a>=as&lt;int<a></a>&gt;(ExpSize<a></a>);</p>
<p class="MsoNormal"><a></a>int&nbsp;i,j<a></a>;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>NumericVector&nbsp;OutVec<a></a>=rep(0.0,SS_C),SamIndx<a></a>(ES_C<a></a>);</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>RNGScope&nbsp;scope;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">//NumericMatrix<a></a> SamIndx<a></a>=make_matrix<a></a>(SS_C,ES_C,RetIn.size<a></a>()-1);</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">for(j=0;j&lt;SS_C;j<a></a>&#43;&#43;)</p>
<p class="MsoNormal">{</p>
<p class="MsoNormal"><a></a>SamIndx=floor(runif<a></a>(ES_C<a></a>)*(RetIn.size<a></a>()-1));&nbsp;&nbsp;&nbsp;&nbsp;
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i<a></a>=0; i<a></a>&lt;ES_C<a></a>; i<a></a>&#43;&#43;)</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutVec<a></a>[j]&#43;=RetIn<a></a>[SamIndx<a></a>[i<a></a>]];</p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="MsoNormal">}</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>NumericVector&nbsp;strVEC<a></a>=rep(St_C,SS_C<a></a>), ans<a></a>(SS_C<a></a>);</p>
<p class="MsoNormal">std::transform(OutVec.begin<a></a>(),OutVec.end<a></a>(),strVEC.begin<a></a>(),ans.begin<a></a>(),Fn);</p>
<p class="MsoNormal">double MeanOut<a></a>=mean(ans<a></a>);</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">return(wrap(MeanOut<a></a>));</p>
<p class="MsoNormal">'</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">sscpp2&lt;-cfunction<a></a>( signature(RetVec<a></a>=&quot;numericVector&quot;,SamSize<a></a>=&quot;numeric&quot;,StM<a></a>=&quot;numeric&quot;,ExpSize<a></a>=&quot;numeric&quot;), src,inc<a></a>, Rcpp<a></a>=TRUE,cppargs<a></a>=&quot;&quot;,convention=&quot;.Call&quot;)</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><a></a>ttin=runif<a></a>(2000)/10000</p>
<p class="MsoNormal">sscpp2(ttin,50000,1.0,126)</p>
<p class="MsoNormal">#####</p>
</div>
</div>
</div>
</div>
</body>
</html>