Sometimes I'll use Eigen types with bool
as the Scalar type. This invites "gotchas" when I assume the matrices will work like logicals do in MATLAB. Most immediately sum
of logicals in matlab will return the integer number of trues (actually returns it as a double
type). In Eigen, sum
(not surprisingly) just calls operator+
and casts the result to bool
again.
So rather than:
Matrix<bool,4,4> B;
B<<true,false,true,true;
B.sum(); // will just return true
if you want to compute the number of true entries use one of:
<del>B.nonZeros();</del>
B.count();
std::count(B.data(),B.data()+B.size(),true);
Things get trickier if your trying to use more advanced accessors. Consider trying to find the number of true entries per row. Instead of
B.rowwise().sum();
you could use
B.cast<int>().rowwise().sum();
but this casts the entire matrix first to int
B.rowwise().count();
or just roll up the loop over the rows.