@@ -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 << " : " ;
@@ -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 << " : " ;
0 commit comments