Skip to content
Back to formatted view

Raw Message

Message-ID: <19919.10772.696473.769121@max.nulle.part>
Date: 2011-05-15T01:19:16Z
From: Dirk Eddelbuettel
Subject: [Rcpp-devel] Rcpp equivalent of sample()?
In-Reply-To: <BANLkTim-iP6907Wbv10ZD5aRVWXtKsdggA@mail.gmail.com>

On 14 May 2011 at 18:01, Chris DuBois wrote:
| Thanks Dirk. ?Passing the addition function in the includes argument worked
| great. ?
| 
| Also, one of the links from your suggested Google search led me to this
| (working) example for std::accumulate:
| 
| src <-?'NumericVector xx(x);
| return wrap( std::accumulate( xx.begin(), xx.end(), 0.0));'
| fx <- cxxfunction(signature( x = "numeric" ),body=src,plugin = "Rcpp")
| fx(1:10) ?# 55
| 
| I had been copying the quickref and using: ?std::accumulate( xx.begin(),
| xx.end(),std::plus<double>(),0.0)
| 
| I think this might be a typo where the last two arguments are transposed (which
| I shouldn't have noticed after browsing the function's c++ reference), as the
| following works just fine:??std::accumulate( xx.begin(), xx.end
| (),0.0,std::plus<double>())

Good catch.  The arguments are

     start, end, intial value, (optional) operator function

and std::plus<double>() is the default for summation. So that was an error,
and hence a Thank You! for catching it.  I just committed this new section:


\paragraph{STL interface}~
  \newline
<<lang=cpp>>=
// sum a vector from beginning to end
double s = std::accumulate(x.begin(),
   x.end(), 0.0);
// prod of elements from beginning to end
int p = std::accumulate(vec.begin(),
    vec.end(), 1, std::multiplies<int>());
// inner_product to compute sum of squares
double s2 = std::inner_product(res.begin(),
    res.end(), res.begin(), 0.0);
@


which shows std::multiplies<int>() as an alternative operator for accumulate
as well as inner_product for a sum-of-squares computation (as once suggested
by Doug).

Dirk

-- 
Gauss once played himself in a zero-sum game and won $50.
                      -- #11 at http://www.gaussfacts.com