Skip to content

Commit c0b6061

Browse files
committed
core(test): Core_Eigen.vector_32 use relative norm
1 parent 2324674 commit c0b6061

File tree

1 file changed

+17
-32
lines changed

1 file changed

+17
-32
lines changed

modules/core/test/test_eigen.cpp

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ void Core_EigenTest_32::run(int) { check_full(CV_32FC1); }
164164
void Core_EigenTest_64::run(int) { check_full(CV_64FC1); }
165165

166166
Core_EigenTest::Core_EigenTest()
167-
: eps_val_32(1e-3f), eps_vec_32(12e-3f),
168-
eps_val_64(1e-4f), eps_vec_64(1e-3f), ntests(100) {}
167+
: eps_val_32(1e-3f), eps_vec_32(1e-3f),
168+
eps_val_64(1e-4f), eps_vec_64(1e-4f), ntests(100) {}
169169
Core_EigenTest::~Core_EigenTest() {}
170170

171171
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)
234234

235235
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
236236
{
237-
double diff = cvtest::norm(UUt, E, NORM_TYPE[i]);
237+
double diff = cvtest::norm(UUt, E, NORM_TYPE[i] | cv::NORM_RELATIVE);
238238
if (diff > eps_vec)
239239
{
240240
std::cout << endl; std::cout << "Checking orthogonality of matrix " << U << ": ";
@@ -307,43 +307,28 @@ bool Core_EigenTest::test_pairs(const cv::Mat& src)
307307

308308
cv::Mat eigen_vectors_t; cv::transpose(eigen_vectors, eigen_vectors_t);
309309

310-
cv::Mat src_evec(src.rows, src.cols, type);
311-
src_evec = src*eigen_vectors_t;
310+
// Check:
311+
// src * eigenvector = eigenval * eigenvector
312+
cv::Mat lhs(src.rows, src.cols, type);
313+
cv::Mat rhs(src.rows, src.cols, type);
312314

313-
cv::Mat eval_evec(src.rows, src.cols, type);
315+
lhs = src*eigen_vectors_t;
314316

315-
switch (type)
317+
for (int i = 0; i < src.cols; ++i)
316318
{
317-
case CV_32FC1:
318-
{
319-
for (int i = 0; i < src.cols; ++i)
320-
{
321-
cv::Mat tmp = eigen_values.at<float>(i, 0) * eigen_vectors_t.col(i);
322-
for (int j = 0; j < src.rows; ++j) eval_evec.at<float>(j, i) = tmp.at<float>(j, 0);
323-
}
324-
325-
break;
326-
}
327-
328-
case CV_64FC1:
319+
double eigenval = 0;
320+
switch (type)
329321
{
330-
for (int i = 0; i < src.cols; ++i)
331-
{
332-
cv::Mat tmp = eigen_values.at<double>(i, 0) * eigen_vectors_t.col(i);
333-
for (int j = 0; j < src.rows; ++j) eval_evec.at<double>(j, i) = tmp.at<double>(j, 0);
334-
}
335-
336-
break;
322+
case CV_32FC1: eigenval = eigen_values.at<float>(i, 0); break;
323+
case CV_64FC1: eigenval = eigen_values.at<double>(i, 0); break;
337324
}
338-
339-
default:;
325+
cv::Mat rhs_v = eigenval * eigen_vectors_t.col(i);
326+
rhs_v.copyTo(rhs.col(i));
340327
}
341328

342-
cv::Mat disparity = src_evec - eval_evec;
343-
344329
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
345330
{
346-
double diff = cvtest::norm(disparity, NORM_TYPE[i]);
331+
double diff = cvtest::norm(lhs, rhs, NORM_TYPE[i] | cv::NORM_RELATIVE);
347332
if (diff > eps_vec)
348333
{
349334
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)
372357

373358
for (int i = 0; i < COUNT_NORM_TYPES; ++i)
374359
{
375-
double diff = cvtest::norm(eigen_values_1, eigen_values_2, NORM_TYPE[i]);
360+
double diff = cvtest::norm(eigen_values_1, eigen_values_2, NORM_TYPE[i] | cv::NORM_RELATIVE);
376361
if (diff > eps_val)
377362
{
378363
std::cout << endl; std::cout << "Checking accuracy of eigen values computing for matrix " << src << ": ";

0 commit comments

Comments
 (0)