public double[,] Inverse()
{
if (!FullRank)
throw new InvalidOperationException("Matrix is rank deficient.");
// Copy right hand side
int m = qr.GetLength(0);
int n = qr.GetLength(1);
var X = new double[m,m];
// Compute Y = transpose(Q)
for (int k = n - 1; k >= 0; k--)
{
for (int i = 0; i < m; i++)
X[k, i] = 0.0;
X[k, k] = 1.0;
for (int j = k; j < n; j++)
{
if (qr[k, k] != 0)
{
double s = 0.0;
for (int i = k; i < m; i++)
s += qr[i, k]*X[j, i];
s = -s/qr[k, k];
for (int i = k; i < m; i++)
X[j, i] += s*qr[i, k];
}
}
}
// Solve R*X = Y;
for (int k = n - 1; k >= 0; k--)
{
for (int j = 0; j < m; j++)
X[k, j] /= Rdiag[k];
for (int i = 0; i < k; i++)
for (int j = 0; j < m; j++)
X[i, j] -= X[k, j]*qr[i, k];
}
return X;
}
}