各位帮忙看下这个求逆矩阵函数是用什么方法求的

xiaoshisanlang1st 2012-02-07 07:09:02
之前的同学写的一个求逆矩阵的,看来看去看不出是哪种方法,各位帮忙看下是什么计算方法吧
//求逆矩阵
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;
}
...全文
303 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
面包大师 2012-02-08
  • 打赏
  • 举报
回复
不是,你说的那个是AE变换到E(A逆),是伴随矩阵法。A的逆矩阵=A的伴随矩阵/A的行列式。
xiaoshisanlang1st 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]

1. 代码并不完整,写的让人比较难看懂(没看到单位矩阵),又没有注释。
2. 楼主可以参考求逆矩阵以及两矩阵相乘的算法实现 (使用Gauss-Jordan消去法求n阶实矩阵的逆矩阵,有详细的注解和使用示例)
[/Quote]
代码应该完整了是从外面给它一个矩阵,就是那个MAT,就可以得出逆矩阵

补一个MAT的类
    //矩阵类
class MAT
{
public static int MAXN = 11;
//n*m
public int n, m;
//数据
public double[,] data = new double[MAXN, MAXN];
}
xiaoshisanlang1st 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 czh3642210 的回复:]

初等变换法。A和单位矩阵同时进行初等行(或列)变换,当A变成单位矩阵的时候,单位矩阵就变成了A的逆矩阵
[/Quote]
是那个 AE变换到E(A逆)那个吗?但肿么看肿么不像啊
alang512 2012-02-08
  • 打赏
  • 举报
回复

这种逆矩阵输出,其实就是 二维数组存储数据, 关键是仔细认真分析她的规律, 做出来后就感觉很简单,做不出来,就感觉很难,之前参加一家公司的 笔试,接着机试,就是这道题目。
pathuang68 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 czh3642210 的回复:]

C/C++ code
if (zero(t))
return 0;

尤其是这儿,查看a的行列式是否等于0,来判断矩阵a是否可逆--------这是初等变换法一大特性
[/Quote]

确切的说,这是判断矩阵是否可逆的充要条件,即:矩阵可逆 <-> 矩阵行列式非0。而非独初等变换法之特性。
pathuang68 2012-02-07
  • 打赏
  • 举报
回复
1. 代码并不完整,写的让人比较难看懂(没看到单位矩阵),又没有注释。
2. 楼主可以参考求逆矩阵以及两矩阵相乘的算法实现 (使用Gauss-Jordan消去法求n阶实矩阵的逆矩阵,有详细的注解和使用示例)
面包大师 2012-02-07
  • 打赏
  • 举报
回复
if (zero(t))
return 0;

尤其是这儿,查看a的行列式是否等于0,来判断矩阵a是否可逆--------这是初等变换法一大特性
面包大师 2012-02-07
  • 打赏
  • 举报
回复
初等变换法。A和单位矩阵同时进行初等行(或列)变换,当A变成单位矩阵的时候,单位矩阵就变成了A的逆矩阵

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧