[eigen] Behavior of sum() and prod() for empty vectors

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]

Dear developers,

I just stumbled upon a nasty issue with reductions of empty (zero-sized) 
vectors. I'm currently using Eigen3 Beta 1.
Consider the following program:

#include <Eigen/Core>
#include <iostream>

int main()
  Eigen::VectorXd v = Eigen::VectorXd::Random(4);

  std::cout << v.head(0).sum() << std::endl; // outputs v(0)
  std::cout << v.tail(0).sum() << std::endl; // outputs 0
  std::cout << v.segment(2, 0).sum() << std::endl; // outputs v(2)

  Eigen::VectorXd w;
  std::cout << w.sum() << std::endl; // segfaults

I think that calling sum() on an empty vector should be a perfectly legal 
operation, and should return 0. Similar with prod() and 1. That's according to 
the principle of least surprise, and it's also consistent with Matlab and 
The same code with a VectorXcd, by the way, at least triggers the assertion in 
Redux.h:186, but with double and int as scalar type, v.head(0).sum() just 
silently return v(0). It was pure coincidence that I noticed this behavior.

The same argument of course also applies to trace() and det() of zero-sized 

I would have liked to submit a patch, but honestly, I got lost in all the 
template magic... I would be really grateful if one of the gurus could fix 

If you wonder why someone would want to take the sum of an empty vector in the 
first place; well, of course I don't have code like v.head(0).sum() with a 
literal 0, but I do have something like

double f(const VectorXd& v, int n)
  assert(n >= 0 && n <= v.size());
  return foo(v.head(n).sum()) + bar(v.tail(v.size() - n).sum());

which should be legal for n == 0 and n == v.size(), and in these cases I 
naturally expect sum() to return 0 for an empty segment.
If reductions of empty vectors remain unsupported, I would have to clutter my 
code with tons of ifs and special-case-treatments.


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/