package matrix;
import static matrix.Utils.*;
import java.util.Arrays;
import Jama.EigenvalueDecomposition;
import lto.libinfo.Cost;
public class EigenDecompMatrix implements Matrix
{
private final double[][] V; // eigenvectors
private final double[] L; // eigenvalues
private double[][] data; // original matrix
public EigenDecompMatrix(double[][] data)
{
EigenvalueDecomposition E = (new Jama.Matrix(data)).eig();
V = E.getV().getArray();
L = E.getRealEigenvalues();
this.data = getCopy(data);
}
public EigenDecompMatrix(EigenDecompMatrix A) {
V = getCopy(A.V);
L = Arrays.copyOf(A.L, A.L.length);
data = getCopy(A.data);
}
@Override
public EigenDecompMatrix copy()
{
return new EigenDecompMatrix(this);
}
@Override
public double[][] getAsArray() {
if (data == null) {
Jama.Matrix mV = new Jama.Matrix(V), mL = new Jama.Matrix(L.length, L.length);
for (int i = 0; i < L.length; i++)
mL.set(i, i, L[i]);
data = mV.times(mL.times(mV.inverse())).getArray();
}
return getCopy(data);
}
@Override
public double getElement(int row, int col) {
return getAsArray()[row - 1][col - 1];
}
@Override
public int getNumColumns() {
return L.length;
}
@Override
public int getNumRows() {
return L.length;
}
@Cost(10)
public static double[] eigenvalues(EigenDecompMatrix A)
{
return Arrays.copyOf(A.L, A.L.length);
}
@Cost(20000)
public static EigenDecompMatrix multiply(EigenDecompMatrix mA, EigenDecompMatrix mB)
{
return new EigenDecompMatrix(DefaultMatrix.multiply(new DefaultMatrix(mA), new DefaultMatrix(mB)).getAsArray());
}
@Cost(100)
public static EigenDecompMatrix power(EigenDecompMatrix A, int k)
{
EigenDecompMatrix mP = A.copy();
mP.data = null; // must recompute, if desired later
for (int i = 0; i < mP.L.length; i++)
mP.L[i] = Math.pow(mP.L[i], k);
return mP;
}
}