逆矩阵c语言函数 求逆矩阵c语言

C语言 求矩阵的逆//源程序如下#includestdio.h
#includeconio.h
#includestring.h
#includeiostream.h
#includestdlib.h
#includemath.h
#define max 100void inputstyle(int *);//输入函数
void input(int **,int);//输入函数
long danx(int **,int);
int sgnx(int);
void martx(int **,int);int main(void)
{
int style=0,i=0;
int matrix[max][max],*p[max];
for(i=0;imax;i)*(p i)=matrix[i];//*(p i)是指针,指向第i个字符串
char exit1=' ';
while(exit1!='E' exit1!='e'){printf("求n阶矩阵的逆\n");inputstyle(style);
input(p,style);
printf("原矩阵为:\n");
for(i=0;istyle;i){
for(int j=0;jstyle;j){
printf("M",matrix[i][j]);
}
printf("\n");
}
martx(p,style);
printf("\n");
printf("Exit=eContinue=Press any key\n");
cinexit1;
fflush(stdin);
printf("\n\n"); }
return(0);
} void input(int **p,int n){
for(int i=0;in;i){
for(int j=0;jn;j){
printf("输入矩阵(%d行,%d列)元素:",j 1,i 1);
*(*(p j) i)=0;
scanf("%d",*(p j) i);
fflush(stdin);
}
}
}void inputstyle(int *style){
do{
printf("输入矩阵n*n阶数n(0n%d):",max);
fflush(stdin);
scanf("%d",style);
fflush(stdin);
}while(*style=0*stylemax);
}long danx(int **p,int n){
int i=0,j1=0,k1=0,j2=0,k2=0;
long sum=0;
int operate[max][max],*po[max];
for(i=0;imax;i)*(po i)=operate[i]; if(n==1)return *(*(p 0) 0);
else{
for(i=0;in;i){
for(j1=1,j2=0;j1n;j1,j2){
k1=-1;k2=-1;
while(k2n-1){
k1;
k2;
if(k1==i)k1;
*(*(po j2) k2)=*(*(p j1) k1);
}
}
/*for(int i1=0;i1n-1;i1){
for(int h1=0;h1n-1;h1){
printf("(%d,%d)%d ",i1,h1,*(*(po h1) i1));
}
printf("\n");
}*/
sum =*(*(p 0) i) * sgnx(1 i 1) * danx(po,n-1);
}
return sum;
}
}int sgnx(int i){
if(i%2==0)return(1);
else return(-1);
}void martx(int **p,int n){
int i=0,j=0,j1=0,k1=0,j2=0,k2=0,num=0;
int tramform[max][max];
int operate[max][max],*po[max];
for(i=0;imax;i)*(po i)=operate[i];
num=danx(p,n);
if(num==0)printf("矩阵不可逆\n");
else{
if(n==1)printf("矩阵的逆为: 1/%d\n",num);
else{
printf("矩阵的逆为: 系数 1/%d *\n",num);
for(i=0;in;i){
for(j=0;jn;j){
j1=-1;j2=-1;
while(j2n-1){
j1;j2;
if(j1==j)j1;k1=-1;k2=-1;
while(k2n-1){
k1;
k2;
if(k1==i)k1;
*(*(po j2) k2)=*(*(p j1) k1);
}
}
tramform[i][j]=sgnx(2 i j) * danx(po,n-1);
}
}
for(i=0;in;i){
for(j=0;jn;j){
printf("M",tramform[i][j]);
}
printf("\n");
}
}
}
}
//运行结果//希望对你有帮助
用c语言求解逆矩阵(c语言)!# include "stdio.h"
# define M 3
void main ( )
{
float MAT[M][2*M];
float MAT1[M][M];
float t;
int i,j,k,l;
/***********************************************/
/*对矩阵进行初始化*/
for(i=0;iM;i)
for(j=0;j2*M;j)
MAT1[j]='\0';
for(i=0;iM;i)
for(j=0;j2*M;j)
MAT[j]='\0';
/*对MAT1矩阵赋初值 */
for(i=0;iM;i)
for (j=0;jM;j)
scanf("%f",MAT1[j]);
/*打印目标矩阵?*/
printf("原矩阵为逆矩阵c语言函数:\n");
for (i=0;iM;i)
{
for (j=0;jM;j)
printf("%5.2f",MAT1[j]);
printf("\n");
}
/********************************************/
/*对MAT1矩阵进行扩展,MAT1矩阵添加单位阵逆矩阵c语言函数,由M*M变成2M*2M矩阵 */
for(i=0;iM;i)
for(j=0;j2*M;j)
if (jM) MAT[j]=MAT1[j];
else if (j==M i) MAT[j]=1;
else MAT[j]=0;
/*对M矩阵进行变换逆矩阵c语言函数,使得前半部分矩阵成为单位阵,则 */
/*后半部分矩阵即为所求矩阵逆阵 */
for(i=0;iM;i)
{
/*对第i行进行归一化*/
for (j=0;j2*M;j)
for(k=i 1;kM;k)
MAT[j]=MAT[j] MAT[k][j];
t=MAT;
for(j=i;j2*M;j)
MAT[j]=MAT[j]/t;
/*对矩阵进行行变换,使得第i 列只有一个元素不为零,且为1*/
for(k=0;kM;k)
if(k!=i)
{
t=MAT[k];
for (l=i;l2*M;l)
MAT[k][l]=MAT[k][l]-MAT[l]*t;
}
}
/*将后半部分矩阵即所求矩阵逆阵存入MAT2矩阵 。*/
for(i=0;iM;i)
{
for(j=0;jM;j)
MAT1[j]=MAT[j M];
printf("\n");
}
/*********************************************/
/*输出所求逆矩阵c语言函数的逆阵*/
printf("逆阵为:\n");
for(i=0;iM;i)
{
for(j=0;jM;j)
printf("%5.2f",MAT1[j]);
printf("\n");
}
}
[楼 主] From:局域网 | Posted:2007-10-08 00:11|
情有独中
级别: 论坛版主
精华: 0
发帖: 8
威望: 8 点
金钱: 36 RMB
在线时间:0(小时)
注册时间:2007-10-08
最后登陆:2007-10-07
--------------------------------------------------------------------------------
#define N 5/*[注]:修改6为逆矩阵c语言函数你所要的矩阵阶数*/
#include "stdio.h"
#include "conio.h"
/*js()函数用于计算行列式,通过递归算法实现*/
int js(s,n)
int s[][N],n;
{int z,j,k,r,total=0;
int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/
if(n2) {for(z=0;zn;z)
{for(j=0;jn-1;j)
for(k=0;kn-1;k)
if(k=z) b[j][k]=s[j 1][k 1];
else b[j][k]=s[j 1][k];
if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/
else r=(-1)*s[0][z]*js(b,n-1);
total=total r;
}
}
else if(n==2) total=s[0][0]*s[1][1]-s[0][1]*s[1][0];
return total;
}
/*n_1()函数用于求原矩阵各元素对应的余子式,存放在数组b[N][N]中,定义为float型*/
void n_1(s,b,n)
int s[][N],n;
float b[][N];
{int z,j,k,l,m,g,a[N][N];
for(z=0;zn;z)
{l=z;
for(j=0;jn;j)
{ m=j;
for (k=0;kn-1;k)
for(g=0;gn-1;g)
{ if(g=mkl) a[k][g]=s[k][g 1];
else if(k=lgm) a[k][g]=s[k 1][g];
else if(k=lg=m) a[k][g]=s[k 1][g 1];
else a[k][g]=s[k][g];
}
b[z][j]=js(a,n-1);
}
}
}
main()
{int a[N][N];
float b[N][N];
int r,z,j;
float temp;
//clrscr();
printf("Input original data:\n");
for(z=0;zN;z)/*输入所需要的数据,为整型数据*/
for(j=0;jN;j)
scanf("%d",a[z][j]);
printf("\nPress Enter continue......");
getchar();
//gotoxy(1,1);
printf("The original matrix is:\n");
for(z=0;zN;z)/*打印原矩阵*/
{for(j=0;jN;j)
printf("]",a[z][j]);
printf("\n");
}
r=js(a,N);/*调用js()函数计算原矩阵的行列式值*/
printf("\nThe original matrix hanglieshi is:|A|==%d\n",r);
if (r==0) printf("Because |A|==0,the original matrix have no nijuzhen!"); /*判断条件:若|A|==0,则原矩阵无逆矩阵,反之则存在逆矩阵*/
else
{n_1(a,b,N);/*调用n_1()函数,得到原矩阵各元素对应的"余子式",存放在数组b[N][N]中*/
for(z=0;zN;z)/*求代数余子式,此时b[N][N]中存放的为原矩阵各元素对应的"代数余子式"*/
for(j=0;jN;j)
if((z j)%2!=0b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;zN;z)/*对b[N][N]转置,此时b[N][N]中存放的为原矩阵的伴随矩阵*/
for(j=z 2;jN;j)
{temp=b[z][j];
b[z][j]=b[j][z];
b[j][z]=temp;
}
printf("Because |A|!=0,the original matrix have nijuzhen!\n");
printf("The bansuijuzhen A* is:\n");
for(z=0;zN;z)/* 打印伴随矩阵A* */
{for(j=0;jN;j)
printf("%4.0f\t",b[z][j]);
printf("\n");
}
for(z=0;zN;z)/*求逆矩阵,此时b[N][N]中存放的是原矩阵的逆矩阵*/
for(j=0;jN;j)
b[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is:(A*)/|A|(|A|=%d)\n",r); /*打印逆矩阵*/
for(z=0;zN;z)
{for(j=0;jN;j)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}
C语言编程:编写一个函数求逆矩阵#include stdio.h
#include stdlib.h
#include malloc.h
void MatrixOpp(double *A, int m, int n, double* invmat);
void MatrixInver(double *A, int m, int n, double* invmat);
double Surplus(double A[], int m, int n);
int matrix_inv(double* p, int num, double* invmat);
void MatrixOpp(double A[], int m, int n, double* invmat)
{
int i, j, x, y, k;
double *SP = NULL, *AB = NULL, *B = NULL, X;
SP = (double *) malloc(m * n * sizeof(double));
AB = (double *) malloc(m * n * sizeof(double));
B = (double *) malloc(m * n * sizeof(double));
X = Surplus(A, m, n);
X = 1 / X;
for (i = 0; im; i)
for (j = 0; jn; j)
{
for (k = 0; km * n; k)
B[k] = A[k];
{
for (x = 0; xn; x)
B[i * nx] = 0;
for (y = 0; ym; y)
B[m * yj] = 0;
B[i * nj] = 1;
SP[i * nj] = Surplus(B, m, n);
AB[i * nj] = X * SP[i * nj];
}
}
MatrixInver(AB, m, n, invmat);
free(SP);
free(AB);
free(B);
}
void MatrixInver(double A[], int m, int n, double* invmat)
{
int i, j;
double *B = invmat;
for (i = 0; in; i)
for (j = 0; jm; j)
B[i * mj] = A[j * ni];
}
double Surplus(double A[], int m, int n)
{
int i, j, k, p, r;
double X, temp = 1, temp1 = 1, s = 0, s1 = 0;
if (n == 2)
{
for (i = 0; im; i)
for (j = 0; jn; j)
if ((ij) % 2)
temp1 *= A[i * nj];
else
temp *= A[i * nj];
X = temp - temp1;
}
else
{
for (k = 0; kn; k)
{
for (i = 0, j = k; im, jn; i, j)
temp *= A[i * nj];
if (m - i)
{
for (p = m - i, r = m - 1; p0; p--, r--)
temp *= A[r * np - 1];
}
s= temp;
temp = 1;
}
for (k = n - 1; k = 0; k--)
{
for (i = 0, j = k; im, j = 0; i, j--)
temp1 *= A[i * nj];
if (m - i)
{
for (p = m - 1, r = i; rm; p--, r)
temp1 *= A[r * np];
}
s1= temp1;
temp1 = 1;
}
X = s - s1;
}
return X;
}
int matrix_inv(double* p, int num, double* invmat)
{
if (p == NULL || invmat == NULL)
{
return 1;
}
if (num10)
{
return 2;
}
MatrixOpp(p, num, num, invmat);
return 0;
}
int main()
{
int i, j;
int num;
double *arr=NULL;
double *result=NULL;
int flag;
printf("请输入矩阵维数逆矩阵c语言函数:\n");
scanf("%d",num);
arr=(double *)malloc(sizeof(double)*num*num);
result=(double *)malloc(sizeof(double)*num*num);
printf("请输入%d*%d矩阵逆矩阵c语言函数:\n", num, num);
for (i = 0; inum; i)
{
for (j = 0; jnum; j)
{
scanf("%lf", arr[i * numj]);
}
}
flag = matrix_inv(arr, num, result);
if(flag==0)
{
printf("逆矩阵为:\n");
for (i = 0; inum * num; i)
{
printf("%lf\t ", *(resulti));
if (i % num == (num - 1))
printf("\n");
}
}
else if(flag==1)
{
printf("p/q为空\n");
}
else
{
printf("超过最大维数\n");
}
system("PAUSE");
free(arr);
free(result);
return 0;
}
【逆矩阵c语言函数 求逆矩阵c语言】逆矩阵c语言函数的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于求逆矩阵c语言、逆矩阵c语言函数的信息别忘了在本站进行查找喔 。

    推荐阅读