//
|
// Source code recreated from a .class file by IntelliJ IDEA
|
// (powered by FernFlower decompiler)
|
//
|
|
package com.jisuan.Jama;
|
|
//import Jama.util.Maths;
|
import com.jisuan.Jama.util.Maths;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.io.PrintWriter;
|
import java.io.Serializable;
|
import java.io.StreamTokenizer;
|
import java.text.DecimalFormat;
|
import java.text.DecimalFormatSymbols;
|
import java.text.NumberFormat;
|
import java.util.Locale;
|
import java.util.Vector;
|
|
public class Matrix implements Cloneable, Serializable {
|
private double[][] A;
|
private int m;
|
private int n;
|
private static final long serialVersionUID = 1L;
|
|
public Matrix(int var1, int var2) {
|
this.m = var1;
|
this.n = var2;
|
this.A = new double[var1][var2];
|
}
|
|
public Matrix(int var1, int var2, double var3) {
|
this.m = var1;
|
this.n = var2;
|
this.A = new double[var1][var2];
|
|
for(int var5 = 0; var5 < var1; ++var5) {
|
for(int var6 = 0; var6 < var2; ++var6) {
|
this.A[var5][var6] = var3;
|
}
|
}
|
|
}
|
|
public Matrix(double[][] var1) {
|
this.m = var1.length;
|
this.n = var1[0].length;
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
if (var1[var2].length != this.n) {
|
throw new IllegalArgumentException("All rows must have the same length.");
|
}
|
}
|
|
this.A = var1;
|
}
|
|
public Matrix(double[][] var1, int var2, int var3) {
|
this.A = var1;
|
this.m = var2;
|
this.n = var3;
|
}
|
|
public Matrix(double[] var1, int var2) {
|
this.m = var2;
|
this.n = var2 != 0 ? var1.length / var2 : 0;
|
if (var2 * this.n != var1.length) {
|
throw new IllegalArgumentException("Array length must be a multiple of m.");
|
} else {
|
this.A = new double[var2][this.n];
|
|
for(int var3 = 0; var3 < var2; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
this.A[var3][var4] = var1[var3 + var4 * var2];
|
}
|
}
|
|
}
|
}
|
|
public static Matrix constructWithCopy(double[][] var0) {
|
int var1 = var0.length;
|
int var2 = var0[0].length;
|
Matrix var3 = new Matrix(var1, var2);
|
double[][] var4 = var3.getArray();
|
|
for(int var5 = 0; var5 < var1; ++var5) {
|
if (var0[var5].length != var2) {
|
throw new IllegalArgumentException("All rows must have the same length.");
|
}
|
|
for(int var6 = 0; var6 < var2; ++var6) {
|
var4[var5][var6] = var0[var5][var6];
|
}
|
}
|
|
return var3;
|
}
|
|
public Matrix copy() {
|
Matrix var1 = new Matrix(this.m, this.n);
|
double[][] var2 = var1.getArray();
|
|
for(int var3 = 0; var3 < this.m; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
var2[var3][var4] = this.A[var3][var4];
|
}
|
}
|
|
return var1;
|
}
|
|
public Object clone() {
|
return this.copy();
|
}
|
|
public double[][] getArray() {
|
return this.A;
|
}
|
|
public double[][] getArrayCopy() {
|
double[][] var1 = new double[this.m][this.n];
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
var1[var2][var3] = this.A[var2][var3];
|
}
|
}
|
|
return var1;
|
}
|
|
public double[] getColumnPackedCopy() {
|
double[] var1 = new double[this.m * this.n];
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
var1[var2 + var3 * this.m] = this.A[var2][var3];
|
}
|
}
|
|
return var1;
|
}
|
|
public double[] getRowPackedCopy() {
|
double[] var1 = new double[this.m * this.n];
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
var1[var2 * this.n + var3] = this.A[var2][var3];
|
}
|
}
|
|
return var1;
|
}
|
|
public int getRowDimension() {
|
return this.m;
|
}
|
|
public int getColumnDimension() {
|
return this.n;
|
}
|
|
public double get(int var1, int var2) {
|
return this.A[var1][var2];
|
}
|
|
public Matrix getMatrix(int var1, int var2, int var3, int var4) {
|
Matrix var5 = new Matrix(var2 - var1 + 1, var4 - var3 + 1);
|
double[][] var6 = var5.getArray();
|
|
try {
|
for(int var7 = var1; var7 <= var2; ++var7) {
|
for(int var8 = var3; var8 <= var4; ++var8) {
|
var6[var7 - var1][var8 - var3] = this.A[var7][var8];
|
}
|
}
|
|
return var5;
|
} catch (ArrayIndexOutOfBoundsException var9) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public Matrix getMatrix(int[] var1, int[] var2) {
|
Matrix var3 = new Matrix(var1.length, var2.length);
|
double[][] var4 = var3.getArray();
|
|
try {
|
for(int var5 = 0; var5 < var1.length; ++var5) {
|
for(int var6 = 0; var6 < var2.length; ++var6) {
|
var4[var5][var6] = this.A[var1[var5]][var2[var6]];
|
}
|
}
|
|
return var3;
|
} catch (ArrayIndexOutOfBoundsException var7) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public Matrix getMatrix(int var1, int var2, int[] var3) {
|
Matrix var4 = new Matrix(var2 - var1 + 1, var3.length);
|
double[][] var5 = var4.getArray();
|
|
try {
|
for(int var6 = var1; var6 <= var2; ++var6) {
|
for(int var7 = 0; var7 < var3.length; ++var7) {
|
var5[var6 - var1][var7] = this.A[var6][var3[var7]];
|
}
|
}
|
|
return var4;
|
} catch (ArrayIndexOutOfBoundsException var8) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public Matrix getMatrix(int[] var1, int var2, int var3) {
|
Matrix var4 = new Matrix(var1.length, var3 - var2 + 1);
|
double[][] var5 = var4.getArray();
|
|
try {
|
for(int var6 = 0; var6 < var1.length; ++var6) {
|
for(int var7 = var2; var7 <= var3; ++var7) {
|
var5[var6][var7 - var2] = this.A[var1[var6]][var7];
|
}
|
}
|
|
return var4;
|
} catch (ArrayIndexOutOfBoundsException var8) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public void set(int var1, int var2, double var3) {
|
this.A[var1][var2] = var3;
|
}
|
|
public void setMatrix(int var1, int var2, int var3, int var4, Matrix var5) {
|
try {
|
for(int var6 = var1; var6 <= var2; ++var6) {
|
for(int var7 = var3; var7 <= var4; ++var7) {
|
this.A[var6][var7] = var5.get(var6 - var1, var7 - var3);
|
}
|
}
|
|
} catch (ArrayIndexOutOfBoundsException var8) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public void setMatrix(int[] var1, int[] var2, Matrix var3) {
|
try {
|
for(int var4 = 0; var4 < var1.length; ++var4) {
|
for(int var5 = 0; var5 < var2.length; ++var5) {
|
this.A[var1[var4]][var2[var5]] = var3.get(var4, var5);
|
}
|
}
|
|
} catch (ArrayIndexOutOfBoundsException var6) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public void setMatrix(int[] var1, int var2, int var3, Matrix var4) {
|
try {
|
for(int var5 = 0; var5 < var1.length; ++var5) {
|
for(int var6 = var2; var6 <= var3; ++var6) {
|
this.A[var1[var5]][var6] = var4.get(var5, var6 - var2);
|
}
|
}
|
|
} catch (ArrayIndexOutOfBoundsException var7) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public void setMatrix(int var1, int var2, int[] var3, Matrix var4) {
|
try {
|
for(int var5 = var1; var5 <= var2; ++var5) {
|
for(int var6 = 0; var6 < var3.length; ++var6) {
|
this.A[var5][var3[var6]] = var4.get(var5 - var1, var6);
|
}
|
}
|
|
} catch (ArrayIndexOutOfBoundsException var7) {
|
throw new ArrayIndexOutOfBoundsException("Submatrix indices");
|
}
|
}
|
|
public Matrix transpose() {
|
Matrix var1 = new Matrix(this.n, this.m);
|
double[][] var2 = var1.getArray();
|
|
for(int var3 = 0; var3 < this.m; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
var2[var4][var3] = this.A[var3][var4];
|
}
|
}
|
|
return var1;
|
}
|
|
public double norm1() {
|
double var1 = 0.0;
|
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
double var4 = 0.0;
|
|
for(int var6 = 0; var6 < this.m; ++var6) {
|
var4 += Math.abs(this.A[var6][var3]);
|
}
|
|
var1 = Math.max(var1, var4);
|
}
|
|
return var1;
|
}
|
|
public double norm2() {
|
return (new SingularValueDecomposition(this)).norm2();
|
}
|
|
public double normInf() {
|
double var1 = 0.0;
|
|
for(int var3 = 0; var3 < this.m; ++var3) {
|
double var4 = 0.0;
|
|
for(int var6 = 0; var6 < this.n; ++var6) {
|
var4 += Math.abs(this.A[var3][var6]);
|
}
|
|
var1 = Math.max(var1, var4);
|
}
|
|
return var1;
|
}
|
|
public double normF() {
|
double var1 = 0.0;
|
|
for(int var3 = 0; var3 < this.m; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
var1 = Maths.hypot(var1, this.A[var3][var4]);
|
}
|
}
|
|
return var1;
|
}
|
|
public Matrix uminus() {
|
Matrix var1 = new Matrix(this.m, this.n);
|
double[][] var2 = var1.getArray();
|
|
for(int var3 = 0; var3 < this.m; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
var2[var3][var4] = -this.A[var3][var4];
|
}
|
}
|
|
return var1;
|
}
|
|
public Matrix plus(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
Matrix var2 = new Matrix(this.m, this.n);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < this.m; ++var4) {
|
for(int var5 = 0; var5 < this.n; ++var5) {
|
var3[var4][var5] = this.A[var4][var5] + var1.A[var4][var5];
|
}
|
}
|
|
return var2;
|
}
|
|
public Matrix plusEquals(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
this.A[var2][var3] += var1.A[var2][var3];
|
}
|
}
|
|
return this;
|
}
|
|
public Matrix minus(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
Matrix var2 = new Matrix(this.m, this.n);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < this.m; ++var4) {
|
for(int var5 = 0; var5 < this.n; ++var5) {
|
var3[var4][var5] = this.A[var4][var5] - var1.A[var4][var5];
|
}
|
}
|
|
return var2;
|
}
|
|
public Matrix minusEquals(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
this.A[var2][var3] -= var1.A[var2][var3];
|
}
|
}
|
|
return this;
|
}
|
|
public Matrix arrayTimes(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
Matrix var2 = new Matrix(this.m, this.n);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < this.m; ++var4) {
|
for(int var5 = 0; var5 < this.n; ++var5) {
|
var3[var4][var5] = this.A[var4][var5] * var1.A[var4][var5];
|
}
|
}
|
|
return var2;
|
}
|
|
public Matrix arrayTimesEquals(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
this.A[var2][var3] *= var1.A[var2][var3];
|
}
|
}
|
|
return this;
|
}
|
|
public Matrix arrayRightDivide(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
Matrix var2 = new Matrix(this.m, this.n);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < this.m; ++var4) {
|
for(int var5 = 0; var5 < this.n; ++var5) {
|
var3[var4][var5] = this.A[var4][var5] / var1.A[var4][var5];
|
}
|
}
|
|
return var2;
|
}
|
|
public Matrix arrayRightDivideEquals(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
this.A[var2][var3] /= var1.A[var2][var3];
|
}
|
}
|
|
return this;
|
}
|
|
public Matrix arrayLeftDivide(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
Matrix var2 = new Matrix(this.m, this.n);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < this.m; ++var4) {
|
for(int var5 = 0; var5 < this.n; ++var5) {
|
var3[var4][var5] = var1.A[var4][var5] / this.A[var4][var5];
|
}
|
}
|
|
return var2;
|
}
|
|
public Matrix arrayLeftDivideEquals(Matrix var1) {
|
this.checkMatrixDimensions(var1);
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
this.A[var2][var3] = var1.A[var2][var3] / this.A[var2][var3];
|
}
|
}
|
|
return this;
|
}
|
|
public Matrix times(double var1) {
|
Matrix var3 = new Matrix(this.m, this.n);
|
double[][] var4 = var3.getArray();
|
|
for(int var5 = 0; var5 < this.m; ++var5) {
|
for(int var6 = 0; var6 < this.n; ++var6) {
|
var4[var5][var6] = var1 * this.A[var5][var6];
|
}
|
}
|
|
return var3;
|
}
|
|
public Matrix timesEquals(double var1) {
|
for(int var3 = 0; var3 < this.m; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
this.A[var3][var4] = var1 * this.A[var3][var4];
|
}
|
}
|
|
return this;
|
}
|
|
public Matrix times(Matrix var1) {
|
if (var1.m != this.n) {
|
throw new IllegalArgumentException("Matrix inner dimensions must agree.");
|
} else {
|
Matrix var2 = new Matrix(this.m, var1.n);
|
double[][] var3 = var2.getArray();
|
double[] var4 = new double[this.n];
|
|
for(int var5 = 0; var5 < var1.n; ++var5) {
|
int var6;
|
for(var6 = 0; var6 < this.n; ++var6) {
|
var4[var6] = var1.A[var6][var5];
|
}
|
|
for(var6 = 0; var6 < this.m; ++var6) {
|
double[] var7 = this.A[var6];
|
double var8 = 0.0;
|
|
for(int var10 = 0; var10 < this.n; ++var10) {
|
var8 += var7[var10] * var4[var10];
|
}
|
|
var3[var6][var5] = var8;
|
}
|
}
|
|
return var2;
|
}
|
}
|
|
public LUDecomposition lu() {
|
return new LUDecomposition(this);
|
}
|
|
public QRDecomposition qr() {
|
return new QRDecomposition(this);
|
}
|
|
public CholeskyDecomposition chol() {
|
return new CholeskyDecomposition(this);
|
}
|
|
public SingularValueDecomposition svd() {
|
return new SingularValueDecomposition(this);
|
}
|
|
public EigenvalueDecomposition eig() {
|
return new EigenvalueDecomposition(this);
|
}
|
|
public Matrix solve(Matrix var1) {
|
return this.m == this.n ? (new LUDecomposition(this)).solve(var1) : (new QRDecomposition(this)).solve(var1);
|
}
|
|
public Matrix solveTranspose(Matrix var1) {
|
return this.transpose().solve(var1.transpose());
|
}
|
|
public Matrix inverse() {
|
return this.solve(identity(this.m, this.m));
|
}
|
|
public double det() {
|
return (new LUDecomposition(this)).det();
|
}
|
|
public int rank() {
|
return (new SingularValueDecomposition(this)).rank();
|
}
|
|
public double cond() {
|
return (new SingularValueDecomposition(this)).cond();
|
}
|
|
public double trace() {
|
double var1 = 0.0;
|
|
for(int var3 = 0; var3 < Math.min(this.m, this.n); ++var3) {
|
var1 += this.A[var3][var3];
|
}
|
|
return var1;
|
}
|
|
public static Matrix random(int var0, int var1) {
|
Matrix var2 = new Matrix(var0, var1);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < var0; ++var4) {
|
for(int var5 = 0; var5 < var1; ++var5) {
|
var3[var4][var5] = Math.random();
|
}
|
}
|
|
return var2;
|
}
|
|
public static Matrix identity(int var0, int var1) {
|
Matrix var2 = new Matrix(var0, var1);
|
double[][] var3 = var2.getArray();
|
|
for(int var4 = 0; var4 < var0; ++var4) {
|
for(int var5 = 0; var5 < var1; ++var5) {
|
var3[var4][var5] = var4 == var5 ? 1.0 : 0.0;
|
}
|
}
|
|
return var2;
|
}
|
|
public void print(int var1, int var2) {
|
this.print(new PrintWriter(System.out, true), var1, var2);
|
}
|
|
public void print(PrintWriter var1, int var2, int var3) {
|
DecimalFormat var4 = new DecimalFormat();
|
var4.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
|
var4.setMinimumIntegerDigits(1);
|
var4.setMaximumFractionDigits(var3);
|
var4.setMinimumFractionDigits(var3);
|
var4.setGroupingUsed(false);
|
this.print(var1, var4, var2 + 2);
|
}
|
|
public void print(NumberFormat var1, int var2) {
|
this.print(new PrintWriter(System.out, true), var1, var2);
|
}
|
|
public void print(PrintWriter var1, NumberFormat var2, int var3) {
|
var1.println();
|
|
for(int var4 = 0; var4 < this.m; ++var4) {
|
for(int var5 = 0; var5 < this.n; ++var5) {
|
String var6 = var2.format(this.A[var4][var5]);
|
int var7 = Math.max(1, var3 - var6.length());
|
|
for(int var8 = 0; var8 < var7; ++var8) {
|
var1.print(' ');
|
}
|
|
var1.print(var6);
|
}
|
|
var1.println();
|
}
|
|
var1.println();
|
}
|
|
public static Matrix read(BufferedReader var0) throws IOException {
|
StreamTokenizer var1 = new StreamTokenizer(var0);
|
var1.resetSyntax();
|
var1.wordChars(0, 255);
|
var1.whitespaceChars(0, 32);
|
var1.eolIsSignificant(true);
|
Vector var2 = new Vector();
|
|
while(var1.nextToken() == 10) {
|
}
|
|
if (var1.ttype == -1) {
|
throw new IOException("Unexpected EOF on matrix read.");
|
} else {
|
do {
|
var2.addElement(Double.valueOf(var1.sval));
|
} while(var1.nextToken() == -3);
|
|
int var3 = var2.size();
|
double[] var4 = new double[var3];
|
|
for(int var5 = 0; var5 < var3; ++var5) {
|
var4[var5] = (Double)var2.elementAt(var5);
|
}
|
|
Vector var8 = new Vector();
|
var8.addElement(var4);
|
|
int var6;
|
do {
|
if (var1.nextToken() != -3) {
|
var6 = var8.size();
|
double[][] var7 = new double[var6][];
|
var8.copyInto(var7);
|
return new Matrix(var7);
|
}
|
|
var8.addElement(var4 = new double[var3]);
|
var6 = 0;
|
|
do {
|
if (var6 >= var3) {
|
throw new IOException("Row " + var8.size() + " is too long.");
|
}
|
|
var4[var6++] = Double.valueOf(var1.sval);
|
} while(var1.nextToken() == -3);
|
} while(var6 >= var3);
|
|
throw new IOException("Row " + var8.size() + " is too short.");
|
}
|
}
|
|
private void checkMatrixDimensions(Matrix var1) {
|
if (var1.m != this.m || var1.n != this.n) {
|
throw new IllegalArgumentException("Matrix dimensions must agree.");
|
}
|
}
|
}
|