If you run this code, you'll see that SymmetricQRAlgorithmDecomposition_DDRM seems to alternate between a correct and a wrong solution:
import org.ejml.data.DMatrixRMaj;
import org.ejml.dense.row.decomposition.eig.SymmetricQRAlgorithmDecomposition_DDRM;
import org.ejml.simple.SimpleMatrix;
import org.ejml.simple.ops.SimpleOperations_DDRM;
void main() {
var matrix = new DMatrixRMaj(new double[][] {
{ 1.0, 0.2 }, { 0.2, 1.0 }
});
var ops = new SimpleOperations_DDRM();
for (int i = 0; i < 4; i++) {
var eigenDecomp = new SymmetricQRAlgorithmDecomposition_DDRM(true);
eigenDecomp.decompose(matrix);
// build eigenvector matrix
var q = new SimpleMatrix(2, 2);
ops.setColumn(q.getDDRM(), 0, 0, eigenDecomp.getEigenVector(0).data);
ops.setColumn(q.getDDRM(), 1, 0, eigenDecomp.getEigenVector(1).data);
// build eigenvalue matrix
var d = new SimpleMatrix(2, 2);
d.set(0, 0, eigenDecomp.getEigenvalue(0));
d.set(1, 1, eigenDecomp.getEigenvalue(1));
// check if reconstructed matrix is equal to original matrix
var reconstructed = q.mult(d).mult(q.transpose());
System.out.println(reconstructed);
}
}
This prints:
Type = DDRM , rows = 2 , cols = 2
1.0000E+00 2.0000E-01
2.0000E-01 1.0000E+00
Type = DDRM , rows = 2 , cols = 2
1.0000E+00 -2.0000E-01
-2.0000E-01 1.0000E+00
Type = DDRM , rows = 2 , cols = 2
1.0000E+00 2.0000E-01
2.0000E-01 1.0000E+00
Type = DDRM , rows = 2 , cols = 2
1.0000E+00 -2.0000E-01
-2.0000E-01 1.0000E+00
If you run this code, you'll see that
SymmetricQRAlgorithmDecomposition_DDRMseems to alternate between a correct and a wrong solution:This prints: