矩阵计算C语言源代码.docx
《矩阵计算C语言源代码.docx》由会员分享,可在线阅读,更多相关《矩阵计算C语言源代码.docx(19页珍藏版)》请在冰豆网上搜索。
![矩阵计算C语言源代码.docx](https://file1.bdocx.com/fileroot1/2023-1/28/6cf0899e-a2e5-4421-9307-f3c5eae6944a/6cf0899e-a2e5-4421-9307-f3c5eae6944a1.gif)
矩阵计算C语言源代码
//#include"matrix.h"
#defineEX_TRUE(0)
#defineEX_FALSE
(1)
#defineEX_MALLOC
(2)
typedefstructtagMatrix
{
unsignedcharucRow;
unsignedcharucCol;
unsignedshortusRev;
float*pfDataAdd;
}Matrix_s;
externintInputRowColInfo(unsignedchar*pucRow,unsignedchar*pucCol);
externintCreateMatrixMem(void*pvData);
externintInputMatrixData(void*pvData);
externintPrintMatrixData(void*pvData);
externintPrintInverseMatrixData(void*pvData);
externintShow_matrix(Matrix_s*pstMatrixA,Matrix_s*pstMatrixB);
//#include"operate_matrix.h"
#defineEX_MATRIX_INIT
(1)
#defineEX_MATRIX_UNINIT(0)
typedefenum
{
EX_INPUT_MATRIX=1,
EX_ADD_MATRIX,
EX_SUBTRACT_MATRIX,
EX_MULTIPLY_MATRIX,
EX_INVERSE_MATRIX,
EX_QUIT_MATRIX,
EX_BOTTOM_MATRIX
}Matrix_opcode_en;
externintOperateMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrix);
externintShowMatrixMenu();
externintCheckMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB);
externintAddMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB,Matrix_s*pstMatrixC);
externintSubtractMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB,Matrix_s*pstMatrixC);
externintMultiplyMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB,Matrix_s*pstMatrixC);
externintCreateResultMatrix(unsignedcharucRow,unsignedcharucCol,void*pvData);
externintInverseMatrix(floata[],intn);
/*GuanlinLuoID:
10529749*/
#include
#include
#include
#include
#include"matrix.h"/*Wehavealreadydonethisheader.*/
#include"operate_matrix.h"/*Wehavealreadydonethisheader.*/
charg_cFlag=EX_MATRIX_UNINIT;
intmain()
{
intiInputOpCode;
intiRet=EX_FALSE;
Matrix_sstMatrixA,stMatrixB;
memset(&stMatrixA,0,sizeof(stMatrixA));
memset(&stMatrixB,0,sizeof(stMatrixB));
while
(1)
{
/*showmenu*/
(void)ShowMatrixMenu();
/*operetematrix*/
scanf("%d",&iInputOpCode);
iRet=OperateMatrix(iInputOpCode,&stMatrixA,&stMatrixB);
if(EX_TRUE==iRet)
{
if(EX_QUIT_MATRIX==iInputOpCode)
{
break;
}
}
}
if(NULL!
=stMatrixA.pfDataAdd)
{
free(stMatrixA.pfDataAdd);
}
if(NULL!
=stMatrixB.pfDataAdd)
{
free(stMatrixB.pfDataAdd);
}
returnEX_TRUE;
}
intShowMatrixMenu()/*choicesforusers.*/
{
printf("1-EntermatricesA&B\r\n");
printf("2-Addmatrices\r\n");
printf("3-Subtractmatrices\r\n");
printf("4-Multiplymatrices\r\n");
printf("5-InverseofA\r\n");
printf("6-Quitprogram\r\n");
printf("Option:
");
returnEX_TRUE;
}
intOperateMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB)
{
intiRet=EX_FALSE;
Matrix_sstMatrixC;
float*pfTmpBuf=NULL;
memset(&stMatrixC,0,sizeof(Matrix_s));
switch(iOpCode)
{
caseEX_INPUT_MATRIX:
iRet=Show_matrix(pstMatrixA,pstMatrixB);
if(EX_FALSE==iRet)
{
printf("errinputmatrixinfo!
\n");
returniRet;
}
else
{
/*atfirst,weneedinputmatrixdata*/
g_cFlag=EX_MATRIX_INIT;
}
break;
caseEX_ADD_MATRIX:
/*Additionpart.*/
iRet=AddMatrix(EX_ADD_MATRIX,pstMatrixA,pstMatrixB,&stMatrixC);
if(EX_TRUE!
=iRet)/*Forchecking.*/
{
printf("errmultiplymatrixoperation!
\n");
if(EX_MALLOC==iRet)
{
;
}
else
{
free(stMatrixC.pfDataAdd);
}
returniRet;
}
printf("\r\nA+B=:
\r\n");
iRet=PrintMatrixData(&stMatrixC);
if(iRet==EX_FALSE)
{
printf("errprintMatrixresult!
\r\n");
free(stMatrixC.pfDataAdd);
returniRet;
}
free(stMatrixC.pfDataAdd);
break;
caseEX_SUBTRACT_MATRIX:
/*Subtracttwomatrices*/
iRet=SubtractMatrix(EX_SUBTRACT_MATRIX,pstMatrixA,pstMatrixB,&stMatrixC);
if(EX_TRUE!
=iRet)/*Forchecking.*/
{
printf("errsubtractmatrixoperation!
\r\n");
if(EX_MALLOC==iRet)
{
;
}
else
{
free(stMatrixC.pfDataAdd);
}
returniRet;
}
printf("\r\nA-B=:
\r\n");
iRet=PrintMatrixData(&stMatrixC);
if(iRet==EX_FALSE)
{
printf("errprintMatrixresult!
\r\n");
free(stMatrixC.pfDataAdd);
returniRet;
}
free(stMatrixC.pfDataAdd);
break;
caseEX_MULTIPLY_MATRIX:
/*multiplicationpart.*/
iRet=MultiplyMatrix(EX_MULTIPLY_MATRIX,pstMatrixA,pstMatrixB,&stMatrixC);
if(EX_TRUE!
=iRet)/*Forchecking.*/
{
printf("\r\nerrmultiplymatrixoperation!
\r\n");
if(EX_MALLOC==iRet)
{
;
}
else
{
free(stMatrixC.pfDataAdd);
}
returniRet;
}
printf("\r\nA*B=:
\r\n");
iRet=PrintMatrixData(&stMatrixC);
if(EX_TRUE!
=iRet)
{
printf("errprintMatrixresult!
\r\n");
free(stMatrixC.pfDataAdd);
returniRet;
}
free(stMatrixC.pfDataAdd);
break;
caseEX_INVERSE_MATRIX:
/*inverse.*/
if(EX_MATRIX_UNINIT==g_cFlag)/*Forcheckingtheinput.*/
{
printf("pleasechoose1operationatfirst.\r\n");
returnEX_FALSE;
}
pfTmpBuf=(float*)malloc(pstMatrixA->ucRow*pstMatrixA->ucCol*sizeof(float));
if(pfTmpBuf==NULL)/*Forchecking.*/
{
printf("errmallocmemory.\r\n");
returnEX_MALLOC;
}
else
{
memset(pfTmpBuf,0,(pstMatrixA->ucRow*pstMatrixA->ucCol*sizeof(float)));
memcpy(pfTmpBuf,pstMatrixA->pfDataAdd,(pstMatrixA->ucRow*pstMatrixA->ucCol*sizeof(float)));
}
stMatrixC.ucCol=pstMatrixA->ucCol;
stMatrixC.ucRow=pstMatrixA->ucRow;
stMatrixC.pfDataAdd=pfTmpBuf;
iRet=InverseMatrix(stMatrixC.pfDataAdd,stMatrixC.ucRow);
if(EX_TRUE!
=iRet)/*Forchecking.*/
{
printf("\r\nerrinversematrixoperation!
\r\n");
if(EX_MALLOC==iRet)
{
;
}
else
{
free(stMatrixC.pfDataAdd);
}
returniRet;
}
printf("\r\nInverseofA=:
\r\n");
iRet=PrintInverseMatrixData(&stMatrixC);
if(EX_TRUE!
=iRet)/*Forchecking.*/
{
printf("errprintMatrixresult!
\r\n");
free(stMatrixC.pfDataAdd);
returniRet;
}
free(stMatrixC.pfDataAdd);
break;
caseEX_QUIT_MATRIX:
/*userschosetoendthisprogram.*/
printf("willquitmatrixmenu!
\r\n");
break;
default:
/*Forchecking.*/
printf("erroperatecode!
\r\n");
returnEX_FALSE;
}
returnEX_TRUE;
}
intCheckMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB)
{
if((pstMatrixA==NULL)||(pstMatrixB==NULL))
{
printf("matrixparaisnull.\r\n");
returnEX_FALSE;
}
if(EX_MATRIX_UNINIT==g_cFlag)
{
printf("pleasechoose1operationatfirst.\r\n");
returnEX_FALSE;
}
switch(iOpCode)
{
caseEX_ADD_MATRIX:
caseEX_SUBTRACT_MATRIX:
if((pstMatrixA->ucCol==pstMatrixB->ucCol)
&&(pstMatrixA->ucRow==pstMatrixB->ucRow))
{
;
}
else
{
/*ADD/Subtractoperation*/
printf("\r\nAdd/Subtractoperationisinvalid!
\r\n");
returnEX_FALSE;
}
break;
caseEX_INVERSE_MATRIX:
if((2==pstMatrixA->ucRow)
&&(2==pstMatrixA->ucCol))
{
;
}
else
{
/*Inverseoperation*/
printf("\r\nMultiply/Inverseoperationisinvalid!
\r\n");
returnEX_FALSE;
}
break;
caseEX_MULTIPLY_MATRIX:
if((pstMatrixA->ucRow==pstMatrixB->ucCol)
&&(pstMatrixA->ucCol==pstMatrixB->ucRow))
{
;
}
else
{
/*Multiplyoperation*/
printf("\r\nMultiplyoperationisinvalid!
\r\n");
returnEX_FALSE;
}
break;
default:
printf("erroperatecode!
\r\n");
returnEX_FALSE;
}
returnEX_TRUE;
}
intAddMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB,Matrix_s*pstMatrixC)
{
intiRet=EX_FALSE;
unsignedcharucRow;
unsignedcharucCol;
unsignedchari,j;
floatfTmpData=0.0;
if((pstMatrixA==NULL)||(pstMatrixB==NULL))
{
printf("matrixparaisnull.\r\n");
returnEX_FALSE;
}
iRet=CheckMatrix(iOpCode,pstMatrixA,pstMatrixB);
if(EX_FALSE==iRet)
{
returniRet;
}
else
{
ucRow=pstMatrixA->ucRow;
ucCol=pstMatrixA->ucCol;
}
/*createresultmatrixC*/
iRet=CreateResultMatrix(ucRow,ucCol,pstMatrixC);
if(iRet!
=EX_TRUE)
{
returniRet;
}
for(i=0;i{
for(j=0;j{
fTmpData=(*(pstMatrixA->pfDataAdd+i*ucCol+j)+*(pstMatrixB->pfDataAdd+i*ucCol+j));
*(pstMatrixC->pfDataAdd+i*ucCol+j)=fTmpData;
}
}
returnEX_TRUE;
}
intSubtractMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB,Matrix_s*pstMatrixC)
{
intiRet=EX_FALSE;
unsignedcharucRow;
unsignedcharucCol;
unsignedchari,j;
floatfTmpData=0.0;
if((pstMatrixA==NULL)||(pstMatrixB==NULL))
{
printf("matrixparaisnull.\r\n");
returnEX_FALSE;
}
iRet=CheckMatrix(iOpCode,pstMatrixA,pstMatrixB);
if(EX_FALSE==iRet)
{
returniRet;
}
else
{
ucRow=pstMatrixA->ucRow;
ucCol=pstMatrixA->ucCol;
}
/*createresultmatrixC*/
iRet=CreateResultMatrix(ucRow,ucCol,pstMatrixC);
if(iRet!
=EX_TRUE)
{
returniRet;
}
for(i=0;i{
for(j=0;j{
fTmpData=(*(pstMatrixA->pfDataAdd+i*ucCol+j)-*(pstMatrixB->pfDataAdd+i*ucCol+j));
*(pstMatrixC->pfDataAdd+i*ucCol+j)=fTmpData;
}
}
returnEX_TRUE;
}
intMultiplyMatrix(intiOpCode,Matrix_s*pstMatrixA,Matrix_s*pstMatrixB,Matrix_s*pstMatrixC)
{
intiRet=EX_FALSE;
unsignedcharucRow;
unsignedcharucCol;
unsignedchari,j,k;
floatfTmpData=0.0;
if((pstMatrixA==NULL)||(pstMatrixB==NULL))
{
printf("matrixparaisnull.\r\n");
returnEX_FALSE;
}
iRet=CheckMatrix(iOpCode,pstMatrixA,pstMatrixB);
if(EX_FALSE==iRet)
{
returniRet;
}
else
{
ucRow=pstMatrixA->ucRow;
ucCol=pstMatrixB->ucCol;
}
/*createresultmatrixC*/
iRet=CreateResultMatrix(ucRow,ucCol,pstMatrixC);
if(iRet!
=EX_TRUE)
{
returniRet;
}
for(i=0;i{
for(j=0;j{
for(k=0;