用指针、数组、结构体实现矩阵部分功能

本篇主要介绍以下矩阵函数功能

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;
}
//矩阵相乘 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值