diff --git a/modules/core/test/test_eigen.cpp b/modules/core/test/test_eigen.cpp index ba00591f11..b57fe94c18 100644 --- a/modules/core/test/test_eigen.cpp +++ b/modules/core/test/test_eigen.cpp @@ -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: + double eigenval = 0; + switch (type) { - for (int i = 0; i < src.cols; ++i) - { - cv::Mat tmp = eigen_values.at(i, 0) * eigen_vectors_t.col(i); - for (int j = 0; j < src.rows; ++j) eval_evec.at(j, i) = tmp.at(j, 0); - } - - break; + case CV_32FC1: eigenval = eigen_values.at(i, 0); break; + case CV_64FC1: eigenval = eigen_values.at(i, 0); break; } - - case CV_64FC1: - { - for (int i = 0; i < src.cols; ++i) - { - cv::Mat tmp = eigen_values.at(i, 0) * eigen_vectors_t.col(i); - for (int j = 0; j < src.rows; ++j) eval_evec.at(j, i) = tmp.at(j, 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 << ": ";