C堆内矩阵实现

封装了一矩阵,后续加上常用矩阵操作及加上现代控制原理的状态空间方程一些运算操作。
矩阵结构图如下:

代码如下:

/*
 ============================================================================
 Name        : 矩阵实现
 Author      : Swair Fang
 Version     : 1.1
 Copyright   : by Swair Fang
 Description : 堆内矩阵实现, Ansi-style
 功能:
	1.矩阵初始化,行列为m*n
	2.删除矩阵
	3.矩阵相加
	4.矩阵取反
	5.矩阵减法
	6.矩阵点乘
	7.矩阵乘法
	8.矩阵除法
	9.打印
 ============================================================================
 */
#ifndef _Matrix_H
#define _Matrix_H

#include 
#include 
#include 

typedef double ElementType;

//构建矩阵节点
typedef struct Mnode
{
	ElementType Element;
	struct Mnode *Right;
	struct Mnode *Down;
} *Position;
//构建矩阵
typedef struct Matrix
{
	Position **Px;
	int m;
	int n;
} *Mx;

//随机数
double MRand()
{
	return (double)rand()/1000;
}
//1.矩阵初始化,行列为m*n
Mx MxInit(int m,int n)
{
	Mx M=(Mx)malloc(sizeof(struct Matrix));
	M->m=m;
	M->n=n;
	M->Px=(Position**)malloc(m*sizeof(Position*)); //开了一个"指针矩阵"空间
	int t=0;
	for(t=0;tPx[t]=(Position*)malloc(n*sizeof(Position));


	Position P=(Position)malloc(sizeof(struct Mnode));
	P->Right=NULL;
	P->Down=NULL;
	Position Pbf=P;
	Position Tmp=NULL;
	int i=0;      //矩阵第一行
	int j;
	for(j=0;jElement=MRand();
		Tmp->Right=NULL;
		Tmp->Down=NULL;
		M->Px[i][j]=Tmp;
		P->Right=Tmp;
		P=P->Right;
	}
	for(i=1;iElement=MRand();
			Tmp->Right=NULL;
			Tmp->Down=NULL;
			M->Px[i][j]=Tmp;
			M->Px[i-1][j]->Down=Tmp;
			P->Right=Tmp;
			P=P->Right;
		}
	}
	free(Pbf);
	return M;
}
//2.删除矩阵
void MxDel(Mx M)
{
	if(M==NULL)
	{
		printf("Matrix is not accordencd\n");
		exit(1);
	}
	else
	{
		Position P=M->Px[0][0];
		Position PbfDown;
		Position Tmp;
		while(P!=NULL)
		{
			PbfDown=P->Down;
			while(P!=NULL)
			{
				Tmp=P;
				P=P->Right;
				free(Tmp);
			}
			P=PbfDown;
		}
		printf("\n");
	}
}
//3.矩阵相加
Mx MxAdd(Mx A,Mx B)
{
	if(A->m!=B->m||A->n!=B->n)
	{
		printf("Matrix is not accordencd\n");
		exit(1);
	}
	else
	{
		Mx C=MxInit(A->m,A->n);
		Position PC=C->Px[0][0];
		Position PA=A->Px[0][0];
		Position PB=B->Px[0][0];
		Position PbfA,PbfB,PbfC;
		while(PC!=NULL)
		{
			PbfA=PA;
			PbfB=PB;
			PbfC=PC;
			while(PC!=NULL)
			{
				PC->Element=PA->Element+PB->Element;  //这句是元素执行减法,其他是遍历功能
				PA=PA->Right;
				PB=PB->Right;
				PC=PC->Right;
			}
			PA=PbfA->Down;
			PB=PbfB->Down;
			PC=PbfC->Down;
		}
		return C;
	}
}
//4.矩阵取反
void MxNeg(Mx M)
{
	if(M==NULL)
	{
		printf("Matrix is not accordencd\n");
		exit(1);
	}
	else
	{
		Position P=M->Px[0][0];
		Position Pbf;
		while(P!=NULL)
		{
			Pbf=P;
			while(P!=NULL)
			{
				P->Element=-P->Element;
				P=P->Right;
			}
			P=Pbf->Down;
		}
		printf("\n");
	}
}
//5.矩阵减法
Mx MxSub(Mx A,Mx B)
{
	if(A->m!=B->m||A->n!=B->n)
	{
		printf("Matrix is not accordencd\n");
		exit(1);
	}
	else
	{
		Mx C=MxInit(A->m,A->n);
		Position PC=C->Px[0][0];
		Position PA=A->Px[0][0];
		Position PB=B->Px[0][0];
		Position PbfA,PbfB,PbfC;
		while(PC!=NULL)
		{
			PbfA=PA;
			PbfB=PB;
			PbfC=PC;
			while(PC!=NULL)
			{
				PC->Element=PA->Element-PB->Element;  //这句是元素执行减法,其他是遍历功能
				PA=PA->Right;
				PB=PB->Right;
				PC=PC->Right;
			}
			PA=PbfA->Down;
			PB=PbfB->Down;
			PC=PbfC->Down;
		}
		return C;
	}
}
//6.矩阵点乘
Mx MxdotMul(Mx A,Mx B)
{
	if(A->m!=B->m||A->n!=B->n)
	{
		printf("Matrix is not accordencd\n");
		exit(1);
	}
	else
	{
		Mx C=MxInit(A->m,A->n);
		Position PC=C->Px[0][0];
		Position PA=A->Px[0][0];
		Position PB=B->Px[0][0];
		Position PbfA,PbfB,PbfC;
		while(PC!=NULL)
		{
			PbfA=PA;
			PbfB=PB;
			PbfC=PC;
			while(PC!=NULL)
			{
				PC->Element=PA->Element*PB->Element; //这句是元素执行乘法,其他是遍历功能
				PA=PA->Right;
				PB=PB->Right;
				PC=PC->Right;
			}
			PA=PbfA->Down;
			PB=PbfB->Down;
			PC=PbfC->Down;
		}
		return C;
	}
}
//7.矩阵乘法
Mx MxMul(Mx A,Mx B)
{
	if(A->n!=B->m)
	{
		printf("Matrix can not be Multiplied\n");
		exit(1);
	}
	else
	{
		Mx C=MxInit(A->m,B->n);
		int i,j,k;
		for(i=0;im;i++)
			for(j=0;jn;j++)
			{
				C->Px[i][j]->Element=0;
				for(k=0;kn;k++)
				{
					C->Px[i][j]->Element+=(A->Px[i][k]->Element)*(B->Px[k][j]->Element);
				}
			}
		return C;
	}
}
//8.矩阵除法
Mx MxDiv(Mx A,Mx B)
{
	if(A->m!=B->m||A->n!=B->n)
	{
		printf("Matrix is not accordencd\n");
		exit(1);
	}
	else
	{
		Mx C=MxInit(A->m,A->n);
		Position PC=C->Px[0][0];
		Position PA=A->Px[0][0];
		Position PB=B->Px[0][0];
		Position PbfA,PbfB,PbfC;
		while(PC!=NULL)
		{
			PbfA=PA;
			PbfB=PB;
			PbfC=PC;
			while(PC!=NULL)
			{
				PC->Element=PA->Element/PB->Element;  //这句是元素执行减法,其他是遍历功能
				PA=PA->Right;
				PB=PB->Right;
				PC=PC->Right;
			}
			PA=PbfA->Down;
			PB=PbfB->Down;
			PC=PbfC->Down;
		}
		return C;
	}
}
//9.打印
void PrintMatrix(Mx M)
{
	if(M==NULL)
		printf("矩阵为空\n");
	else
	{
		Position P=M->Px[0][0];
		Position Pbf;
		while(P!=NULL)
		{
			Pbf=P;
			while(P!=NULL)
			{
				char *cp=(char*)P;
				printf("0x%x: %10f   ",cp,P->Element);
				P=P->Right;
			}
			printf("\n");
			P=Pbf->Down;
		}
		printf("\n");
	}
}
#endif/*_Matrix_H*/

int main(void)
{
	printf("===============初始化矩阵===============\n");
	printf("M1,M2,M3\n");
	Mx M1=MxInit(3,2);
	Mx M2=MxInit(3,2);
	Mx M3=MxAdd(M1,M2);
	PrintMatrix(M1);
	PrintMatrix(M2);
	PrintMatrix(M3);
	printf("取反-M3\n");
	MxNeg(M3);
	PrintMatrix(M3);
	printf("点乘M4=M3*M1\n");
	Mx M4=MxdotMul(M3,M1);
	PrintMatrix(M4);
	printf("减法M5=M4-M1\n");
	Mx M5=MxSub(M4,M1);
	PrintMatrix(M5);
	printf("除法M6=M5/M4\n");
	Mx M6=MxDiv(M5,M4);
	PrintMatrix(M6);

	printf("A,B\n");
	Mx A=MxInit(3,2);
	Mx B=MxInit(2,3);
	PrintMatrix(A);
	PrintMatrix(B);
	printf("乘法C=AxB\n");
	Mx C=MxMul(A,B);
	PrintMatrix(C);

	MxDel(M1);
	MxDel(M2);
	MxDel(M3);
	MxDel(M4);
	MxDel(M5);
	MxDel(M6);
	MxDel(A);
	MxDel(B);
	MxDel(C);
	exit(0);
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值