public double[][] inverse(double[][] m) { return multiplyByConstant(transpose(cofactor(m)), 1.0 / determinant(m)); }
public double[][] inverse() { return inverse(A); }
public double determinant(double[][] M) { // System.out.println ("========"); // print (M); if (!isSquare(M)) throw new ArithmeticException("Trying to compute determinat on non-square matrix; aborted"); if (M.length == 1) { return M[0][0]; } if (M.length == 2) { return (M[0][0] * M[1][1]) - (M[0][1] * M[1][0]); } double sum = 0.0; for (int i = 0; i < M[0].length; i++) { sum += sign(i) * M[0][i] * determinant(subMatrix(M, 0, i)); } return sum; }
public double[][] cofactor(double[][] m) { double[][] t = new double[m.length][m[0].length]; for (int i = 0; i < m.length; i++) { for (int j = 0; j < m[i].length; j++) t[i][j] = sign(i) * sign(j) * determinant(subMatrix(m, i, j)); } return t; }
void precondition(FloatInterval[][] AA, double[] bb) { if (debug) System.out.println("Before preconditioning\n" + this); double[][] midPoint = new double[AA.length][AA[0].length]; for (int i = 0; i < midPoint.length; i++) for (int j = 0; j < midPoint[i].length; j++) midPoint[i][j] = (AA[i][j].min() + AA[i][j].max()) / 2; Matrix m = new Matrix(midPoint); double[][] inv = m.inverse(); FloatInterval[][] F = new FloatInterval[AA.length][A[0].length]; for (int i = 0; i < F.length; i++) for (int j = 0; j < F[0].length; j++) F[i][j] = new FloatInterval(AA[i][j].min(), AA[i][j].max()); FloatIntervalDomain[][] newA = Matrix.mult(F, inv); Matrix comp = new Matrix(inv); double[] newB = comp.mult(bb); A = new FloatInterval[newA.length][newA[0].length]; for (int i = 0; i < newA.length; i++) for (int j = 0; j < newA[i].length; j++) A[i][j] = new FloatInterval(newA[i][j].min(), newA[i][j].max()); b = newB; if (debug) System.out.println("After preconditioning\n" + this); }
public double[][] cofactor(double[][] m) { double[][] t = new double[m.length][m[0].length]; for (int i = 0; i < m.length; i++) { for (int j = 0; j < m[i].length; j++) t[i][j] = sign(i) * sign(j) * determinant(subMatrix(m, i, j)); } return t; }
void precondition(FloatInterval[][] AA, double[] bb) { if (debug) System.out.println("Before preconditioning\n" + this); double[][] midPoint = new double[AA.length][AA[0].length]; for (int i = 0; i < midPoint.length; i++) for (int j = 0; j < midPoint[i].length; j++) midPoint[i][j] = (AA[i][j].min() + AA[i][j].max()) / 2; Matrix m = new Matrix(midPoint); double[][] inv = m.inverse(); FloatInterval[][] F = new FloatInterval[AA.length][A[0].length]; for (int i = 0; i < F.length; i++) for (int j = 0; j < F[0].length; j++) F[i][j] = new FloatInterval(AA[i][j].min(), AA[i][j].max()); FloatIntervalDomain[][] newA = Matrix.mult(F, inv); Matrix comp = new Matrix(inv); double[] newB = comp.mult(bb); A = new FloatInterval[newA.length][newA[0].length]; for (int i = 0; i < newA.length; i++) for (int j = 0; j < newA[i].length; j++) A[i][j] = new FloatInterval(newA[i][j].min(), newA[i][j].max()); b = newB; if (debug) System.out.println("After preconditioning\n" + this); }
public double[][] inverse(double[][] m) { return multiplyByConstant(transpose(cofactor(m)), 1.0 / determinant(m)); }
public double determinant(double[][] M) { // System.out.println ("========"); // print (M); if (!isSquare(M)) throw new ArithmeticException("Trying to compute determinat on non-square matrix; aborted"); if (M.length == 1) { return M[0][0]; } if (M.length == 2) { return (M[0][0] * M[1][1]) - (M[0][1] * M[1][0]); } double sum = 0.0; for (int i = 0; i < M[0].length; i++) { sum += sign(i) * M[0][i] * determinant(subMatrix(M, 0, i)); } return sum; }
public double[][] inverse() { return inverse(A); }