Skip to content

SimpleEVD does not check modified flag #225

Description

@kasparthommen

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 

Metadata

Metadata

Labels

bugfixedFixed. Waiting review.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions