/*
* Copyright (c) 2009-2014, Peter Abeles. All Rights Reserved.
*
* This file is part of Efficient Java Matrix Library (EJML).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ejml.alg.dense.decomposition.eig;
import org.ejml.data.Complex64F;
import org.ejml.data.DenseMatrix64F;
import org.ejml.factory.DecompositionFactory;
import org.ejml.interfaces.decomposition.EigenDecomposition;
import org.ejml.ops.MatrixFeatures;
/**
* Checks to see what type of matrix is being decomposed and calls different eigenvalue decomposition
* algorithms depending on the results. This primarily checks to see if the matrix is symmetric or not.
*
*
* @author Peter Abeles
*/
public class SwitchingEigenDecomposition
implements EigenDecomposition {
// tolerance used in deciding if a matrix is symmetric or not
private double tol;
EigenDecomposition symmetricAlg;
EigenDecomposition generalAlg;
boolean symmetric;
// should it compute eigenvectors or just eigenvalues?
boolean computeVectors;
DenseMatrix64F A = new DenseMatrix64F(1,1);
/**
*
* @param computeVectors
* @param tol Tolerance for a matrix being symmetric
*/
public SwitchingEigenDecomposition( int matrixSize , boolean computeVectors , double tol ) {
symmetricAlg = DecompositionFactory.eig(matrixSize,computeVectors,true);
generalAlg = DecompositionFactory.eig(matrixSize,computeVectors,false);
this.computeVectors = computeVectors;
this.tol = tol;
}
public SwitchingEigenDecomposition( int matrixSize ) {
this(matrixSize,true,1e-8);
}
@Override
public int getNumberOfEigenvalues() {
return symmetric ? symmetricAlg.getNumberOfEigenvalues() :
generalAlg.getNumberOfEigenvalues();
}
@Override
public Complex64F getEigenvalue(int index) {
return symmetric ? symmetricAlg.getEigenvalue(index) :
generalAlg.getEigenvalue(index);
}
@Override
public DenseMatrix64F getEigenVector(int index) {
if( !computeVectors )
throw new IllegalArgumentException("Configured to not compute eignevectors");
return symmetric ? symmetricAlg.getEigenVector(index) :
generalAlg.getEigenVector(index);
}
@Override
public boolean decompose(DenseMatrix64F orig) {
A.set(orig);
symmetric = MatrixFeatures.isSymmetric(A,tol);
return symmetric ?
symmetricAlg.decompose(A) :
generalAlg.decompose(A);
}
@Override
public boolean inputModified() {
// since it doesn't know which algorithm will be used until a matrix is provided make a copy
// of all inputs
return false;
}
}
Ads help maintain this website.