各位帮忙看下这个求逆矩阵函数是用什么方法求的
之前的同学写的一个求逆矩阵的,看来看去看不出是哪种方法,各位帮忙看下是什么计算方法吧
//求逆矩阵
public int inv(ref MAT a)
{
int i, j, k;
int[] isM = new int[MAXN];
int[] js = new int[MAXN];
double t;
if (a.n != a.m)
return 0;
for (k = 0; k < a.n; k++)
{
for (t = 0, i = k; i < a.n; i++)
for (j = k; j < a.n; j++)
if (fabs(a.data[i, j]) > t)
{
isM[k] = i;
js[k] = j;
t = fabs(a.data[i, j]);
}
if (zero(t))
return 0;
if (isM[k] != k)
for (j = 0; j < a.n; j++)
{
t = a.data[k, j];
a.data[k, j] = a.data[isM[k], j];
a.data[isM[k], j] = t;
}
if (js[k] != k)
for (i = 0; i < a.n; i++)
{
t = a.data[i, k];
a.data[i, k] = a.data[i, js[k]];
a.data[i, js[k]] = t;
}
a.data[k, k] = 1 / a.data[k, k];
for (j = 0; j < a.n; j++)
if (j != k)
a.data[k, j] *= a.data[k, k];
for (i = 0; i < a.n; i++)
if (i != k)
for (j = 0; j < a.n; j++)
if (j != k)
a.data[i, j] -= a.data[i, k] * a.data[k, j];
for (i = 0; i < a.n; i++)
if (i != k)
a.data[i, k] *= -a.data[k, k];
}
for (k = a.n - 1; k >= 0; k--)
{
for (j = 0; j < a.n; j++)
if (js[k] != k)
{
t = a.data[k, j];
a.data[k, j] = a.data[js[k], j];
a.data[js[k], j] = t;
}
for (i = 0; i < a.n; i++)
if (isM[k] != k)
{
t = a.data[i, k];
a.data[i, k] = a.data[i, isM[k]];
a.data[i, isM[k]] = t;
}
}
return 1;
}
[解决办法]
初等变换法。A和单位矩阵同时进行初等行(或列)变换,当A变成单位矩阵的时候,单位矩阵就变成了A的逆矩阵
[解决办法]
if (zero(t)) return 0;
[解决办法]
1. 代码并不完整,写的让人比较难看懂(没看到单位矩阵),又没有注释。
2. 楼主可以参考求逆矩阵以及两矩阵相乘的算法实现 (使用Gauss-Jordan消去法求n阶实矩阵的逆矩阵,有详细的注解和使用示例)
[解决办法]