Skip to content

Commit 53b5afb

Browse files
committed
core(test): refactor Java Eigenvalues/PCA tests
1 parent d48d2d7 commit 53b5afb

File tree

1 file changed

+51
-13
lines changed

1 file changed

+51
-13
lines changed

modules/core/misc/java/test/CoreTest.java

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -394,26 +394,36 @@ public void testDivideMatMatMatDoubleInt() {
394394
}
395395

396396
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+
};
398404
Mat eigenVals = new Mat();
399405
Mat eigenVecs = new Mat();
400406

401407
Core.eigen(src, eigenVals, eigenVecs);
402408

403409
Mat expectedEigenVals = new Mat(3, 1, CvType.CV_32FC1) {
404410
{
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);
413412
}
414413
};
415414
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+
}
417427
}
418428

419429
public void testExp() {
@@ -1326,7 +1336,8 @@ public void testPCAComputeMatMatMat() {
13261336
Mat vectors = new Mat();
13271337

13281338
Core.PCACompute(data, mean, vectors);
1329-
1339+
//System.out.println(mean.dump());
1340+
//System.out.println(vectors.dump());
13301341
Mat mean_truth = new Mat(1, 4, CvType.CV_32F) {
13311342
{
13321343
put(0, 0, 2, 4, 4, 8);
@@ -1338,7 +1349,21 @@ public void testPCAComputeMatMatMat() {
13381349
}
13391350
};
13401351
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+
}
13421367
}
13431368

13441369
public void testPCAComputeMatMatMatInt() {
@@ -1365,7 +1390,20 @@ public void testPCAComputeMatMatMatInt() {
13651390
}
13661391
};
13671392
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+
}
13691407
}
13701408

13711409
public void testPCAProject() {

0 commit comments

Comments
 (0)