MATH-1045
Loop added to ensure that the largest norm is used in the singularity check. Patch provided by Sean Owen. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1537099 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5526877f31
commit
c979a6f0fe
|
@ -513,8 +513,12 @@ public class EigenDecomposition {
|
|||
* @return true if the decomposed matrix is non-singular.
|
||||
*/
|
||||
public boolean isNonSingular() {
|
||||
// The eigenvalues are sorted by size, descending
|
||||
double largestEigenvalueNorm = eigenvalueNorm(0);
|
||||
double largestEigenvalueNorm = 0.0;
|
||||
// Looping over all values (in case they are not sorted in decreasing
|
||||
// order of their norm).
|
||||
for (int i = 0; i < realEigenvalues.length; ++i) {
|
||||
largestEigenvalueNorm = FastMath.max(largestEigenvalueNorm, eigenvalueNorm(i));
|
||||
}
|
||||
// Corner case: zero matrix, all exactly 0 eigenvalues
|
||||
if (largestEigenvalueNorm == 0.0) {
|
||||
return false;
|
||||
|
|
|
@ -107,6 +107,17 @@ public class EigenSolverTest {
|
|||
eigen.getSolver().getInverse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsNonSingularTinyOutOfOrderEigenvalue() {
|
||||
final EigenDecomposition eigen
|
||||
= new EigenDecomposition(MatrixUtils.createRealMatrix(new double[][] {
|
||||
{ 1e-13, 0 },
|
||||
{ 1, 1 },
|
||||
}));
|
||||
Assert.assertFalse("Singular matrix not detected",
|
||||
eigen.getSolver().isNonSingular());
|
||||
}
|
||||
|
||||
/** test solve dimension errors */
|
||||
@Test
|
||||
public void testSolveDimensionErrors() {
|
||||
|
|
Loading…
Reference in New Issue