📄 reversalop.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* 使用Gauss-Jordan消去法求n阶实矩阵的逆矩阵 */
int ReversalOp(double *matrixa, int rank)
{
int *is,*js,i,j,k,l,u,v;
double d,p;
is=(int*)malloc(rank*sizeof(int));
js=(int*)malloc(rank*sizeof(int));
for(k=0;k<=rank-1;k++)
{
//第一步,全选主元
//(从第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。)
d=0.0;
for (i=k; i<=rank-1; i++)
for (j=k; j<=rank-1; j++)
{
l=i*rank+j;
p=fabs(matrixa[l]);
if (p>d)
{
d=p;
is[k]=i;
js[k]=j;
}
}
if(d+1.0==1.0)
{
free(is);
free(js);
printf("err**not inv\n");
return(0);
}
if(is[k]!=k)
for(j=0;j<=rank-1;j++)
{
u=k*rank+j;
v=is[k]*rank+j;
p=matrixa[u];
matrixa[u]=matrixa[v];
matrixa[v]=p;
}
if(js[k]!=k)
for(i=0; i<=rank-1; i++)
{
u=i*rank+k;
v=i*rank+js[k];
p=matrixa[u];
matrixa[u]=matrixa[v];
matrixa[v]=p;
}
//机算逆矩阵
//第二步(m(k, k) = 1 / m(k, k))
l=k*rank+k;
matrixa[l]=1.0/matrixa[l];
//第三步(m(k, j) = m(k, j) * m(k, k),j = 0, 1, ..., n-1;j != k )
for(j=0;j<=rank-1;j++)
if (j!=k)
{
u=k*rank+j;
matrixa[u]=matrixa[u]*matrixa[l];
}
//第四步(m(i, j) = m(i, j) - m(i, k) * m(k, j),i, j = 0, 1, ..., n-1;i, j != k )
for(i=0;i<=rank-1;i++)
if(i!=k)
for(j=0;j<=rank-1;j++)
if(j!=k)
{
u=i*rank+j;
matrixa[u]=matrixa[u]-matrixa[i*rank+k]*matrixa[k*rank+j];
}
//第五步(m(i, k) = -m(i, k) * m(k, k),i = 0, 1, ..., n-1;i != k )
for(i=0;i<=rank-1;i++)
if(i!=k)
{
u=i*rank+k;
matrixa[u]=-matrixa[u]*matrixa[l];
}
}
/*最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,先交换的
行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。*/
for(k=rank-1;k>=0;k--)
{
if (js[k]!=k)
for(j=0;j<=rank-1;j++)
{
u=k*rank+j;
v=js[k]*rank+j;
p=matrixa[u];
matrixa[u]=matrixa[v];
matrixa[v]=p;
}
if(is[k]!=k)
for(i=0;i<=rank-1;i++)
{
u=i*rank+k;
v=i*rank+is[k];
p=matrixa[u];
matrixa[u]=matrixa[v];
matrixa[v]=p;
}
}
free(is);
free(js);
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -