core(test): Core_Eigen.vector_32 use relative norm

pull/9804/head
Alexander Alekhin 7 years ago
parent 2324674dfb
commit c0b6061a5e
  1. 49
      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:
{
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 << ": ";

Loading…
Cancel
Save