//
|
// 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.Serializable;
|
|
public class QRDecomposition implements Serializable {
|
private double[][] QR;
|
private int m;
|
private int n;
|
private double[] Rdiag;
|
private static final long serialVersionUID = 1L;
|
|
public QRDecomposition(Matrix var1) {
|
this.QR = var1.getArrayCopy();
|
this.m = var1.getRowDimension();
|
this.n = var1.getColumnDimension();
|
this.Rdiag = new double[this.n];
|
|
for(int var2 = 0; var2 < this.n; ++var2) {
|
double var3 = 0.0;
|
|
int var5;
|
for(var5 = var2; var5 < this.m; ++var5) {
|
var3 = Maths.hypot(var3, this.QR[var5][var2]);
|
}
|
|
if (var3 != 0.0) {
|
if (this.QR[var2][var2] < 0.0) {
|
var3 = -var3;
|
}
|
|
double[] var10000;
|
for(var5 = var2; var5 < this.m; ++var5) {
|
var10000 = this.QR[var5];
|
var10000[var2] /= var3;
|
}
|
|
int var10002 = (int) this.QR[var2][var2]++;
|
|
for(var5 = var2 + 1; var5 < this.n; ++var5) {
|
double var6 = 0.0;
|
|
int var8;
|
for(var8 = var2; var8 < this.m; ++var8) {
|
var6 += this.QR[var8][var2] * this.QR[var8][var5];
|
}
|
|
var6 = -var6 / this.QR[var2][var2];
|
|
for(var8 = var2; var8 < this.m; ++var8) {
|
var10000 = this.QR[var8];
|
var10000[var5] += var6 * this.QR[var8][var2];
|
}
|
}
|
}
|
|
this.Rdiag[var2] = -var3;
|
}
|
|
}
|
|
public boolean isFullRank() {
|
for(int var1 = 0; var1 < this.n; ++var1) {
|
if (this.Rdiag[var1] == 0.0) {
|
return false;
|
}
|
}
|
|
return true;
|
}
|
|
public Matrix getH() {
|
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.QR[var3][var4];
|
} else {
|
var2[var3][var4] = 0.0;
|
}
|
}
|
}
|
|
return var1;
|
}
|
|
public Matrix getR() {
|
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.QR[var3][var4];
|
} else if (var3 == var4) {
|
var2[var3][var4] = this.Rdiag[var3];
|
} else {
|
var2[var3][var4] = 0.0;
|
}
|
}
|
}
|
|
return var1;
|
}
|
|
public Matrix getQ() {
|
Matrix var1 = new Matrix(this.m, this.n);
|
double[][] var2 = var1.getArray();
|
|
for(int var3 = this.n - 1; var3 >= 0; --var3) {
|
int var4;
|
for(var4 = 0; var4 < this.m; ++var4) {
|
var2[var4][var3] = 0.0;
|
}
|
|
var2[var3][var3] = 1.0;
|
|
for(var4 = var3; var4 < this.n; ++var4) {
|
if (this.QR[var3][var3] != 0.0) {
|
double var5 = 0.0;
|
|
int var7;
|
for(var7 = var3; var7 < this.m; ++var7) {
|
var5 += this.QR[var7][var3] * var2[var7][var4];
|
}
|
|
var5 = -var5 / this.QR[var3][var3];
|
|
for(var7 = var3; var7 < this.m; ++var7) {
|
var2[var7][var4] += var5 * this.QR[var7][var3];
|
}
|
}
|
}
|
}
|
|
return var1;
|
}
|
|
public Matrix solve(Matrix var1) {
|
if (var1.getRowDimension() != this.m) {
|
throw new IllegalArgumentException("Matrix row dimensions must agree.");
|
} else if (!this.isFullRank()) {
|
throw new RuntimeException("Matrix is rank deficient.");
|
} else {
|
int var2 = var1.getColumnDimension();
|
double[][] var3 = var1.getArrayCopy();
|
|
int var4;
|
int var5;
|
for(var4 = 0; var4 < this.n; ++var4) {
|
for(var5 = 0; var5 < var2; ++var5) {
|
double var6 = 0.0;
|
|
int var8;
|
for(var8 = var4; var8 < this.m; ++var8) {
|
var6 += this.QR[var8][var4] * var3[var8][var5];
|
}
|
|
var6 = -var6 / this.QR[var4][var4];
|
|
for(var8 = var4; var8 < this.m; ++var8) {
|
var3[var8][var5] += var6 * this.QR[var8][var4];
|
}
|
}
|
}
|
|
for(var4 = this.n - 1; var4 >= 0; --var4) {
|
for(var5 = 0; var5 < var2; ++var5) {
|
var3[var4][var5] /= this.Rdiag[var4];
|
}
|
|
for(var5 = 0; var5 < var4; ++var5) {
|
for(int var9 = 0; var9 < var2; ++var9) {
|
var3[var5][var9] -= var3[var4][var9] * this.QR[var5][var4];
|
}
|
}
|
}
|
|
return (new Matrix(var3, this.n, var2)).getMatrix(0, this.n - 1, 0, var2 - 1);
|
}
|
}
|
}
|