Re: [eigen] inverse unit test

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


Maybe this simple hack is all we need:

static inline bool isApprox(const Scalar& x, const Scalar& y, const
RealScalar& prec)
{
  return (ei_abs(x - y) <= std::min(ei_abs(x), ei_abs(y)) * prec ||
ei_abs(x - y) < NumTraits<Scalar>::epsilon());
}

- Hauke

On Thu, Jun 10, 2010 at 12:43 AM, Hauke Heibel
<hauke.heibel@xxxxxxxxxxxxxx> wrote:
> On MSVC the inverse unit test fails here:
>
>  //Second: a rank one matrix (not invertible, except for 1x1 matrices)
>  VectorType v3 = VectorType::Random(rows);
>  MatrixType m3 = v3*v3.transpose(), m4(rows,cols);
>  m3.computeInverseAndDetWithCheck(m4, det, invertible);
>  VERIFY( rows==1 ? invertible : !invertible );
>  VERIFY_IS_APPROX(det, m3.determinant());
>  m3.computeInverseWithCheck(m4, invertible);
>  VERIFY( rows==1 ? invertible : !invertible );
>
> We expect a determinant of 0 since the matrix is not invertible and
> then this check fails
>
>  VERIFY_IS_APPROX(det, m3.determinant());
>
> VERIFY_IS_APPROX will always fail in case one of the two parameters is
> zero and in case both values are small it is likely to fail as well
> because
>
> abs(x-y) <= min(abs(x),abs(y)) * 1e-3
>
> here, we take the minimal value and make it even smaller.
>
> Here are some nice comparison methods we might try to adapt:
> http://www.boost.org/doc/libs/1_32_0/boost/test/floating_point_comparison..hpp
>
> - Hauke
>



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