内容:
1.编写矩阵定义、初始化函数;
2.编写矩阵加法函数;
3.编写矩阵减法函数;
4.编写矩阵乘法函数;
5.编写求矩阵均值函数;
6.编写求一个矩阵的子阵函数;
7.编写矩阵输出函数;
8.编写主控函数;
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct{
double **mat;
int row;
int col;
}Matrix;//定义结构体
void InitialMatrix(Matrix *T,int row,int col);//定义矩阵并且申请动态内存
void initialMatrixZero(Matrix *T,int row,int col);//初始化为0
void InitialMatrixRand(Matrix *T,int row,int col);//初始化为50以内的随机正整数
void InputMatrix(Matrix *T);//键盘输入矩阵
void DestroyMatrix(Matrix *T);//释放矩阵空间
void PrintfMatrix(Matrix *T);//矩阵输出
int AddMatrix(Matrix *A,Matrix *B,Matrix *C);//矩阵加(A=B+C)
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C);//矩阵减(A=B-C)
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C);//矩阵乘(A=BC)
double MeanMatrix(Matrix *T);//矩阵元素均值
int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol);//求T1的子矩阵T2
int main()//主函数
{
int i,row,col,BeginRow,EndRow,BeginCol,EndCol,go=1;
double mean;
Matrix T,T1,T2,A,B,C;
printf(" 矩阵函数测试,请选择功能,输入对应的数字:\n");
printf("*************************************************\n");
printf("1:输入一个矩阵,求矩阵均值;\n");
printf("2:产生一个随机数矩阵,求矩阵均值;\n");
printf("3:输入两个矩阵,求矩阵和;\n");
printf("4:输入两个矩阵,求矩阵差;\n");
printf("5:输入两个矩阵,求矩阵积;\n");
printf("6:产生两个随机数矩阵,求矩阵和;\n");
printf("7:产生两个随机数矩阵,求矩阵差;\n");
printf("8:产生两个随机数矩阵,求矩阵积;\n");
printf("9:求矩阵的子阵,如矩阵的2~4行,1~3列的子阵;\n");
printf("0:结束程序\n");
do{
printf("请输入数字:");
scanf("%d",&i);
switch(i)
{
case 1:
InputMatrix(&T);
printf("矩阵元素平均值为\n");
mean=MeanMatrix(&T);
printf("%lf",mean);
printf("\n") ;
break;
case 2:
printf("请输入矩阵的行数与列数,格式为“行 列:”");
scanf("%d %d",&row,&col);
InitialMatrixRand(&T,row,col);
printf("您获得了一个随机数矩阵\n");
PrintfMatrix(&T);
mean=MeanMatrix(&T);
printf("矩阵元素平均值为\n");
printf("%lf",mean);
printf("\n") ;
break;
case 3:
printf("输入第一个矩阵\n");
InputMatrix(&B);
printf("输入第二个矩阵\n");
InputMatrix(&C);
initialMatrixZero(&A,B.row,B.col);
AddMatrix(&A,&B,&C);
printf("它们的和是\n");
PrintfMatrix(&A);
break;
case 4:
printf("输入第一个矩阵\n");
InputMatrix(&B);
printf("输入第二个矩阵\n");
InputMatrix(&C);
initialMatrixZero(&A,B.row,B.col);
MinusMatrix(&A,&B,&C);
printf("它们的差是\n");
PrintfMatrix(&A);
break;
case 5:
printf("注意:前后输入的矩阵要保证行列数满足:第一个mxn,第二个nxm\n");
printf("输入第一个矩阵\n");
InputMatrix(&B);
printf("输入第二个矩阵\n");
InputMatrix(&C);
initialMatrixZero(&A,B.row,B.col);
MultiMatrix(&A,&B,&C);
printf("它们的积是\n");
PrintfMatrix(&A);
break;
case 6:
printf("请输入矩阵的行数与列数,格式为“行 列:”");
scanf("%d %d",&row,&col);
InitialMatrixRand(&B,row,col);
InitialMatrixRand(&C,row,col);
printf("您获得了两个个随机数矩阵\n");
PrintfMatrix(&B);
printf("和\n");
PrintfMatrix(&C);
initialMatrixZero(&A,row,col);
AddMatrix(&A,&B,&C);
printf("它们的和是\n");
PrintfMatrix(&A);
break;
case 7:
printf("请输入矩阵的行数与列数,格式为“行 列:”");
scanf("%d %d",&row,&col);
InitialMatrixRand(&B,row,col);
InitialMatrixRand(&C,row,col);
printf("您获得了两个个随机数矩阵\n");
PrintfMatrix(&B);
printf("和\n");
PrintfMatrix(&C);
initialMatrixZero(&A,row,col);
MinusMatrix(&A,&B,&C);
printf("它们的差是\n");
PrintfMatrix(&A);
break;
case 8:
printf("请输入矩阵的行数与列数,格式为“行 列:”");
scanf("%d %d",&row,&col);
InitialMatrixRand(&B,row,col);
InitialMatrixRand(&C,row,col);
printf("您获得了两个个随机数矩阵\n");
PrintfMatrix(&B);
printf("和\n");
PrintfMatrix(&C);
initialMatrixZero(&A,row,col);
MultiMatrix(&A,&B,&C);
printf("它们的积是\n");
PrintfMatrix(&A);
break;
case 9:
printf("请输入矩阵的行数与列数,格式为“行 列:”");
scanf("%d %d",&row,&col);
InitialMatrixRand(&T1,row,col);
printf("您获得了一个随机数矩阵\n");
PrintfMatrix(&T1);
printf("请输入子阵的起始行,结束行,起始列,结束列,用空格分隔:\n");
scanf("%d %d %d %d",&BeginRow,&EndRow,&BeginCol,&EndCol);
InitialMatrix(&T2,EndRow-BeginRow+1,EndCol-BeginRow+1);
SubMatrix(&T1,&T2,BeginRow,BeginCol,EndRow,EndCol);
printf("你获得了这个子式:\n");
PrintfMatrix(&T2);
break;
case 0:
printf("程序结束");
go=0;
}
}while(go);
return 0;
}
void InitialMatrix(Matrix *T,int row,int col)//定义矩阵并且申请动态内存
{
int i;
T->row=row;
T->col=col;
T->mat=(double**)malloc(row*sizeof(double*));
for(i=0;i<row;i++)
{
T->mat[i]=(double*)malloc(col*sizeof(double));
}
}
void initialMatrixZero(Matrix *T,int row,int col)//初始化为0
{
int i,j;
InitialMatrix(T,row,col);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
T->mat[i][j]=0;
}
}
}
void InitialMatrixRand(Matrix *T,int row,int col)//初始化为50以内的随机正整数
{
int i,j;
InitialMatrix(T,row,col);
srand(NULL);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
T->mat[i][j]=rand()%50+1;
}
}
}
void InputMatrix(Matrix *T)//键盘输入矩阵
{
int i,j,row,col;
printf("请输入矩阵的行数与列数,格式为“行 列:”");
scanf("%d %d",&row,&col);
InitialMatrix(T,row,col);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf("请输入第%d行,第%d列的数:",i+1,j+1);
scanf("%lf",&T->mat[i][j]);
}
}
}
void DestroyMatrix(Matrix *T)//释放矩阵空间
{
int i;
for(i=0;i<T->row;i++)
{
free(T->mat[i]);
}
free(T->mat);
}
void PrintfMatrix(Matrix *T)//矩阵输出
{
int i,j;
for(i=0;i<T->row;i++)
{
for(j=0;j<T->col;j++)
{
printf("%lf ",T->mat[i][j]);
}
printf("\n");
}
}
int AddMatrix(Matrix *A,Matrix *B,Matrix *C)//矩阵加(A=B+C)
{
int i,j;
for(i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
A->mat[i][j]=B->mat[i][j]+C->mat[i][j];
}
}
return 1;
}
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C)//矩阵减(A=B-C)
{
int i,j;
for(i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
A->mat[i][j]=B->mat[i][j]-C->mat[i][j];
}
}
return 1;
}
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C)//矩阵乘(A=BC)
{
int i,j,k;
double m;
for(i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
for(k=0;k<B->col;k++)
{
m=B->mat[i][k]*C->mat[k][j];
A->mat[i][j]+=m;
}
}
}
return 1;
}
double MeanMatrix(Matrix *T)//矩阵元素均值
{
int i,j;
double sum,mean;
sum=0;
for(i=0;i<T->row;i++)
{
for(j=0;j<T->col;j++)
{
sum+=T->mat[i][j];
}
}
mean=sum/(T->row*T->col);
return mean;
}
int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol)//求T1的子矩阵T2
{
int i,j;
int m=0,n=0;
for(i=BeginRow-1;i<EndRow;i++)
{
for(j=BeginCol-1;j<EndCol;j++)
{
T2->mat[m][n]=T1->mat[i][j];
n++;
}
m++;
}
return 1;
}