@@ -394,26 +394,36 @@ public void testDivideMatMatMatDoubleInt() {
394
394
}
395
395
396
396
public void testEigen () {
397
- Mat src = new Mat (3 , 3 , CvType .CV_32FC1 , new Scalar (2.0 ));
397
+ Mat src = new Mat (3 , 3 , CvType .CV_32FC1 ) {
398
+ {
399
+ put (0 , 0 , 2 , 0 , 0 );
400
+ put (1 , 0 , 0 , 6 , 0 );
401
+ put (2 , 0 , 0 , 0 , 4 );
402
+ }
403
+ };
398
404
Mat eigenVals = new Mat ();
399
405
Mat eigenVecs = new Mat ();
400
406
401
407
Core .eigen (src , eigenVals , eigenVecs );
402
408
403
409
Mat expectedEigenVals = new Mat (3 , 1 , CvType .CV_32FC1 ) {
404
410
{
405
- put (0 , 0 , 6 , 0 , 0 );
406
- }
407
- };
408
- Mat expectedEigenVecs = new Mat (3 , 3 , CvType .CV_32FC1 ) {
409
- {
410
- put (0 , 0 , 0.57735026 , 0.57735026 , 0.57735032 );
411
- put (1 , 0 , 0.70710677 , -0.70710677 , 0 );
412
- put (2 , 0 , -0.40824831 , -0.40824831 , 0.81649661 );
411
+ put (0 , 0 , 6 , 4 , 2 );
413
412
}
414
413
};
415
414
assertMatEqual (eigenVals , expectedEigenVals , EPS );
416
- assertMatEqual (eigenVecs , expectedEigenVecs , EPS );
415
+
416
+ // check by definition
417
+ double eps = 1e-3 ;
418
+ for (int i = 0 ; i < 3 ; i ++)
419
+ {
420
+ Mat vec = eigenVecs .row (i ).t ();
421
+ Mat lhs = new Mat (3 , 1 , CvType .CV_32FC1 );
422
+ Core .gemm (src , vec , 1.0 , new Mat (), 1.0 , lhs );
423
+ Mat rhs = new Mat (3 , 1 , CvType .CV_32FC1 );
424
+ Core .gemm (vec , eigenVals .row (i ), 1.0 , new Mat (), 1.0 , rhs );
425
+ assertMatEqual (lhs , rhs , eps );
426
+ }
417
427
}
418
428
419
429
public void testExp () {
@@ -1326,7 +1336,8 @@ public void testPCAComputeMatMatMat() {
1326
1336
Mat vectors = new Mat ();
1327
1337
1328
1338
Core .PCACompute (data , mean , vectors );
1329
-
1339
+ //System.out.println(mean.dump());
1340
+ //System.out.println(vectors.dump());
1330
1341
Mat mean_truth = new Mat (1 , 4 , CvType .CV_32F ) {
1331
1342
{
1332
1343
put (0 , 0 , 2 , 4 , 4 , 8 );
@@ -1338,7 +1349,21 @@ public void testPCAComputeMatMatMat() {
1338
1349
}
1339
1350
};
1340
1351
assertMatEqual (mean_truth , mean , EPS );
1341
- assertMatEqual (vectors_truth , vectors , EPS );
1352
+
1353
+ // eigenvectors are normalized (length = 1),
1354
+ // but direction is unknown (v and -v are both eigen vectors)
1355
+ // so this direct check doesn't work:
1356
+ // assertMatEqual(vectors_truth, vectors, EPS);
1357
+ for (int i = 0 ; i < 3 ; i ++)
1358
+ {
1359
+ Mat vec0 = vectors_truth .row (i );
1360
+ Mat vec1 = vectors .row (i );
1361
+ Mat vec1_ = new Mat ();
1362
+ Core .subtract (new Mat (1 , 4 , CvType .CV_32F , new Scalar (0 )), vec1 , vec1_ );
1363
+ double scale1 = Core .norm (vec0 , vec1 );
1364
+ double scale2 = Core .norm (vec0 , vec1_ );
1365
+ assertTrue (Math .min (scale1 , scale2 ) < EPS );
1366
+ }
1342
1367
}
1343
1368
1344
1369
public void testPCAComputeMatMatMatInt () {
@@ -1365,7 +1390,20 @@ public void testPCAComputeMatMatMatInt() {
1365
1390
}
1366
1391
};
1367
1392
assertMatEqual (mean_truth , mean , EPS );
1368
- assertMatEqual (vectors_truth , vectors , EPS );
1393
+ // eigenvectors are normalized (length = 1),
1394
+ // but direction is unknown (v and -v are both eigen vectors)
1395
+ // so this direct check doesn't work:
1396
+ // assertMatEqual(vectors_truth, vectors, EPS);
1397
+ for (int i = 0 ; i < 1 ; i ++)
1398
+ {
1399
+ Mat vec0 = vectors_truth .row (i );
1400
+ Mat vec1 = vectors .row (i );
1401
+ Mat vec1_ = new Mat ();
1402
+ Core .subtract (new Mat (1 , 4 , CvType .CV_32F , new Scalar (0 )), vec1 , vec1_ );
1403
+ double scale1 = Core .norm (vec0 , vec1 );
1404
+ double scale2 = Core .norm (vec0 , vec1_ );
1405
+ assertTrue (Math .min (scale1 , scale2 ) < EPS );
1406
+ }
1369
1407
}
1370
1408
1371
1409
public void testPCAProject () {
0 commit comments