package mikera.matrixx.algo; import mikera.matrixx.AMatrix; import mikera.matrixx.decompose.Cholesky; import mikera.matrixx.decompose.Eigen; import mikera.matrixx.decompose.IEigenResult; import mikera.vectorz.Vector2; public class Definite { /** * Tests whether a symmetric matrix is positive definite * * Results are undefined if the matrix is not symmetric * * @param a * @return */ public static boolean isPositiveDefinite(AMatrix a) { return Cholesky.decompose(a)!=null; } /** * Tests whether a symmetric matrix is positive semi-definite * * Results are undefined if the matrix is not symmetric * * @param a * @return */ public static boolean isPositiveSemiDefinite(AMatrix a) { IEigenResult e=Eigen.decomposeSymmetric(a); if (e==null) return false; Vector2[] eigenValues=e.getEigenvalues(); for (Vector2 v:eigenValues) { if (v.x<0) return false; } return true; } }