Boost logo

Boost Users :

From: Anders Sundman (d00-asu_at_[hidden])
Date: 2004-03-31 03:03:40


On Tue, 30 Mar 2004, David Abrahams wrote:

> Anders Sundman <d00-asu_at_[hidden]> writes:
>
> > Hi all!
> >
> > I'm using the lambda library to compute the sum of squared
> > differences, but I have encountered a puzzling problem. I would
> > really appreciate if someone could explain it to me.
> >
> > This doesn't compile:
> >
> > std::inner_product(i1, i1+x, i2, 0.0,
> > (_1 + _2), (_1*_1)(_1 - _2));
> >
> > however, this does:
> >
> > std::inner_product(i1, i1+x, i2, 0.0,
> > std::plus<double>(), (_1*_1)(_1 - _2));
> ^^^^^^^^ ^
>
> Doesn't seem right. Do you really mean to invoke the function call
> operator on the result of _1*_1 ??
>

I might be missing something obvious, but i seems right to me. I'm
trying to compute: sum((i1[i] - i2[i])^2). (_1*_1)(_1 - _2) computes
the (i1[i] - i2[i])^2 part, and it seems to work fine. Then the first
binary operator is applied to the result, so I think it's what I
want.

Here is a short program that demonstrates the problem:

#include <iostream>
#include <numeric>
#include <boost/lambda/lambda.hpp>

using namespace boost::lambda;

int main(void) {
  double x1[] = {2.0, 1.0, 0.0, 3.0, 2.0};
  double x2[] = {1.0, 2.0, 0.0, 1.0, -2.0};

  /*
  double ssd = std::inner_product(x1, x1+5, x2, 0.0,
                                  std::plus<double>(),
                                  (_1*_1)(_1 - _2));
  */

  double ssd = std::inner_product(x1, x1+5, x2, 0.0,
                                  (_1 + _2),
                                  (_1*_1)(_1 - _2));

  std::cout << "ssd: " << ssd << std::endl;
  return 0;
}

---
Best regards
Anders Sundman

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net