matrixqiuni.txt
来自「矩阵求逆的程序,希望大家可以用到,省去麻烦」· 文本 代码 · 共 99 行
TXT
99 行
double nie(a,n)
int n;
double a[];
{int i,j,k,m;
double w,g,*b;
b=malloc(n*sizeof(double));
for(k=0;k<=n-1;k++)
{w=a[0];
if(fabs(w)+1.0==1.0)
{free(b);printf("fail\n");return(-2);
}
m=n-k-1;
for(i=1;i<=n-1;i++)
{g=a[i*n];b[i]=g/w;
if(i<=m)b[i]=-b[i];
for(j=1;j<=i;j++)
a[(i-1)*n+j-1]=a[i*n+j]+g*b[j];
}
a[n*n-1]=1.0/w;
for(i=1;i<=n-1;i++)
a[(n-1)*n+i-1]=b[i];
}
for(i=0;i<=n-2;i++)
for(j=i+1;j<=n-1;j++)
a[i*n+j]=a[j*n+i];
free(b);
return(2);
}
*************************************************
void qiuni(double(*p)[2*n])
{
double c;
for(k=0;k<n-1;k++)
for(i=k+1;i<n;i++)
{
c=(*(*(p+i)+k))/(*(*(p+k)+k));
for(j=k;j<2*n;j++)
{
(*(*(p+i)+j))=(*(*(p+i)+j))-c*(*(*(p+k)+j));
}
}
for(k=n-1;k>=1;k--)
for(i=k-1;i>=0;i--)
{c=(*(*(p+i)+k))/(*(*(p+k)+k));
{for(j=2*n-1;j>=0;j--)
(*(*(p+i)+j))=(*(*(p+i)+j))-c*(*(*(p+k)+j));
}
}
for(i=0;i<n;i++)
for(j=0;j<2*n;j++)
{if(i==j)
c=*(*(p+i)+j);
if(j>=i)
*(*(p+i)+j)=*(*(p+i)+j)/c;
}
}
*************************************************
void inverse(double c[n][n])
{ int i,j,h,k;
double p;
double q[n][12];
for(i=0;i<n;i++)//构造高斯矩阵
for(j=0;j<n;j++)
q[i][j]=c[i][j];
for(i=0;i<n;i++)
for(j=n;j<12;j++)
{if(i+6==j)
q[i][j]=1;
else
q[i][j]=0;}
for(h=k=0;k<n-1;k++,h++)//消去对角线以下的数据
for(i=k+1;i<n;i++)
{if(q[i][h]==0)
continue;
p=q[k][h]/q[i][h];
for(j=0;j<12;j++)
{ q[i][j]*=p;
q[i][j]-=q[k][j];
}
}
for(h=k=n-1;k>0;k--,h--) // 消去对角线以上的数据
for(i=k-1;i>=0;i--)
{if(q[i][h]==0)
continue;
p=q[k][h]/q[i][h];
for(j=0;j<12;j++)
{q[i][j]*=p;
q[i][j]-=q[k][j];}}
for(i=0;i<n;i++)//将对角线上数据化为1
{ p=1.0/q[i][i];
for(j=0;j<12;j++)
q[i][j]*=p;}
for(i=0;i<n;i++) //提取逆矩阵
for(j=0;j<n;j++)
c[i][j]=q[i][j+6];
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?