public static ComplexMatrix ejmlToIhmComplex(CDenseMatrix64F ejml) { ComplexMatrix ihmc = new ComplexMatrix(ejml.numRows, ejml.numCols); Complex64F c = new Complex64F(); for (int i = 0; i < ejml.numRows; i++) { for (int j = 0; j < ejml.numCols; j++) { ejml.get(i, j, c); ihmc.set(i, j, new ComplexNumber(c.getReal(), c.getImaginary())); } } return ihmc; }
private void addEigenvalue( double v ) { numStepsFind[numEigen] = steps; eigenvalues[numEigen].set(v,0); numEigen++; steps = 0; lastExceptional = 0; }
private static double[] roots(double[] coefficients) { final Complex64F[] complexRoots = findRoots(coefficients); final double[] absoluteRoots = new double[complexRoots.length]; for (int i = 0; i < complexRoots.length; i++) { absoluteRoots[i] = complexRoots[i].getMagnitude(); } return absoluteRoots; }
@Override public Complex64F getEigenvalue(int index) { return new Complex64F(values[index], 0); }
public boolean extractVectors( DenseMatrix64F Q_h ) { UtilEjml.memset(eigenvectorTemp.data,0); // extract eigenvectors from the shur matrix // start at the top left corner of the matrix boolean triangular = true; for( int i = 0; i < N; i++ ) { Complex64F c = implicit.eigenvalues[N-i-1]; if( triangular && !c.isReal() ) triangular = false; if( c.isReal() && eigenvectors[N-i-1] == null) { solveEigenvectorDuplicateEigenvalue(c.real,i,triangular); } } // translate the eigenvectors into the frame of the original matrix if( Q_h != null ) { DenseMatrix64F temp = new DenseMatrix64F(N,1); for( int i = 0; i < N; i++ ) { DenseMatrix64F v = eigenvectors[i]; if( v != null ) { CommonOps.mult(Q_h,v,temp); eigenvectors[i] = temp; temp = v; } } } return true; }
/** * <p> * Checks to see if the matrix is positive semidefinite: * </p> * <p> * x<sup>T</sup> A x >= 0<br> * for all x where x is a non-zero vector and A is a symmetric matrix. * </p> * * @param A square symmetric matrix. Not modified. * * @return True if it is positive semidefinite and false if it is not. */ public static boolean isPositiveSemidefinite( DenseMatrix64F A ) { if( !isSquare(A)) return false; EigenDecomposition<DenseMatrix64F> eig = DecompositionFactory.eig(A.numCols,false); if( eig.inputModified() ) A = A.copy(); eig.decompose(A); for( int i = 0; i < A.numRows; i++ ) { Complex64F v = eig.getEigenvalue(i); if( v.getReal() < 0 ) return false; } return true; }
Complex64F prod = new Complex64F(); CVectorVectorMult.innerProdH(a, u[j], prod); if( !(prod.getMagnitude2() <= tol*tol)) return false;
private static void checkEigenValuesRealAndPositive(Matrix3D matrix, double epsilon) { DenseMatrix64F denseMatrix = new DenseMatrix64F(3, 3); matrix.get(denseMatrix); EigenDecomposition<DenseMatrix64F> eig = DecompositionFactory.eig(3, false); eig.decompose(denseMatrix); for (int i = 0; i < eig.getNumberOfEigenvalues(); i++) { double eigImaginaryPart = eig.getEigenvalue(i).getImaginary(); double eigRealPart = eig.getEigenvalue(i).getReal(); if (!EuclidCoreTools.epsilonEquals(0.0, eigImaginaryPart, epsilon)) throw new RuntimeException("The matrix has at least one imaginary eigen value."); if (eigRealPart <= 0.0) throw new RuntimeException("The matrix has at least one non-positive eigen value."); } } }
/** * Returns the index of the eigenvalue which has the largest magnitude. * * @return index of the largest magnitude eigen value. */ public int getIndexMax() { int indexMax = 0; double max = getEigenvalue(0).getMagnitude2(); final int N = getNumberOfEigenvalues(); for( int i = 1; i < N; i++ ) { double m = getEigenvalue(i).getMagnitude2(); if( m > max ) { max = m; indexMax = i; } } return indexMax; }
Complex64F c = new Complex64F(); u.get(0,0,c); if( c.getMagnitude() == 0 ) { realTau = nx; imagTau = 0; } else { realTau = c.real/c.getMagnitude()*nx; imagTau = c.imaginary/c.getMagnitude()*nx;
@Override public Complex64F getEigenvalue(int index) { return new Complex64F(values[index], 0); }
public boolean extractVectors( DenseMatrix64F Q_h ) { UtilEjml.memset(eigenvectorTemp.data,0); // extract eigenvectors from the shur matrix // start at the top left corner of the matrix boolean triangular = true; for( int i = 0; i < N; i++ ) { Complex64F c = implicit.eigenvalues[N-i-1]; if( triangular && !c.isReal() ) triangular = false; if( c.isReal() && eigenvectors[N-i-1] == null) { solveEigenvectorDuplicateEigenvalue(c.real,i,triangular); } } // translate the eigenvectors into the frame of the original matrix if( Q_h != null ) { DenseMatrix64F temp = new DenseMatrix64F(N,1); for( int i = 0; i < N; i++ ) { DenseMatrix64F v = eigenvectors[i]; if( v != null ) { CommonOps.mult(Q_h,v,temp); eigenvectors[i] = temp; temp = v; } } } return true; }
/** * <p> * Checks to see if the matrix is positive semidefinite: * </p> * <p> * x<sup>T</sup> A x >= 0<br> * for all x where x is a non-zero vector and A is a symmetric matrix. * </p> * * @param A square symmetric matrix. Not modified. * * @return True if it is positive semidefinite and false if it is not. */ public static boolean isPositiveSemidefinite( DenseMatrix64F A ) { if( !isSquare(A)) return false; EigenDecomposition<DenseMatrix64F> eig = DecompositionFactory.eig(A.numCols,false); if( eig.inputModified() ) A = A.copy(); eig.decompose(A); for( int i = 0; i < A.numRows; i++ ) { Complex64F v = eig.getEigenvalue(i); if( v.getReal() < 0 ) return false; } return true; }
/** * Returns the index of the eigenvalue which has the smallest magnitude. * * @return index of the smallest magnitude eigen value. */ public int getIndexMin() { int indexMin = 0; double min = getEigenvalue(0).getMagnitude2(); final int N = getNumberOfEigenvalues(); for( int i = 1; i < N; i++ ) { double m = getEigenvalue(i).getMagnitude2(); if( m < min ) { min = m; indexMin = i; } } return indexMin; } }
public static ComplexMatrix ejmlToIhmComplex(CDenseMatrix64F ejml) { ComplexMatrix ihmc = new ComplexMatrix(ejml.numRows, ejml.numCols); Complex64F c = new Complex64F(); for (int i = 0; i < ejml.numRows; i++) { for (int j = 0; j < ejml.numCols; j++) { ejml.get(i, j, c); ihmc.set(i, j, new ComplexNumber(c.getReal(), c.getImaginary())); } } return ihmc; }
@Override public Complex64F getEigenvalue(int index) { return new Complex64F(values[index],0); }
public boolean extractVectors( DenseMatrix64F Q_h ) { UtilEjml.memset(eigenvectorTemp.data,0); // extract eigenvectors from the shur matrix // start at the top left corner of the matrix boolean triangular = true; for( int i = 0; i < N; i++ ) { Complex64F c = implicit.eigenvalues[N-i-1]; if( triangular && !c.isReal() ) triangular = false; if( c.isReal() && eigenvectors[N-i-1] == null) { solveEigenvectorDuplicateEigenvalue(c.real,i,triangular); } } // translate the eigenvectors into the frame of the original matrix if( Q_h != null ) { DenseMatrix64F temp = new DenseMatrix64F(N,1); for( int i = 0; i < N; i++ ) { DenseMatrix64F v = eigenvectors[i]; if( v != null ) { CommonOps.mult(Q_h,v,temp); eigenvectors[i] = temp; temp = v; } } } return true; }