c语言有没有求逆函数 c语言求逆矩阵的思路

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语言中的反函数怎么计算?

例如要使用cos的反函数arccos,C语言里有acos()函数,在头文件math.h里。

1、C语言中,数学函数是函数的一种。指专门进行数学运算的函数,一般都在math.h头文件下。如果该标准库内存在某个函数的反函数,直接调用该反函数即可计算。

2、数学函数列表:

1)int abs(int i); 求整数的绝对值。

2)long labs(long n); 求长整型数的绝对值。

3)double fabs(double x); 求实数的绝对值。

4)double floor(double x); 求不大于x的最大整数,它相当于数学函数[x]。

扩展资料:

语言组成:基本构成。

数据类型:C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。

常量与变量:常量其值不可改变,符号常量名通常用大写。

变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。

数组:如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,中括号内的索引值是从0算起的。

参考资料来源:百度百科-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("%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://cdiso.cn/article/doppheg.html

其他资讯