@@ -575,7 +575,7 @@ public void testProductDouble() {
575575
576576 @ Test
577577 public void testJacobi () {
578- for (int n = 1 ; n <= 100 ; n ++) {
578+ for (int n = 1 ; n <= 10 ; n ++) {
579579 double [][] A = getDiagonal (n );
580580 JacobiDiagonalization jd = new JacobiDiagonalization (A );
581581 assertNull (jd .eigenvectors ());
@@ -615,6 +615,60 @@ public void testJacobi() {
615615 }
616616 }
617617 }
618+ IllegalArgumentException thrown = assertThrows (
619+ IllegalArgumentException .class ,
620+ () -> new JacobiDiagonalization (new double [2 ][3 ])
621+ );
622+ }
623+
624+ @ Test
625+ public void testJacobiInt () {
626+ for (int n = 1 ; n <= 5 ; n ++) {
627+ int [][] Aint = getDiagonalInt (n );
628+ double [][] A = toDoubleMatrix (Aint , true );
629+ JacobiDiagonalization jd = new JacobiDiagonalization (Aint );
630+ assertNull (jd .eigenvectors ());
631+ assertNull (jd .eigenvalues ());
632+ assertTrue (jd .compute (JacobiDiagonalization .EPSILON ));
633+ double [][] P = jd .eigenvectors ();
634+ double [] eig = jd .eigenvalues ();
635+ double [][] lambda = new double [eig .length ][eig .length ];
636+ for (int i = 0 ; i < lambda .length ; i ++) {
637+ lambda [i ][i ] = eig [i ];
638+ }
639+ double [][] left = MatrixOps .product (A , P );
640+ double [][] right = MatrixOps .product (P , lambda );
641+ assertEquals (left .length , right .length );
642+ assertEquals (left [0 ].length , right [0 ].length );
643+ for (int i = 0 ; i < left .length ; i ++) {
644+ assertArrayEquals ("diagonal already" , left [i ], right [i ], JacobiDiagonalization .EPSILON );
645+ }
646+ if (n <= 5 ) {
647+ Aint = getSymmetricInt (n );
648+ A = toDoubleMatrix (Aint , false );
649+ jd = new JacobiDiagonalization (A );
650+ assertNull ("eigvectors should be null" , jd .eigenvectors ());
651+ assertNull ("eigvalues should be null" , jd .eigenvalues ());
652+ assertTrue ("should converge" , jd .compute (JacobiDiagonalization .MAX_ITERATIONS /10 ));
653+ P = jd .eigenvectors ();
654+ eig = jd .eigenvalues ();
655+ lambda = new double [eig .length ][eig .length ];
656+ for (int i = 0 ; i < lambda .length ; i ++) {
657+ lambda [i ][i ] = eig [i ];
658+ }
659+ left = MatrixOps .product (A , P );
660+ right = MatrixOps .product (P , lambda );
661+ assertEquals (left .length , right .length );
662+ assertEquals (left [0 ].length , right [0 ].length );
663+ for (int i = 0 ; i < left .length ; i ++) {
664+ assertArrayEquals ("symmetric: " + n , left [i ], right [i ], 10 *n *JacobiDiagonalization .EPSILON );
665+ }
666+ }
667+ }
668+ IllegalArgumentException thrown = assertThrows (
669+ IllegalArgumentException .class ,
670+ () -> new JacobiDiagonalization (new int [2 ][3 ])
671+ );
618672 }
619673
620674 private double [][] getSymmetric (int n ) {
@@ -629,6 +683,18 @@ private double[][] getSymmetric(int n) {
629683 return A ;
630684 }
631685
686+ private int [][] getSymmetricInt (int n ) {
687+ int [][] A = new int [n ][n ];
688+ Random gen = new Random (42 );
689+ for (int i = 0 ; i < n ; i ++) {
690+ A [i ][i ] = gen .nextInt (2 )+1 ;
691+ for (int j = i +1 ; j < n ; j ++) {
692+ A [i ][j ] = A [j ][i ] = gen .nextInt (2 )+1 ;
693+ }
694+ }
695+ return A ;
696+ }
697+
632698 private double [][] getDiagonal (int n ) {
633699 double [][] A = new double [n ][n ];
634700 Random gen = new Random (42 );
@@ -638,6 +704,29 @@ private double[][] getDiagonal(int n) {
638704 return A ;
639705 }
640706
707+ private int [][] getDiagonalInt (int n ) {
708+ int [][] A = new int [n ][n ];
709+ Random gen = new Random (42 );
710+ for (int i = 0 ; i < n ; i ++) {
711+ A [i ][i ] = gen .nextInt (99 ) + 1 ;
712+ }
713+ return A ;
714+ }
715+
716+ private double [][] toDoubleMatrix (int [][] M , boolean diag ) {
717+ double [][] A = new double [M .length ][M [0 ].length ];
718+ for (int i = 0 ; i < A .length ; i ++) {
719+ if (diag ) {
720+ A [i ][i ] = M [i ][i ];
721+ } else {
722+ for (int j = 0 ; j < A [i ].length ; j ++) {
723+ A [i ][j ] = M [i ][j ];
724+ }
725+ }
726+ }
727+ return A ;
728+ }
729+
641730 private double [][] getMultA_d (int n , int m ) {
642731 double [][] A = new double [n ][m ];
643732 for (int i = 0 ; i < n ; i ++) {
0 commit comments