c语言有矩阵求逆的函数吗 C语言求矩阵的逆

c语言编写一个子函数求矩阵的逆矩阵

#include stdlib.h

创新互联是专业的高碑店网站建设公司,高碑店接单;提供成都网站制作、成都做网站、外贸营销网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行高碑店网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

#include math.h

#include stdio.h

int brinv(double a[], int n)

{ int *is,*js,i,j,k,l,u,v;

double d,p;

is=malloc(n*sizeof(int));

js=malloc(n*sizeof(int));

for (k=0; k=n-1; k++)

{ d=0.0;

for (i=k; i=n-1; i++)

for (j=k; j=n-1; j++)

{ l=i*n+j; p=fabs(a[l]);

if (pd) { 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=n-1; j++)

{ u=k*n+j; v=is[k]*n+j;

p=a[u]; a[u]=a[v]; a[v]=p;

}

if (js[k]!=k)

for (i=0; i=n-1; i++)

{ u=i*n+k; v=i*n+js[k];

p=a[u]; a[u]=a[v]; a[v]=p;

}

l=k*n+k;

a[l]=1.0/a[l];

for (j=0; j=n-1; j++)

if (j!=k)

{ u=k*n+j; a[u]=a[u]*a[l];}

for (i=0; i=n-1; i++)

if (i!=k)

for (j=0; j=n-1; j++)

if (j!=k)

{ u=i*n+j;

a[u]=a[u]-a[i*n+k]*a[k*n+j];

}

for (i=0; i=n-1; i++)

if (i!=k)

{ u=i*n+k; a[u]=-a[u]*a[l];}

}

for (k=n-1; k=0; k--)

{ if (js[k]!=k)

for (j=0; j=n-1; j++)

{ u=k*n+j; v=js[k]*n+j;

p=a[u]; a[u]=a[v]; a[v]=p;

}

if (is[k]!=k)

for (i=0; i=n-1; i++)

{ u=i*n+k; v=i*n+is[k];

p=a[u]; a[u]=a[v]; a[v]=p;

}

}

free(is); free(js);

return(1);

}

void brmul(double a[], double b[],int m,int n,int k,double c[])

{ int i,j,l,u;

for (i=0; i=m-1; i++)

for (j=0; j=k-1; j++)

{ u=i*k+j; c[u]=0.0;

for (l=0; l=n-1; l++)

c[u]=c[u]+a[i*n+l]*b[l*k+j];

}

return;

}

int main()

{ int i,j;

static double a[4][4]={ {0.2368,0.2471,0.2568,1.2671},

{1.1161,0.1254,0.1397,0.1490},

{0.1582,1.1675,0.1768,0.1871},

{0.1968,0.2071,1.2168,0.2271}};

static double b[4][4],c[4][4];

for (i=0; i=3; i++)

for (j=0; j=3; j++)

b[i][j]=a[i][j];

i=brinv(a,4);

if (i!=0)

{ printf("MAT A IS:\n");

for (i=0; i=3; i++)

{ for (j=0; j=3; j++)

printf("%13.7e ",b[i][j]);

printf("\n");

}

printf("\n");

printf("MAT A- IS:\n");

for (i=0; i=3; i++)

{ for (j=0; j=3; j++)

printf("%13.7e ",a[i][j]);

printf("\n");

}

printf("\n");

printf("MAT AA- IS:\n");

brmul(b,a,4,4,4,c);

for (i=0; i=3; i++)

{ for (j=0; j=3; j++)

printf("%13.7e ",c[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("原矩阵为:\n");

for (i=0;iM;i++)

{

for (j=0;jM;j++)

printf("%5.2f",MAT1[j]);

printf("\n");

}

/********************************************/

/*对MAT1矩阵进行扩展,MAT1矩阵添加单位阵,由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矩阵进行变换,使得前半部分矩阵成为单位阵,则 */

/*后半部分矩阵即为所求矩阵逆阵 */

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");

}

/*********************************************/

/*输出所求的逆阵*/

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为你所要的矩阵阶数*/

#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("%5d",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!=0 b[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; i  m; i++)

for (j = 0; j  n; j++)

{

for (k = 0; k  m * n; k++)

B[k] = A[k];

{

for (x = 0; x  n; x++)

B[i * n + x] = 0;

for (y = 0; y  m; y++)

B[m * y + j] = 0;

B[i * n + j] = 1;

SP[i * n + j] = Surplus(B, m, n);

AB[i * n + j] = X * SP[i * n + j];

}

}

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; i  n; i++)

for (j = 0; j  m; j++)

B[i * m + j] = A[j * n + i];

}

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; i  m; i++)

for (j = 0; j  n; j++)

if ((i + j) % 2)

temp1 *= A[i * n + j];

else

temp *= A[i * n + j];

X = temp - temp1;

}

else

{

for (k = 0; k  n; k++)

{

for (i = 0, j = k; i  m, j  n; i++, j++)

temp *= A[i * n + j];

if (m - i)

{

for (p = m - i, r = m - 1; p  0; p--, r--)

temp *= A[r * n + p - 1];

}

s += temp;

temp = 1;

}

for (k = n - 1; k = 0; k--)

{

for (i = 0, j = k; i  m, j = 0; i++, j--)

temp1 *= A[i * n + j];

if (m - i)

{

for (p = m - 1, r = i; r  m; p--, r++)

temp1 *= A[r * n + p];

}

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 (num  10)

{

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("请输入矩阵维数:\n");

scanf("%d",num);

arr=(double *)malloc(sizeof(double)*num*num);

result=(double *)malloc(sizeof(double)*num*num);

printf("请输入%d*%d矩阵:\n", num, num);

for (i = 0; i  num; i++)

{

for (j = 0; j  num; j++)

{

scanf("%lf", arr[i * num + j]);

}

}

flag = matrix_inv(arr, num, result);

if(flag==0)

{

printf("逆矩阵为:\n");

for (i = 0; i  num * num; i++)

{

printf("%lf\t ", *(result + i));

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语言 求矩阵的逆

//源程序如下#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("%4d",matrix[i][j]);

}

printf("\n");

}

martx(p,style);

printf("\n");

printf("Exit=e Continue=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("%4d",tramform[i][j]);

}

printf("\n");

}

}

}

}

//运行结果//希望对你有帮助


本文名称:c语言有矩阵求逆的函数吗 C语言求矩阵的逆
链接分享:http://pwwzsj.com/article/hjcdji.html