C语言实现矩阵的加减乘除求逆运算
#include
#include
#definecol 3
#definerow 3
class matrix//类的定义
{
private:
double m[col][row];//矩阵设置为私有的,
public:
matrix(){}//无参数的构造函数
matrix(doublea[col][row]);//有参数的构造函数
matrix Add(matrix&b);//加法运算声明
matrix Sub(matrix&b);//减法运算声明
matrix Mul(matrix&b);//乘法运算声明
matrix Div(matrix&b);//除法运算声明
matrix Inverse();//求逆运算声明
~matrix();//析构函数声明
void display();//显示函数声明
};
matrix::matrix(doublea[col][row])//构造函数的定义
{
int i,j;
for(i=0;i
for(j=0;j
m[i][j]=a[i][j];
}
matrix matrix::Add(matrix&b)//加法运算
{
int i,j;
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i
for(j=0;j
c->m[i][j]=m[i][j]+b.m[i][j];
return(*c);
}
matrix matrix::Sub(matrix&b)//减法运算
{
int i,j;
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i
for(j=0;j
c->m[i][j]=m[i][j]-b.m[i][j];
return *c;
}
matrix matrix::Mul(matrix&b)//乘法运算
{
int i,j,k;
double sum=0;
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i
{
for(j=0;j
{
for(k=0;k
sum+=m[i][k]*(b.m[k][j]);
c->m[i][j]=sum;
sum=0;
}
}
return(*c);
}
matrix matrix::Div(matrix&b)//除法运算
{
//除法直接求解,参见主函数
matrix c;
return(c);
}
matrix matrix::Inverse()//求逆运算
{int i,j,k,M=col,N=2*col;
double b[col][col*2];
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i
for(j=0;j
b[i][j]=m[i][j];
for(i=0;i
for(j=M;j
{
if(i==(j-M))
b[i][j]=1;
else
b[i][j]=0;
}
/***************下面进行求逆运算*********/
for(i=0;i
{
if(b[i][i]==0)
{
for(k=i;k
{
if(b[k][i]!=0)
{for(intj=0;j
{
double temp;
temp=b[i][j];
b[i][j]=b[k][j];
b[k][j]=temp;
}
break;
}
}
if(k==M)
{
printf("该矩阵不可逆!\n");
exit(0);
}
}
for(j=N-1;j>=i;j--)
b[i][j]/=b[i][i];
for(k=0;k
{
if(k!=i)
{
double temp=b[k][i];
for(j=0;j
b[k][j]-=temp*b[i][j];
}
}
}
/**********************导出结果******************/
for(i=0;i
for(j=3;j
c->m[i][j-3]=b[i][j];
return (*c);
}
matrix::~matrix()
{}
void matrix::display()
{
int i,j;
for(i=0;i
{
for(j=0;j
printf("%f",m[i][j]);
printf("\n");
}
}
void main()
{
double a[3][3]={{1,0,1},{0,1,1},{0,3,1}};
double b[3][3]={{0,0,1},{1,0,1},{0,1,0}};
matrix ma(a),mb(b),mc;
int flag;
printf("----------------------------------------------------\n请选择要进行的操作:\n1、打印\t2、加法");
printf("\t3、减法\n4、乘法\t5、除法\t6、求逆\n7、退出\n");
printf("-----------------------------------------------------\n");
scanf("%d",&flag);
while((flag==1)||(flag==2)||(flag==3)||(flag==4)||(flag==5)||(flag==6)||(flag==7))
{
if(flag==1)
{
printf("矩阵a 为:\n");
ma.display();
printf("矩阵b 为:\n");
mb.display();
}
if(flag==2)//矩阵加法运算
{
printf("矩阵加法运算结果:\n");
mc=ma.Add(mb);
mc.display();
}
else if(flag==3)//矩阵减法运算
{
printf("矩阵减法运算结果:\n");
mc=ma.Sub(mb);
mc.display();
}
else if(flag==4)//矩阵乘法运算
{
printf("矩阵乘法运算结果:\n");
mc=ma.Mul(mb);
mc.display();
}
else if(flag==5)//矩阵除法运算
{
printf("矩阵除法运算结果:\n");
printf("矩阵的除法分成两类:\n1、A\\B=inverse(A)*B\n2、
B/A=B*inverse(A)\n");
printf("采用第1类, 则a\\b的结果为:\n");
mc=ma.Inverse();
mc=mc.Mul(mb);
mc.display();
printf("采用第2类, 则a/b的结果为:\n");
mc=mb.Inverse();
mc=ma.Mul(mc);
mc.display();
}
else if (flag==6)//矩阵求逆运算
{
printf("矩阵a 求逆运算结果为:\n");
mc=ma.Inverse();
mc.display();
printf("矩阵b 求逆运算结果为:\n");
mc=mb.Inverse();
mc.display();
}
else {exit(0);}
printf("----------------------------------------------------\n请选择要进行的操作:\n1、打印\t2、加法");
printf("\t3、减法\n4、乘法\t5、除法\t6、求逆\n7、退出\n");
printf("-----------------------------------------------------\n");
scanf("%d",&flag);
}
}