Re: [eigen] on fuzzy comparisons

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


Hi,

Cf attached diff, I tried reimplementing the matrix fuzzy compares using the 
Hilbert-Schmidt norm a.k.a. L2-norm.

The result however is that 7 tests fail out of 17.

So, I believe that indeed the Hilbert-Schmidt norm is less good a choice than 
the current implementation of matrix fuzzy compares.

I then tried using the matrixNorm, but the compilation took far too long so I 
didn't even wait for it to complete. I had made sure, though, that 
EigenSolver and Product types were instantiated only once per Eval type.

So, I think I'll just leave things as-is.

Cheers,

Benoit


On Thursday 05 June 2008 19:24:15 Gael Guennebaud wrote:
> What about the Frobenius norm which simply considers the matrix as a 1D
> vector and compute the L2 norm ? It is also invariant under rotation and
> very cheap.
Index: Eigen/src/Core/Fuzzy.h
===================================================================
--- Eigen/src/Core/Fuzzy.h	(revision 817437)
+++ Eigen/src/Core/Fuzzy.h	(working copy)
@@ -125,21 +125,17 @@
   {
     EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived);
     ei_assert(self.rows() == other.rows() && self.cols() == other.cols());
-    typename Derived::Nested nested(self);
-    typename OtherDerived::Nested otherNested(other);
-    for(int i = 0; i < self.cols(); i++)
-      if((nested.col(i) - otherNested.col(i)).norm2()
-          > std::min(nested.col(i).norm2(), otherNested.col(i).norm2()) * prec * prec)
-        return false;
-    return true;
+    typename ei_nested<Derived,2>::type nested(self);
+    typename ei_nested<OtherDerived,2>::type otherNested(other);
+    RealScalar nestedSquareNorm = nested.cwiseAbs2().sum();
+    RealScalar otherNestedSquareNorm = otherNested.cwiseAbs2().sum();
+    RealScalar diffSquareNorm = (nested - otherNested).cwiseAbs2().sum();
+    return diffSquareNorm < prec * prec * std::min(nestedSquareNorm, otherNestedSquareNorm);
   }
   static bool isMuchSmallerThan(const Derived& self, const RealScalar& other, RealScalar prec)
   {
-    typename Derived::Nested nested(self);
-    for(int i = 0; i < self.cols(); i++)
-      if(nested.col(i).norm2() > ei_abs2(other * prec))
-        return false;
-    return true;
+    RealScalar x = prec * other;
+    return self.cwiseAbs2().sum() < x * x;
   }
   static bool isMuchSmallerThan(const Derived& self, const OtherDerived& other, RealScalar prec)
   {
@@ -147,10 +143,9 @@
     ei_assert(self.rows() == other.rows() && self.cols() == other.cols());
     typename Derived::Nested nested(self);
     typename OtherDerived::Nested otherNested(other);
-    for(int i = 0; i < self.cols(); i++)
-      if(nested.col(i).norm2() > otherNested.col(i).norm2() * prec * prec)
-        return false;
-    return true;
+    RealScalar nestedSquareNorm = nested.cwiseAbs2().sum();
+    RealScalar otherNestedSquareNorm = otherNested.cwiseAbs2().sum();
+    return nestedSquareNorm < prec * prec * otherNestedSquareNorm;
   }
 };
 

Attachment: signature.asc
Description: This is a digitally signed message part.



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