invMatrix method

List<List<double>> invMatrix (List<List<double>> mat)

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;
}