private final static int sygvd(int itype, String jobz, String uplo, DenseMatrix A, DenseMatrix B, DenseVector W) { int info = dsygvd(itype, jobz, uplo, A.numColumns(), A.getData(), A.numRows(), B.getData(), B.numRows(), W.getData()); if (info == 0) { return 0; } else { if (info < 0) throw new IllegalArgumentException("LAPACK ERROR: DSYGVD returned " + info); throw new RuntimeException("LAPACK ERROR: DSYGVD returned " + info); } }
/** * Compute the generalised eigenvalues, L, of the problem A x = L B x. * The returned eigenvalues are not ordered. * * @param A symmetric Matrix A; only the upper triangle is used. * @param B symmetric Matrix B; only the upper triangle is used. * @return the eigenvalues L. */ public static DenseVector symmetricGeneralisedEigenvalues(DenseMatrix A, DenseMatrix B) { if (!A.isSquare() || !B.isSquare()) throw new IllegalArgumentException("Input matrices must be square"); DenseVector W = new DenseVector(A.numRows()); sygvd(1, "N", "U", A.copy(), B.copy(), W); return W; }
IndependentPair<Matrix, double[]> evs = GeneralisedEigenvalueProblem.symmetricGeneralisedEigenvectorsSorted(Sb, Sw, numComponents); this.eigenvectors = evs.firstObject(); this.eigenvalues = evs.secondObject();
/** * Solve the general problem A x = L B x. * The returned eigenvalues are not ordered. * * @param A symmetric matrix A * @param B symmetric matrix B * @return The eigenvectors x and eigenvalues L. */ public static IndependentPair<DenseMatrix, DenseVector> symmetricGeneralisedEigenvectors(DenseMatrix A, DenseMatrix B) { if (!A.isSquare() || !B.isSquare()) throw new IllegalArgumentException("Input matrices must be square"); DenseMatrix vecs = A.copy(); DenseVector W = new DenseVector(A.numRows()); sygvd(1, "V", "U", vecs, B.copy(), W); return new IndependentPair<DenseMatrix, DenseVector>(vecs, W); }
/** * Compute the generalised eigenvalues, L, of the problem A x = L B x. * The returned eigenvalues are not ordered. * * @param A symmetric Matrix A; only the upper triangle is used. * @param B symmetric Matrix B; only the upper triangle is used. * @return the eigenvalues L. */ public static double[] symmetricGeneralisedEigenvalues(Matrix A, Matrix B) { if ((A.getRowDimension() != A.getColumnDimension()) || (B.getRowDimension() != B.getColumnDimension())) throw new IllegalArgumentException("Input matrices must be square"); DenseVector W = new DenseVector(A.getRowDimension()); sygvd(1, "N", "U", new DenseMatrix(A.getArray()), new DenseMatrix(B.getArray()), W); return W.getData(); }
/** * Solve the general problem A x = L B x. * The returned eigenvalues are not ordered. * * @param A symmetric matrix A * @param B symmetric matrix B * @return The eigenvectors x and eigenvalues L. */ public static IndependentPair<Matrix, double[]> symmetricGeneralisedEigenvectors(Matrix A, Matrix B) { if ((A.getRowDimension() != A.getColumnDimension()) || (B.getRowDimension() != B.getColumnDimension())) throw new IllegalArgumentException("Input matrices must be square"); int dim = A.getRowDimension(); DenseMatrix vecs = new DenseMatrix(A.getArray()); DenseVector W = new DenseVector(dim); sygvd(1, "V", "U", vecs, new DenseMatrix(B.getArray()), W); Matrix evecs = new Matrix(dim, dim); final double[][] evecsData = evecs.getArray(); final double[] vecsData = vecs.getData(); for (int r=0; r<dim; r++) for (int c=0; c<dim; c++) evecsData[r][c] = vecsData[r + c * dim]; return new IndependentPair<Matrix, double[]>(evecs, W.getData()); }
DenseVector W = new DenseVector(dim); sygvd(1, "V", "U", vecs, new DenseMatrix(B.getArray()), W);
DenseVector W = new DenseVector(dim); sygvd(1, "V", "U", vecs, new DenseMatrix(B.getArray()), W);