core(test): Core_Eigen.vector_32 use relative norm
authorAlexander Alekhin <alexander.alekhin@intel.com>
Mon, 11 Dec 2017 16:04:44 +0000 (19:04 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Tue, 12 Dec 2017 12:07:31 +0000 (15:07 +0300)
modules/core/test/test_eigen.cpp

index ba00591..b57fe94 100644 (file)
@@ -164,8 +164,8 @@ void Core_EigenTest_32::run(int) { check_full(CV_32FC1); }
 void Core_EigenTest_64::run(int) { check_full(CV_64FC1); }
 
 Core_EigenTest::Core_EigenTest()
-: eps_val_32(1e-3f), eps_vec_32(12e-3f),
-  eps_val_64(1e-4f), eps_vec_64(1e-3f), ntests(100) {}
+: eps_val_32(1e-3f), eps_vec_32(1e-3f),
+  eps_val_64(1e-4f), eps_vec_64(1e-4f), ntests(100) {}
 Core_EigenTest::~Core_EigenTest() {}
 
 bool Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues, int low_index, int high_index)
@@ -234,7 +234,7 @@ bool Core_EigenTest::check_orthogonality(const cv::Mat& U)
 
     for (int i = 0; i < COUNT_NORM_TYPES; ++i)
     {
-        double diff = cvtest::norm(UUt, E, NORM_TYPE[i]);
+        double diff = cvtest::norm(UUt, E, NORM_TYPE[i] | cv::NORM_RELATIVE);
         if (diff > eps_vec)
         {
             std::cout << endl; std::cout << "Checking orthogonality of matrix " << U << ": ";
@@ -307,43 +307,28 @@ bool Core_EigenTest::test_pairs(const cv::Mat& src)
 
     cv::Mat eigen_vectors_t; cv::transpose(eigen_vectors, eigen_vectors_t);
 
-    cv::Mat src_evec(src.rows, src.cols, type);
-    src_evec = src*eigen_vectors_t;
+    // Check:
+    // src * eigenvector = eigenval * eigenvector
+    cv::Mat lhs(src.rows, src.cols, type);
+    cv::Mat rhs(src.rows, src.cols, type);
 
-    cv::Mat eval_evec(src.rows, src.cols, type);
+    lhs = src*eigen_vectors_t;
 
-    switch (type)
+    for (int i = 0; i < src.cols; ++i)
     {
-    case CV_32FC1:
-        {
-            for (int i = 0; i < src.cols; ++i)
-            {
-                cv::Mat tmp = eigen_values.at<float>(i, 0) * eigen_vectors_t.col(i);
-                for (int j = 0; j < src.rows; ++j) eval_evec.at<float>(j, i) = tmp.at<float>(j, 0);
-            }
-
-            break;
-        }
-
-    case CV_64FC1:
+        double eigenval = 0;
+        switch (type)
         {
-            for (int i = 0; i < src.cols; ++i)
-            {
-                cv::Mat tmp = eigen_values.at<double>(i, 0) * eigen_vectors_t.col(i);
-                for (int j = 0; j < src.rows; ++j) eval_evec.at<double>(j, i) = tmp.at<double>(j, 0);
-            }
-
-            break;
+        case CV_32FC1: eigenval = eigen_values.at<float>(i, 0); break;
+        case CV_64FC1: eigenval = eigen_values.at<double>(i, 0); break;
         }
-
-    default:;
+        cv::Mat rhs_v = eigenval * eigen_vectors_t.col(i);
+        rhs_v.copyTo(rhs.col(i));
     }
 
-    cv::Mat disparity = src_evec - eval_evec;
-
     for (int i = 0; i < COUNT_NORM_TYPES; ++i)
     {
-        double diff = cvtest::norm(disparity, NORM_TYPE[i]);
+        double diff = cvtest::norm(lhs, rhs, NORM_TYPE[i] | cv::NORM_RELATIVE);
         if (diff > eps_vec)
         {
             std::cout << endl; std::cout << "Checking accuracy of eigen vectors computing for matrix " << src << ": ";
@@ -372,7 +357,7 @@ bool Core_EigenTest::test_values(const cv::Mat& src)
 
     for (int i = 0; i < COUNT_NORM_TYPES; ++i)
     {
-        double diff = cvtest::norm(eigen_values_1, eigen_values_2, NORM_TYPE[i]);
+        double diff = cvtest::norm(eigen_values_1, eigen_values_2, NORM_TYPE[i] | cv::NORM_RELATIVE);
         if (diff > eps_val)
         {
             std::cout << endl; std::cout << "Checking accuracy of eigen values computing for matrix " << src << ": ";