//
|
// Source code recreated from a .class file by IntelliJ IDEA
|
// (powered by FernFlower decompiler)
|
//
|
|
package com.jisuan.Jama;
|
|
import java.io.Serializable;
|
|
public class LUDecomposition implements Serializable {
|
private double[][] LU;
|
private int m;
|
private int n;
|
private int pivsign;
|
private int[] piv;
|
private static final long serialVersionUID = 1L;
|
|
public LUDecomposition(Matrix var1) {
|
this.LU = var1.getArrayCopy();
|
this.m = var1.getRowDimension();
|
this.n = var1.getColumnDimension();
|
this.piv = new int[this.m];
|
|
for(int var2 = 0; var2 < this.m; this.piv[var2] = var2++) {
|
}
|
|
this.pivsign = 1;
|
double[] var3 = new double[this.m];
|
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
int var5;
|
for(var5 = 0; var5 < this.m; ++var5) {
|
var3[var5] = this.LU[var5][var4];
|
}
|
|
int var6;
|
double var7;
|
for(var5 = 0; var5 < this.m; ++var5) {
|
double[] var10 = this.LU[var5];
|
var6 = Math.min(var5, var4);
|
var7 = 0.0;
|
|
for(int var9 = 0; var9 < var6; ++var9) {
|
var7 += var10[var9] * var3[var9];
|
}
|
|
var10[var4] = var3[var5] -= var7;
|
}
|
|
var5 = var4;
|
|
for(var6 = var4 + 1; var6 < this.m; ++var6) {
|
if (Math.abs(var3[var6]) > Math.abs(var3[var5])) {
|
var5 = var6;
|
}
|
}
|
|
if (var5 != var4) {
|
for(var6 = 0; var6 < this.n; ++var6) {
|
var7 = this.LU[var5][var6];
|
this.LU[var5][var6] = this.LU[var4][var6];
|
this.LU[var4][var6] = var7;
|
}
|
|
var6 = this.piv[var5];
|
this.piv[var5] = this.piv[var4];
|
this.piv[var4] = var6;
|
this.pivsign = -this.pivsign;
|
}
|
|
if (var4 < this.m & this.LU[var4][var4] != 0.0) {
|
for(var6 = var4 + 1; var6 < this.m; ++var6) {
|
double[] var10000 = this.LU[var6];
|
var10000[var4] /= this.LU[var4][var4];
|
}
|
}
|
}
|
|
}
|
|
public boolean isNonsingular() {
|
for(int var1 = 0; var1 < this.n; ++var1) {
|
if (this.LU[var1][var1] == 0.0) {
|
return false;
|
}
|
}
|
|
return true;
|
}
|
|
public Matrix getL() {
|
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) {
|
if (var3 > var4) {
|
var2[var3][var4] = this.LU[var3][var4];
|
} else if (var3 == var4) {
|
var2[var3][var4] = 1.0;
|
} else {
|
var2[var3][var4] = 0.0;
|
}
|
}
|
}
|
|
return var1;
|
}
|
|
public Matrix getU() {
|
Matrix var1 = new Matrix(this.n, this.n);
|
double[][] var2 = var1.getArray();
|
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
for(int var4 = 0; var4 < this.n; ++var4) {
|
if (var3 <= var4) {
|
var2[var3][var4] = this.LU[var3][var4];
|
} else {
|
var2[var3][var4] = 0.0;
|
}
|
}
|
}
|
|
return var1;
|
}
|
|
public int[] getPivot() {
|
int[] var1 = new int[this.m];
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
var1[var2] = this.piv[var2];
|
}
|
|
return var1;
|
}
|
|
public double[] getDoublePivot() {
|
double[] var1 = new double[this.m];
|
|
for(int var2 = 0; var2 < this.m; ++var2) {
|
var1[var2] = (double)this.piv[var2];
|
}
|
|
return var1;
|
}
|
|
public double det() {
|
if (this.m != this.n) {
|
throw new IllegalArgumentException("Matrix must be square.");
|
} else {
|
double var1 = (double)this.pivsign;
|
|
for(int var3 = 0; var3 < this.n; ++var3) {
|
var1 *= this.LU[var3][var3];
|
}
|
|
return var1;
|
}
|
}
|
|
public Matrix solve(Matrix var1) {
|
if (var1.getRowDimension() != this.m) {
|
throw new IllegalArgumentException("Matrix row dimensions must agree.");
|
} else if (!this.isNonsingular()) {
|
throw new RuntimeException("Matrix is singular.");
|
} else {
|
int var2 = var1.getColumnDimension();
|
Matrix var3 = var1.getMatrix(this.piv, 0, var2 - 1);
|
double[][] var4 = var3.getArray();
|
|
int var5;
|
int var6;
|
int var7;
|
for(var5 = 0; var5 < this.n; ++var5) {
|
for(var6 = var5 + 1; var6 < this.n; ++var6) {
|
for(var7 = 0; var7 < var2; ++var7) {
|
var4[var6][var7] -= var4[var5][var7] * this.LU[var6][var5];
|
}
|
}
|
}
|
|
for(var5 = this.n - 1; var5 >= 0; --var5) {
|
for(var6 = 0; var6 < var2; ++var6) {
|
var4[var5][var6] /= this.LU[var5][var5];
|
}
|
|
for(var6 = 0; var6 < var5; ++var6) {
|
for(var7 = 0; var7 < var2; ++var7) {
|
var4[var6][var7] -= var4[var5][var7] * this.LU[var6][var5];
|
}
|
}
|
}
|
|
return var3;
|
}
|
}
|
}
|