矩阵运算C语言实现.docx
《矩阵运算C语言实现.docx》由会员分享,可在线阅读,更多相关《矩阵运算C语言实现.docx(18页珍藏版)》请在冰豆网上搜索。
矩阵运算C语言实现
#include"stdafx.h"
#include
//结构体
typedefstruct{
double**mat;
introw;
intcol;
}Matrix;
voidInitialMatrix(Matrix*T,introw,intcol);//只分配空间不初始化;
voidInitialMatrixZero(Matrix*T,introw,intcol);//初始化为0
voidInitialMatrixRand(Matrix*T,introw,intcol);//初始化为50以内随机正整数
voidInputMatrix(Matrix*T);//键盘输入矩阵
voidDestroyMatrix(Matrix*T);//释放矩阵空间
voidPrintfMatrix(Matrix*T);//矩阵输出
intAddMatrix(Matrix*A,Matrix*B,Matrix*C);//矩阵加
intMinusMatrix(Matrix*A,Matrix*B,Matrix*C);//矩阵减
intMultiMatrix(Matrix*A,Matrix*B,Matrix*C);//矩阵乘法
doubleMeanMatrix(Matrix*T);//矩阵元素均值
intSubMatrix(Matrix*T1,Matrix*T2,intBeginRow,intBeginCol,intEndRow,intEndCol);//求T1的子矩阵T2;
测试程序参考界面如下所示:
矩阵函数测试,请选择功能,输入对应的数字:
***************************************************
1:
输入一个矩阵,求矩阵均值;
2:
产生一个随机数矩阵,求矩阵均值;
3:
输入两个个矩阵,求矩阵和;
4:
输入两个个矩阵,求矩阵差;
5:
输入两个个矩阵,求矩阵积;
6:
产生两个个随机数矩阵,求矩阵和;
7:
产生两个个随机数矩阵,求矩阵差;
8:
产生两个个随机数矩阵,求矩阵积;
9:
求矩阵的子阵,如矩阵的2-4行,1-3列的子阵;
0:
结束!
#include
#include
//结构体
typedefstruct{
double**mat;
introw;
intcol;
}Matrix;
//函数声明
voidInitialMatrix(Matrix*T,introw,intcol);
voidInitialMatrixZero(Matrix*T,introw,intcol);
voidInitialMatrixRand(Matrix*T,introw,intcol);
voidInputMatrix(Matrix*T);
voidDestroyMatrix(Matrix*T);//释放矩阵空间
voidPrintfMatrix(Matrix*T);//矩阵输出
intAddMatrix(Matrix*A,Matrix*B,Matrix*C);//矩阵加
intMinusMatrix(Matrix*A,Matrix*B,Matrix*C);//矩阵减
intMultiMatrix(Matrix*A,Matrix*B,Matrix*C);//矩阵乘法
doubleMeanMatrix(Matrix*T);//矩阵元素均值
//intSubMatrix(Matrix*T1,Matrix*T2,intBeginRow,intBeginCol,intEndRow,intEndCol);//求T1的子矩阵T2;
voidNMatrix(void);//求逆矩阵
//主函数
intmain()
{
intinputevent;
//inti,j;
introw,col;
MatrixT;
MatrixA;
MatrixB;
MatrixC;
printf("矩阵函数测试,请选择功能,输入对应的数字:
\n");
printf("***************************************************\n\n");
printf("1:
输入一个矩阵,求矩阵均值;\n");
printf("2:
产生一个随机数矩阵,求矩阵均值;\n");
printf("3:
输入两个个矩阵,求矩阵和;\n");
printf("4:
输入两个个矩阵,求矩阵差;\n");
printf("5:
输入两个矩阵,求矩阵积;");
printf("\n6:
产生两个随机数矩阵,求矩阵和;\n");
printf("7:
产生两个随机数矩阵,求矩阵差;\n");
printf("8:
产生两个随机数矩阵,求矩阵积;\n");
printf("9:
求矩阵的子阵,如矩阵的2-4行D,1-3列的子阵;\n");
printf("10:
输入一个方阵,求其逆矩阵\n");
printf("0:
结束!
\n");
printf("\n\n选择:
");
scanf("%d",&inputevent);
while(inputevent!
=0)
{
if(inputevent==1){
printf("您要输入的矩阵的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&T,row,col);
InitialMatrixZero(&T,T.row,T.col);
InputMatrix(&T);
printf("\n矩阵的平均值为:
\n%lf\n\n",MeanMatrix(&T));
DestroyMatrix(&T);
}
if(inputevent==2){
printf("输入您要产生的矩阵的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&T,row,col);
InitialMatrixRand(&T,row,col);
MeanMatrix(&T);
PrintfMatrix(&T);
printf("\n矩阵的平均值为:
\n%lf\n\n",MeanMatrix(&T));
DestroyMatrix(&T);
}
if(inputevent==3){
printf("您要输入的矩阵A的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&A,row,col);
InitialMatrixZero(&A,A.row,A.col);
InputMatrix(&A);
printf("您要输入的矩阵B的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&B,row,col);
InitialMatrixZero(&B,B.row,B.col);
InputMatrix(&B);
InitialMatrix(&C,B.row,B.col);
InitialMatrixZero(&C,C.row,C.col);
if(AddMatrix(&A,&B,&C)==1){
printf("\n\n矩阵的和为:
A*B\n\n");
PrintfMatrix(&C);
}
elseprintf("\n\n无法计算!
\n\n");
DestroyMatrix(&A);
DestroyMatrix(&B);
DestroyMatrix(&C);
}
if(inputevent==4){
printf("您要输入的矩阵A的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&A,row,col);
InitialMatrixZero(&A,A.row,A.col);
InputMatrix(&A);
printf("您要输入的矩阵B的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&B,row,col);
InitialMatrixZero(&B,B.row,B.col);
InputMatrix(&B);
InitialMatrix(&C,B.row,B.col);
InitialMatrixZero(&C,C.row,C.col);
if(MinusMatrix(&A,&B,&C)==1){
printf("\n矩阵的差为:
A-B=\n\n");
PrintfMatrix(&C);
}
elseprintf("\n\n无法计算!
\n\n");
DestroyMatrix(&A);
DestroyMatrix(&B);
DestroyMatrix(&C);
}
if(inputevent==5){
intable;
printf("您要输入的矩阵A的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&A,row,col);
InitialMatrixZero(&A,A.row,A.col);
InputMatrix(&A);
printf("您要输入的矩阵B的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&B,row,col);
InitialMatrixZero(&B,B.row,B.col);
InputMatrix(&B);
InitialMatrix(&C,A.row,B.col);
InitialMatrixZero(&C,C.row,C.col);
able=MultiMatrix(&A,&B,&C);
if(able==1){
printf("\n积为:
A*B\n\n");
PrintfMatrix(&C);
}
elseprintf("\n\n无法计算!
\n\n");
DestroyMatrix(&A);
DestroyMatrix(&B);
DestroyMatrix(&C);
}
if(inputevent==6){
printf("您要产生的矩阵A的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&A,row,col);
InitialMatrixRand(&A,row,col);
printf("A为:
\n\n");
PrintfMatrix(&A);
printf("您要产生的矩阵B的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&B,row,col);
InitialMatrixRand(&B,row,col);
printf("B为:
\n\n");
PrintfMatrix(&B);
InitialMatrix(&C,A.row,A.col);
InitialMatrixZero(&C,C.row,C.col);
if(AddMatrix(&A,&B,&C)==1){
printf("\n矩阵的和为:
A+B=\n\n");
PrintfMatrix(&C);
}
elseprintf("\n\n无法计算!
\n\n");
DestroyMatrix(&A);
DestroyMatrix(&B);
DestroyMatrix(&C);
}
if(inputevent==7){
printf("您要产生的矩阵A的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&A,row,col);
InitialMatrixRand(&A,row,col);
printf("您要产生的矩阵B的行数和列数e.g:
5,6:
");
scanf("%d,%d",&row,&col);
InitialMatrix(&B,row,col);
InitialMatrixRand(&B,row,col);
InitialMatrix(&C,A.row,A.col);
InitialMatrixZero(&C,C.row,C.col);
if(MinusMatrix(&A,&B,&C)==1){
printf("\n矩阵的差为:
A-B=\n\n");
PrintfMatrix(&C);
}
elseprintf("\n\n无法计算!
\n\n");
DestroyMatrix(&A);
DestroyMatrix(&B);
DestroyMatrix(&C);
}
if(inputevent==8){
printf("您要产生的矩阵A的行数和列数e.g:
5,6:
\n");
scanf("%d,%d",&row,&col);
InitialMatrix(&A,row,col);
InitialMatrixRand(&A,row,col);
printf("A为:
\n\n");
PrintfMatrix(&A);
printf("您要产生的矩阵B的行数和列数e.g:
5,6:
\n");
scanf("%d,%d",&row,&col);
InitialMatrix(&B,row,col);
InitialMatrixRand(&B,row,col);
printf("B为:
\n\n");
PrintfMatrix(&B);
InitialMatrix(&C,A.row,A.col);
InitialMatrixZero(&C,C.row,C.col);
if(MultiMatrix(&A,&B,&C)==1){
printf("\n积为:
A*B=\n\n");
PrintfMatrix(&C);;
}
elseprintf("\n\n无法计算;\n\n");
DestroyMatrix(&A);
DestroyMatrix(&B);
DestroyMatrix(&C);
}
if(inputevent==9)printf("对不起,该函数尚在完善中\n\n");
if(inputevent==10)NMatrix();
if(inputevent==0)
break;
printf("矩阵函数测试,请选择功能,输入对应的数字:
\n");
printf("***************************************************\n\n");
printf("1:
输入一个矩阵,求矩阵均值;\n");
printf("2:
产生一个随机数矩阵,求矩阵均值;\n");
printf("3:
输入两个个矩阵,求矩阵和;\n");
printf("4:
输入两个个矩阵,求矩阵差;\n");
printf("5:
输入两个矩阵,求矩阵积;");
printf("\n6:
产生两个随机数矩阵,求矩阵和;\n");
printf("7:
产生两个随机数矩阵,求矩阵差;\n");
printf("8:
产生两个随机数矩阵,求矩阵积;\n");
printf("9:
求矩阵的子阵,如矩阵的2-4行D,1-3列的子阵;\n");
printf("10:
输入一个方阵,求其逆矩阵\n");
printf("0:
结束!
\n");
printf("\n\n选择:
");
scanf("%d",&inputevent);
}
return0;
}
//其他函数
voidInitialMatrix(Matrix*T,introw,intcol)
{
//printf("分配内存中......\n");
inti;
intsucc=1;
//T=(Matrix*)malloc(sizeof(Matrix));
T->row=row;
T->col=col;
T->mat=(double**)malloc(T->row*sizeof(double*));
if(T->mat==NULL){
succ=0;
}
else{
for(i=0;irow;i++){
T->mat[i]=(double*)malloc(T->col*sizeof(double));
if(T->mat[i]==NULL){
succ=0;
break;
}
}
//if(succ==1)
//printf("内存分配成功|;?
\n");
//elseprintf("内存分配失败;\n");
}
}
voidInitialMatrixZero(Matrix*T,introw,intcol){
//printf("矩阵初始化为零中......\n");
inti,j;
for(i=0;ifor(j=0;j
T->mat[i][j]=0;
//printf("矩阵初始化为零矩阵成功;\n");
}
voidInitialMatrixRand(Matrix*T,introw,intcol){
inti,j;
for(i=0;ifor(j=0;j
(*T).mat[i][j]=rand()%50;
}
voidInputMatrix(Matrix*T){
printf("输入矩阵:
\n");
inti,j;
for(i=0;i<(*T).row;i++)
for(j=0;j<(*T).col;j++)
scanf("%lf",&(*T).mat[i][j]);
}
voidDestroyMatrix(Matrix*T)
{
inti;
for(i=0;i<(*T).row;i++)
free((*T).mat[i]);
}
voidPrintfMatrix(Matrix*T)
{
inti,j;
for(i=0;i<(*T).row;i++)
{
for(j=0;j<(*T).col;j++)
printf("%lf",(*T).mat[i][j]);
printf("\n");
}
}
intAddMatrix(Matrix*A,Matrix*B,Matrix*C)
{
inti,j;
if((*A).row==(*B).row&&(*A).col==(*B).col)
{
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];
for(i=0;i<(*A).row;i++)
for(j=0;j<(*A).col;j++)
return1;
}
else{
printf("这两个矩阵不能相加!
\n");
return0;
}
}
intMinusMatrix(Matrix*A,Matrix*B,Matrix*C)
{
inti,j;
if((*A).row==(*B).row&&(*A).col==(*B).col)
{
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];
return1;
}
else
printf("这两个矩阵不能相减!
\n");
return0;
}
intMultiMatrix(Matrix*A,Matrix*B,Matrix*C)
{
inti=0,j=0;
intk=0;
if((*A).col==(*B).row)
{
for(i=0;i<(*A).row;i++){
for(j=0;j<(*B).col;j++)
for(k=0;k<(A->col);k++)
(*C).mat[i][j]+=(*A).mat[i][k]*(*B).mat[k][j];
}
return1;
}
else
printf("这两个矩阵不能相乘!
\n");
return0
|
|