/// <summary> /// Computes the eigenvalues of the matrix. /// </summary> /// <param name="matrix">The matrix.</param> /// <returns>The eigenvalues of the matrix.</returns> /// <exception cref="System.ArgumentNullException">The matrix is null.</exception> public static Double[] Eigenvalues(this Matrix matrix) { return(QRAlgorithm.ComputeEigenvalues(matrix)); }
/// <summary> /// Computes the definiteness of the matrix. /// </summary> /// <param name="matrix">The matrix.</param> /// <returns>The definiteness of the matrix.</returns> /// <exception cref="System.ArgumentNullException">The matrix is null.</exception> /// <exception cref="System.ArgumentException"> /// The matrix is empty. /// or /// The matrix is not symmetric. /// </exception> public static MatrixDefiniteness Definiteness(this Matrix matrix) { if (matrix == null) { throw new ArgumentNullException(nameof(matrix)); } if (matrix.NumberOfRows == 0 && matrix.NumberOfColumns == 0) { throw new ArgumentException(NumericsMessages.MatrixIsEmpty, nameof(matrix)); } if (!IsSymmetric(matrix)) { throw new ArgumentException(NumericsMessages.MatrixIsNotSymmetric, nameof(matrix)); } if (matrix.All(value => value == 0)) { return(MatrixDefiniteness.PositiveSemidefinite); } Double[] eigenvalues = QRAlgorithm.ComputeEigenvalues(matrix); Int32 posValues = 0; Int32 negValues = 0; Int32 zeroValues = 0; for (Int32 index = 0; index < eigenvalues.Length; ++index) { if (eigenvalues[index] > 0) { posValues++; } else if (eigenvalues[index] < 0) { negValues++; } else { zeroValues++; } } if (posValues > 0 && negValues == 0 && zeroValues == 0) { return(MatrixDefiniteness.PositiveDefinite); } else if (negValues > 0 && posValues == 0 && zeroValues == 0) { return(MatrixDefiniteness.NegativeDefinite); } else if (posValues > 0 && zeroValues > 0 && negValues == 0) { return(MatrixDefiniteness.PositiveSemidefinite); } else if (negValues > 0 && zeroValues > 0 && posValues == 0) { return(MatrixDefiniteness.NegativeSemiDefinite); } else { return(MatrixDefiniteness.Indefinite); } }