本篇主要介绍以下矩阵函数功能
1.矩阵定义、初始化函数;
2.矩阵加法函数;
3.矩阵减法函数;
4.矩阵乘法函数;
5.求矩阵均值函数;
6.求一个矩阵的子阵函数;
7.矩阵输出函数;
8.主控测试函数;
为了让这篇博客友好一点,我们分开介绍各个部分
1.结构体
typedef struct{
double ** mat;
int row;
int col;
}Matrix;
2.给结构体Matrix分配空间
void InitialMatrix(Matrix *T, int row,int col)
{
int i;
T->mat=(double**)malloc(sizeof(double*)*row);
//这里要用->是指把T的地址传递给mat[][];而.是调用T中的mat
//给二维指针分配内存
for(i=0;i<row;i++)
{
T->mat[i]=(double*)malloc(sizeof(double)*col);
//给一维指针分配内存
}
T->col=col;
T->row=row;
}
//只分配空间不初始化;
3.结构体Matrix初始化为0
void InitialMatrixZero(Matrix *T,int row, int col)
{
for(int r=0;r<row;r++)
{
for(int c=0;c<col;c++)
{
T->mat[r][c]=0.0;
}
}
}
//初始化为0
4.结构体Matrix初始化为50以内随机正整数
void InitialMatrixRand(Matrix *T,int row, int col)
{
srand(time(NULL));
for(int r=0;r<row;r++)
{
for(int c=0;c<col;c++)
{
//why???如果把srand(time(NULL));放在这里,就会产生所有数字都相同的矩阵
T->mat[r][c]=rand()%50+1;
}
}
}
5.键盘输入矩阵
void InputMatrix(Matrix *T)
{
for(int r=0;r<T->row;r++)
{
for(int c=0;c<T->col;c++)
{
scanf("%lf",&T->mat[r][c]);
}
}
}
6.释放矩阵空间
void DestroyMatrix(Matrix *T)
{
for(int r=0;r<T->row;r++)
{
free(T->mat[r]);
}
free(T->mat);
}
//释放矩阵空间
7.矩阵输出
void PrintfMatrix(Matrix *T)
{
for(int r=0;r<T->row;r++)
{
for(int c=0;c<T->col;c++)
{
printf("%8.1lf",T->mat[r][c]);
}
printf("\n");
}
}
//矩阵输出
8.矩阵加
int AddMatrix(Matrix *A,Matrix *B,Matrix *C)
{
int i,j;
for (i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
C->mat[i][j]=A->mat[i][j]+B->mat[i][j];
}
}
return 0;
}
//矩阵相加
9.矩阵减
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C)
{
int i,j;
for (i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
C->mat[i][j]=A->mat[i][j]-B->mat[i][j];
}
}
return 0;
}
//矩阵相减
10.矩阵乘法
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C)
{
int i,j,k;
for(i=0;i<A->row;i++)
{
for(k=0;k<B->col;k++)
{
for(j=0;j<B->row;j++)
{
C->mat[i][k]=C->mat[i][k]+A->mat[i][j]*B->mat[j][k];
//调用函数的时候把C初始化为0
}
}
}
return 0;
}
11.矩阵元素均值
//for循环嵌套
for(q=0;q<i;q++)
{
for (w=0;w<j;w++)
{
sum=sum+a->mat[q][w];
}
}
printf("\n嘿嘿,矩阵中所有元素的均值为%.2lf\n",sum/(i*j));
12.求T1的子矩阵T2
printf("\n请问您想找一个几行几列的子阵呢?\n行数(行数小于%d哦):\n",i);
scanf("%d",&m);
printf("列数(列数小于%d哦):\n",j);
scanf("%d",&n);
int M[m],N[n];
printf("好啦,请问您想找到哪几行?(请输入%d个,行数≤%d哦)\n",m,i);
for(k=0;k<m;k++)
{
scanf("%d",&M[k]);
}
printf("哪几列呢?(请输入%d个,列数≤%d哦)\n",n,j);
for(k=0;k<n;k++)
{
scanf("%d",&N[k]);
}
InitialMatrix(b,m,n);
for(r1=0;r1<m;r1++)
{
for(c1=0;c1<n;c1++)
{
b->mat[r1][c1]=a->mat[M[r1]-1][N[c1]-1]; //这里要-1 !!!
}
}
printf("见证奇迹的时刻到啦:\n");
PrintfMatrix(b);
哦哦,还有一个打分割线的函数(daxing()),不必赘述
那么main()函数主要做的就是if语句的判断,不同情况下调用不同的函数就OK
综上,如果把这些函数放在一起。。。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
//停的时间长一点
//getchar()的话也能起到停顿效果,但是要停一会,间隔太短的话,不会对srand(time())产生影响
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);
//矩阵加
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C);
//矩阵减
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C);
//矩阵乘法
double MeanMatrix(Matrix *T);
//矩阵元素均值
int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol);
//求T1的子矩阵T2;
void daxing();
//打星
int main()
{
int q,w;
int r1,c1;
system("title 矩阵函数测试");//刚刚学会的,程序框的名称
printf("\n欢迎使用矩阵函数测试,请选择功能,输入对应的数字:\n\n");
daxing();
printf("1:输入一个矩阵,求矩阵均值;\n"
"2:产生一个随机数矩阵,求矩阵均值;\n"
"3:输入两个个矩阵,求矩阵和;\n"
"4:输入两个个矩阵,求矩阵差;\n"
"5:输入两个个矩阵,求矩阵积;\n"
"6:产生两个个随机数矩阵,求矩阵和;\n"
"7:产生两个个随机数矩阵,求矩阵差;\n"
"8:产生两个个随机数矩阵,求矩阵积;\n"
"9:求矩阵的子阵,如矩阵的2-4行,1-3列的子阵;\n"
"0:结束!\n");
daxing();
//表头(前期说明)
int n,i=0,j=0,k=0;
scanf("%d",&n);
//输入测试功能对应序号
Matrix *a,*b,*c;
Matrix A[1],B[1],C[1];
a=A;
b=B;
c=C;
if(n==0)
{return 0;}
//先把最简单的结束写完
else if(n==1)
{
double sum=0.0;
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
printf("请开始输入:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(a);
for(q=0;q<i;q++)
{
for (w=0;w<j;w++)
{
sum=sum+a->mat[q][w];
}
}
printf("\n嘿嘿,矩阵中所有元素的均值为%.2lf\n",sum/(i*j));
printf("快夸夸我~");
DestroyMatrix(a);
}
else if(n==2)
{
double sum=0.0;
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
printf("好啦,您啥也别管了。我给您创造个%d行*%d列的矩阵:\n",i,j);
InitialMatrixRand(a,i, j);
daxing();
PrintfMatrix(a);
for(q=0;q<i;q++)
{
for (w=0;w<j;w++)
{
sum=sum+a->mat[q][w];
}
}
daxing();
printf("\n嘿嘿,矩阵中所有元素的均值为%.2lf\n",sum/(i*j));
printf("快夸夸我~");
DestroyMatrix(a);
}
else if(n==3)
{
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
InitialMatrix(b,i,j);
InitialMatrix(c,i,j);
printf("请开始输入:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(a);
printf("第一个矩阵输入成功,接下来是第二个矩阵哦~\n");
printf("那就开始吧:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(b);
printf("第二个矩阵输入成功,接下来的计算交给我啦\n");
AddMatrix(a,b,c);
PrintfMatrix(c);
DestroyMatrix(a);
DestroyMatrix(b);
DestroyMatrix(c);
}
else if(n==4)
{
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
InitialMatrix(b,i,j);
InitialMatrix(c,i,j);
printf("请开始输入:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(a);
printf("第一个矩阵输入成功,接下来是第二个矩阵哦~\n");
printf("那就开始吧:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(b);
printf("第二个矩阵输入成功,接下来的计算交给我啦\n");
MinusMatrix(a,b,c);
PrintfMatrix(c);
DestroyMatrix(a);
DestroyMatrix(b);
DestroyMatrix(c);
}
else if(n==5)
{
printf("请输入第一个矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入第一个矩阵的列数:");
scanf("%d",&j);
printf("\n");
printf("只有前矩阵的列数=后矩阵的行数,才能进行乘法运算(⊙o⊙)\n所以只需要输入第二个矩阵的列数:");
scanf("%d",&k);
printf("\n");
InitialMatrix(a,i,j);
InitialMatrix(b,j,k);
InitialMatrix(c,i,k);
InitialMatrixZero(c,i,k);
printf("请开始输入:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(a);
printf("第一个矩阵输入成功,接下来是第二个矩阵哦~\n");
printf("那就开始吧:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",k,j);
InputMatrix(b);
printf("第二个矩阵输入成功,接下来的计算交给我啦\n");
MultiMatrix(a,b,c);
PrintfMatrix(c);
DestroyMatrix(a);
DestroyMatrix(b);
DestroyMatrix(c);
}
else if(n==6)
{
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
InitialMatrixRand(a,i,j);
//system("pause");
Sleep(1000);
InitialMatrix(b,i,j);
InitialMatrixRand(b,i,j);
InitialMatrix(c,i,j);
printf("好啦,您啥也别管了。我给您创造两个%d行*%d列的矩阵:\n",i,j);
PrintfMatrix(a);
daxing();
PrintfMatrix(b);
daxing();
AddMatrix(a,b,c);
printf("加起来为\n");
PrintfMatrix(c);
DestroyMatrix(a);
DestroyMatrix(b);
DestroyMatrix(c);
}
else if(n==7)
{
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
InitialMatrixRand(a,i,j);
system("pause");
InitialMatrix(b,i,j);
InitialMatrixRand(b,i,j);
InitialMatrix(c,i,j);
printf("好啦,我给您创造两个%d行*%d列的矩阵:\n",i,j);
PrintfMatrix(a);
daxing();
PrintfMatrix(b);
daxing();
MinusMatrix(a,b,c);
printf("前一个矩阵减去后一个矩阵为\n");
PrintfMatrix(c);
DestroyMatrix(a);
DestroyMatrix(b);
DestroyMatrix(c);
}
else if(n==8)
{
printf("请输入第一个矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入第一个矩阵的列数:");
scanf("%d",&j);
printf("\n");
printf("只有前矩阵的列数=后矩阵的行数,才能进行乘法运算(⊙o⊙)\n所以只需要输入第二个矩阵的列数:");
scanf("%d",&k);
printf("\n");
InitialMatrix(a,i,j);
InitialMatrix(b,j,k);
InitialMatrix(c,i,k);
printf("我来帮您产生两个矩阵\n");
InitialMatrixRand(a,i,j);
Sleep(1000);
InitialMatrixRand(b,j,k);
Sleep(1000);
InitialMatrixRand(c,i,k);
PrintfMatrix(a);
daxing();
PrintfMatrix(b);
daxing();
printf("最终结果为:\n");
PrintfMatrix(c);
}
else if(n==9)
{
int m,n;
int q;
int k;
printf("请输入矩阵的行数:");
scanf("%d",&i);
printf("\n");
printf("请输入矩阵的列数:");
scanf("%d",&j);
printf("\n");
InitialMatrix(a,i,j);
printf("您是想自己输入呢,还是随机给您产生呢?\n");
printf("自己输入请扣1\n随机产生请扣2\n");
scanf("%d",&q);
if(q==1)
{
printf("请开始输入:(用空格隔开,输入%d个以后按回车,一共需要输入%d行)\n",j,i);
InputMatrix(a);
}
else if(q==2)
{
InitialMatrixRand(a,i,j);
daxing();
PrintfMatrix(a);
}
else
{
DestroyMatrix(a);
}
printf("\n请问您想找一个几行几列的子阵呢?\n行数(行数小于%d哦):\n",i);
scanf("%d",&m);
printf("列数(列数小于%d哦):\n",j);
scanf("%d",&n);
int M[m],N[n];
printf("好啦,请问您想找到哪几行?(请输入%d个,行数≤%d哦)\n",m,i);
for(k=0;k<m;k++)
{
scanf("%d",&M[k]);
}
printf("哪几列呢?(请输入%d个,列数≤%d哦)\n",n,j);
for(k=0;k<n;k++)
{
scanf("%d",&N[k]);
}
InitialMatrix(b,m,n);
for(r1=0;r1<m;r1++)
{
for(c1=0;c1<n;c1++)
{
b->mat[r1][c1]=a->mat[M[r1]-1][N[c1]-1]; //这里要-1 !!!
}
}
printf("见证奇迹的时刻到啦:\n");
PrintfMatrix(b);
DestroyMatrix(a);
DestroyMatrix(b);
}
return 0;
}
void daxing()
{
for(int i=0;i<48;i++)
printf("*");
printf("\n");
}
//打星
void InitialMatrix(Matrix *T, int row,int col)
{
int i;
T->mat=(double**)malloc(sizeof(double*)*row);
//对一个二维指针分配内存
//这里要用->是指把T的地址传递给mat[][];而.是调用T中的mat
for(i=0;i<row;i++)
{
T->mat[i]=(double*)malloc(sizeof(double)*col);
//对一个一维指针分配内存
}
T->col=col;
T->row=row;
}
//只分配空间不初始化;
void InitialMatrixZero(Matrix *T,int row, int col)
{
for(int r=0;r<row;r++)
{
for(int c=0;c<col;c++)
{
T->mat[r][c]=0.0;
}
}
}
//初始化为0
void InitialMatrixRand(Matrix *T,int row, int col)
{
srand(time(NULL));
for(int r=0;r<row;r++)
{
for(int c=0;c<col;c++)
{
//why???如果把srand(time(NULL));放在这里,就会产生所有数字都相同的矩阵
T->mat[r][c]=rand()%50+1;
}
}
}
//初始化为50以内随机正整数
void InputMatrix(Matrix *T)
{
for(int r=0;r<T->row;r++)
{
for(int c=0;c<T->col;c++)
{
scanf("%lf",&T->mat[r][c]);
}
}
}
//键盘输入矩阵
void DestroyMatrix(Matrix *T)
{
for(int r=0;r<T->row;r++)
{
free(T->mat[r]);
}
free(T->mat);
}
//释放矩阵空间
void PrintfMatrix(Matrix *T)
{
for(int r=0;r<T->row;r++)
{
for(int c=0;c<T->col;c++)
{
printf("%8.1lf",T->mat[r][c]);
}
printf("\n");
}
}
//矩阵输出
int AddMatrix(Matrix *A,Matrix *B,Matrix *C)
{
int i,j;
for (i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
C->mat[i][j]=A->mat[i][j]+B->mat[i][j];
}
}
return 0;
}
//矩阵相加
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C)
{
int i,j;
for (i=0;i<A->row;i++)
{
for(j=0;j<A->col;j++)
{
C->mat[i][j]=A->mat[i][j]-B->mat[i][j];
}
}
return 0;
}
//矩阵相减
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C)
{
int i,j,k;
for(i=0;i<A->row;i++)
{
for(k=0;k<B->col;k++)
{
for(j=0;j<B->row;j++)
{
C->mat[i][k]=C->mat[i][k]+A->mat[i][j]*B->mat[j][k];
//调用函数的时候把C初始化为0
}
}
}
return 0;
}
//矩阵相乘