2014-07-24 10 views
2

기본적으로 ComplexDoubleMatrix 클래스에 속하는 행렬의 역함수를 계산하지만 inverse() 또는 inv()와 같은 함수를 찾지 못했습니다. 어떤 몸이라도 행렬의 역함수를 계산하는 법을 알고 있습니까? 미리 감사드립니다.jblas를 사용하여 ComplexDoubleMatrix의 역함수를 얻는 방법

최종 목표는 jblas.eigen을 사용하여 행렬의 고유 분해를 만드는 것입니다. 현재 나의 현재 구현은 아래의 jama 라이브러리입니다. 비슷한 기능을 수행하려면 Vinverse를 계산해야합니다. 그래서 jblas에서 역함수를 찾고 싶습니다.

public static SimpleEigenDecomposition SimpleEigenDecomposition(double [][] rates) 
{ 
    Matrix ratesMatrix = new Matrix(rates); 
    EigenvalueDecomposition ed = new EigenvalueDecomposition(ratesMatrix); 
    Matrix V = ed.getV(); 
    Matrix D =ed.getD(); 
    Matrix Vinverse = V.inverse(); 
    Matrix resultMatrix = V.times(D).times(V.inverse()); 
    //check if result and rates are close enough 
    SimpleMatrix trueMatrix = new SimpleMatrix(rates); 
    SimpleMatrix calculatedMatrix = new SimpleMatrix(resultMatrix.getArray()) ; 
    if(EJMLUtils.isClose(trueMatrix, calculatedMatrix, THRESHOLD)) 
    { 
     return new SimpleEigenDecomposition(V, D, Vinverse); 
    }else{ 
    throw new RuntimeException(); 
    } 

답변

3

이유는 Cramer 's Rule을 사용하면 계산하기에는 너무 비싸기 때문에 역 연산이 없다는 것입니다. 처음에는 Gauss Jordon 제거를 사용하여 구현할 수 있었기 때문에 이상하게 생각했습니다. 그러나 나는 심지어 그것을 발견 할 수 없다는 것이 이상하다. 누군가 JBLAS에서 찾으면 아래에 의견을 말하십시오.

내가 제안 할 수있는 대안 중 하나는 pinv()입니다. 그것은 최소 제곱 법을 사용하며 org.jblas.Solve에 정적 함수로 존재합니다.

 
import org.jblas.Solve 

public static SimpleEigenDecomposition SimpleEigenDecomposition(double [][] rates) 
{ 

    // inside the main function replace this for your implementation of inverse 
    DoubleMatrix Vinverse = Solve.pinv(V); 
}

리스 사각형 pinv 실제 역 같은 출력을 제공 할 때의 가역 행렬.

2

매트릭스 의 역은 의 역수 것이다 AX = I I는 항등 행렬이다X을 풀어서 발견 될 수있다. 그래서, 우리가 말할 수있는 jblas를 사용하여

DoubleMatrix Vinverse = Solve.solve(A, DoubleMatrix.eye(A.rows)); 

우리는 정사각형이 아닌 행렬을 반전 할 수 없다는 것에 유의하십시오.

A.isSquare(); // returns true if it is 
방법을 사용하여 행렬 A이 정사각형인지 확인할 수 있습니다.