@@ -59,7 +59,7 @@ using namespace std;
59
59
#define MESSAGE_ERROR_DIFF_1 " Accuracy of eigen values computing less than required."
60
60
#define MESSAGE_ERROR_DIFF_2 " Accuracy of eigen vectors computing less than required."
61
61
#define MESSAGE_ERROR_ORTHO " Matrix of eigen vectors is not orthogonal."
62
- #define MESSAGE_ERROR_ORDER " Eigen values are not sorted in ascending order."
62
+ #define MESSAGE_ERROR_ORDER " Eigen values are not sorted in descending order."
63
63
64
64
const int COUNT_NORM_TYPES = 3 ;
65
65
const int NORM_TYPE[COUNT_NORM_TYPES] = {cv::NORM_L1, cv::NORM_L2, cv::NORM_INF};
@@ -164,8 +164,8 @@ void Core_EigenTest_32::run(int) { check_full(CV_32FC1); }
164
164
void Core_EigenTest_64::run (int ) { check_full (CV_64FC1); }
165
165
166
166
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 ) {}
169
169
Core_EigenTest::~Core_EigenTest () {}
170
170
171
171
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)
234
234
235
235
for (int i = 0 ; i < COUNT_NORM_TYPES; ++i)
236
236
{
237
- double diff = cvtest::norm (UUt, E, NORM_TYPE[i]);
237
+ double diff = cvtest::norm (UUt, E, NORM_TYPE[i] | cv::NORM_RELATIVE );
238
238
if (diff > eps_vec)
239
239
{
240
240
std::cout << endl; std::cout << " Checking orthogonality of matrix " << U << " : " ;
@@ -257,7 +257,7 @@ bool Core_EigenTest::check_pairs_order(const cv::Mat& eigen_values)
257
257
if (!(eigen_values.at <float >(i, 0 ) > eigen_values.at <float >(i+1 , 0 )))
258
258
{
259
259
std::cout << endl; std::cout << " Checking order of eigen values vector " << eigen_values << " ..." << endl;
260
- std::cout << " Pair of indexes with non ascending of eigen values: (" << i << " , " << i+1 << " )." << endl;
260
+ std::cout << " Pair of indexes with non descending of eigen values: (" << i << " , " << i+1 << " )." << endl;
261
261
std::cout << endl;
262
262
CV_Error (CORE_EIGEN_ERROR_ORDER, MESSAGE_ERROR_ORDER);
263
263
return false ;
@@ -272,9 +272,9 @@ bool Core_EigenTest::check_pairs_order(const cv::Mat& eigen_values)
272
272
if (!(eigen_values.at <double >(i, 0 ) > eigen_values.at <double >(i+1 , 0 )))
273
273
{
274
274
std::cout << endl; std::cout << " Checking order of eigen values vector " << eigen_values << " ..." << endl;
275
- std::cout << " Pair of indexes with non ascending of eigen values: (" << i << " , " << i+1 << " )." << endl;
275
+ std::cout << " Pair of indexes with non descending of eigen values: (" << i << " , " << i+1 << " )." << endl;
276
276
std::cout << endl;
277
- CV_Error (CORE_EIGEN_ERROR_ORDER, " Eigen values are not sorted in ascending order." );
277
+ CV_Error (CORE_EIGEN_ERROR_ORDER, " Eigen values are not sorted in descending order." );
278
278
return false ;
279
279
}
280
280
@@ -307,43 +307,28 @@ bool Core_EigenTest::test_pairs(const cv::Mat& src)
307
307
308
308
cv::Mat eigen_vectors_t ; cv::transpose (eigen_vectors, eigen_vectors_t );
309
309
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);
312
314
313
- cv::Mat eval_evec (src. rows , src. cols , type) ;
315
+ lhs = src* eigen_vectors_t ;
314
316
315
- switch (type )
317
+ for ( int i = 0 ; i < src. cols ; ++i )
316
318
{
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)
329
321
{
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 ;
337
324
}
338
-
339
- default : ;
325
+ cv::Mat rhs_v = eigenval * eigen_vectors_t . col (i);
326
+ rhs_v. copyTo (rhs. col (i)) ;
340
327
}
341
328
342
- cv::Mat disparity = src_evec - eval_evec;
343
-
344
329
for (int i = 0 ; i < COUNT_NORM_TYPES; ++i)
345
330
{
346
- double diff = cvtest::norm (disparity, NORM_TYPE[i]);
331
+ double diff = cvtest::norm (lhs, rhs, NORM_TYPE[i] | cv::NORM_RELATIVE );
347
332
if (diff > eps_vec)
348
333
{
349
334
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)
372
357
373
358
for (int i = 0 ; i < COUNT_NORM_TYPES; ++i)
374
359
{
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 );
376
361
if (diff > eps_val)
377
362
{
378
363
std::cout << endl; std::cout << " Checking accuracy of eigen values computing for matrix " << src << " : " ;
@@ -419,7 +404,7 @@ static void testEigen(const Mat_<T>& src, const Mat_<T>& expected_eigenvalues, b
419
404
SCOPED_TRACE (runSymmetric ? " cv::eigen" : " cv::eigenNonSymmetric" );
420
405
421
406
int type = traits::Type<T>::value;
422
- const T eps = 1e-6f ;
407
+ const T eps = src. type () == CV_32F ? 1e- 4f : 1e-6f ;
423
408
424
409
Mat eigenvalues, eigenvectors, eigenvalues0;
425
410
0 commit comments