封装了一矩阵,后续加上常用矩阵操作及加上现代控制原理的状态空间方程一些运算操作。
矩阵结构图如下:
代码如下:
/*
============================================================================
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);
}
运行结果: