invMatrix method
Computes and returns the inverse of an invertible matrix mat
.
Implementation
List<List<double>> invMatrix(List<List<double>> mat) {
int m = mat.length;
int n = mat[0].length;
List<List<double>> A = cloneMatrix(mat);
List<double> Ai, Aj, Ii, Ij;
List<List<double>> I = createDiagMatrix(m, 1.0); // identity matrix
int i, j, k;
double x, kx;
for (j = 0; j < n; ++j) {
int i0 = -1;
double v0 = -1;
for (i = j; i != m; ++i) {
kx = (A[i][j]).abs();
if (kx > v0) {
i0 = i;
v0 = kx;
}
}
if (i0 == -1) throw "Matrix not invertible.";
Aj = A[i0];
A[i0] = A[j];
A[j] = Aj;
Ij = I[i0];
I[i0] = I[j];
I[j] = Ij;
x = Aj[j];
for (k = j; k != n; ++k) Aj[k] /= x;
for (k = n - 1; k != -1; --k) Ij[k] /= x;
for (i = m - 1; i != -1; --i) {
if (i != j) {
Ai = A[i];
Ii = I[i];
x = Ai[j];
for (k = j + 1; k != n; ++k) Ai[k] -= Aj[k] * x;
for (k = n - 1; k > 0; --k) {
Ii[k] -= Ij[k] * x;
--k;
Ii[k] -= Ij[k] * x;
} // for k
if (k == 0) Ii[0] -= Ij[0] * x;
} // if
} // for i
} // for j
return I;
}