您好,欢迎访问三七文档
根据代数里面的知识,可以使用伴随矩阵也可以使用初等行变换来解求解,但是这样如果矩阵的维数较大的时候,使用这种方法,矩阵的维数变大时,计算量急剧的变大,计算时间和使用内存也会按着指数急剧上升,这样的算法的生命力不行。使用以下这种算法的计算量和使用内存不会发生急剧的变化,特别是矩阵在维数大的时候。高斯-约旦法(全选主元)求逆的步骤如下:首先,对于k从0到n-1作如下几步:从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。m(k,k)=1/m(k,k)m(k,j)=m(k,j)*m(k,k),j=0,1,...,n-1;j!=km(i,j)=m(i,j)-m(i,k)*m(k,j),i,j=0,1,...,n-1;i,j!=km(i,k)=-m(i,k)*m(k,k),i=0,1,...,n-1;i!=k最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。#includestdio.h#includemalloc.h#includemath.h//数学函数voidmain(){intinv(double*p,intn);doublea[4][4]={{1,2,0,0},{2,5,0,0},{0,0,3,0},{0,0,0,1}},*ab;ab=a[0];intn=4,i=0,j;i=inv(ab,n);//调用矩阵求逆if(i!=0)//如果返回值不是0for(i=0;in;i++)//输出结果{putchar('n');for(j=0;jn;j++)printf(%f,a[i][j]);}}intinv(double*p,intn){voidswap(double*a,double*b);int*is,*js,i,j,k,l;for(i=0;in;i++){putchar('n');for(j=0;jn;j++)printf(%f,*(p+i*n+j));}puts(nnnn);doubletemp,fmax;is=(int*)malloc(n*sizeof(int));js=(int*)malloc(n*sizeof(int));for(k=0;kn;k++){fmax=0.0;for(i=k;in;i++)for(j=k;jn;j++){temp=fabs(*(p+i*n+j));//找最大值if(tempfmax){fmax=temp;is[k]=i;js[k]=j;}}if((fmax+1.0)==1.0){free(is);free(js);printf(noinv);return(0);}if((i=is[k])!=k)for(j=0;jn;j++)swap(p(k*n+j),p(i*n+j));//交换指针if((j=js[k])!=k)for(i=0;in;i++)swap(p(i*n+k),p(i*n+j));//交换指针p[k*n+k]=1.0/p[k*n+k];for(j=0;jn;j++)if(j!=k)p[k*n+j]*=p[k*n+k];for(i=0;in;i++)if(i!=k)for(j=0;jn;j++)if(j!=k)p[i*n+j]=p[i*n+j]-p[i*n+k]*p[k*n+j];for(i=0;in;i++)if(i!=k)p[i*n+k]*=-p[k*n+k];}for(k=n-1;k=0;k--){if((j=js[k])!=k)for(i=0;in;i++)swap((p+j*n+i),(p+k*n+i));if((i=is[k])!=k)for(j=0;jn;j++)swap((p+j*n+i),(p+j*n+k);}free(is);free(js);return1;}voidswap(double*a,double*b){doublec;c=*a;*a=*b;*b=c;}
本文标题:C语言实现求逆矩阵
链接地址:https://www.777doc.com/doc-4287150 .html