矩陣計算C語言源代碼_第1頁
矩陣計算C語言源代碼_第2頁
矩陣計算C語言源代碼_第3頁
矩陣計算C語言源代碼_第4頁
矩陣計算C語言源代碼_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、/#include "matrix.h"#define EX_TRUE (0)#define EX_FALSE (1)#define EX_MALLOC (2)typedef struct tagMatrixunsigned char ucRow;unsigned char ucCol;unsigned short usRev;float *pfDataAdd;Matrix_s;extern int InputRowColInfo(unsigned char *pucRow, unsigned char *pucCol);extern int CreateMatrixMem

2、(void *pvData);extern int InputMatrixData(void *pvData);extern int PrintMatrixData(void *pvData);extern int PrintInverseMatrixData(void *pvData);extern int Show_matrix(Matrix_s *pstMatrixA, Matrix_s *pstMatrixB);/#include "operate_matrix.h"#define EX_MATRIX_INIT (1)#define EX_MATRIX_UNINIT

3、 (0)typedef enumEX_INPUT_MATRIX = 1,EX_ADD_MATRIX,EX_SUBTRACT_MATRIX,EX_MULTIPLY_MATRIX,EX_INVERSE_MATRIX,EX_QUIT_MATRIX,EX_BOTTOM_MATRIXMatrix_opcode_en;extern int OperateMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrix);extern int ShowMatrixMenu();extern int CheckMatrix(int iOpCode, M

4、atrix_s *pstMatrixA, Matrix_s *pstMatrixB);extern int AddMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC);extern int SubtractMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC);extern int MultiplyMatrix(int iOpCode, Matrix_s *pst

5、MatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC);extern int CreateResultMatrix(unsigned char ucRow, unsigned char ucCol, void *pvData);extern int InverseMatrix(float a, int n);/*Guanlin Luo ID:10529749*/#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <math.h

6、>#include "matrix.h"/*We have already done this header.*/#include "operate_matrix.h"/*We have already done this header.*/char g_cFlag = EX_MATRIX_UNINIT;int main ()int iInputOpCode;int iRet = EX_FALSE;Matrix_s stMatrixA, stMatrixB;memset(&stMatrixA, 0, sizeof(stMatrixA);me

7、mset(&stMatrixB, 0, sizeof(stMatrixB);while(1)/* show menu */(void)ShowMatrixMenu();/* operete matrix */scanf("%d", &iInputOpCode);iRet = OperateMatrix(iInputOpCode, &stMatrixA, &stMatrixB);if (EX_TRUE = iRet)if (EX_QUIT_MATRIX = iInputOpCode)break;if (NULL != stMatrixA.pfD

8、ataAdd)free(stMatrixA.pfDataAdd);if (NULL != stMatrixB.pfDataAdd)free(stMatrixB.pfDataAdd);return EX_TRUE;int ShowMatrixMenu()/*choices for users.*/printf("1 - Enter matrices A & Brn");printf("2 - Add matricesrn");printf("3 - Subtract matricesrn");printf("4 - M

9、ultiply matricesrn");printf("5 - Inverse of Arn");printf("6 - Quit programrn");printf("Option: ");return EX_TRUE;int OperateMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB)int iRet = EX_FALSE;Matrix_s stMatrixC;float *pfTmpBuf = NULL;memset(&stMa

10、trixC, 0, sizeof(Matrix_s);switch (iOpCode)case EX_INPUT_MATRIX:iRet = Show_matrix(pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)printf("err input matrix info!n");return iRet;else/* at first, we need input matrix data */g_cFlag = EX_MATRIX_INIT;break;case EX_ADD_MATRIX:/*Addition part.*/iRet

11、 = AddMatrix(EX_ADD_MATRIX, pstMatrixA, pstMatrixB, &stMatrixC);if (EX_TRUE != iRet)/*For checking.*/printf("err multiply matrix operation!n");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);return iRet;printf("rnA + B =: rn");iRet = PrintMatrixData(&stMatrixC);if (iR

12、et = EX_FALSE)printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(stMatrixC.pfDataAdd);break;case EX_SUBTRACT_MATRIX:/*Subtract two matrices*/iRet = SubtractMatrix(EX_SUBTRACT_MATRIX, pstMatrixA, pstMatrixB, &stMatrixC);if (EX_TRUE != iRet)/*For checking.*/p

13、rintf("err subtract matrix operation!rn");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);return iRet;printf("rnA - B =: rn");iRet = PrintMatrixData(&stMatrixC);if (iRet = EX_FALSE)printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(s

14、tMatrixC.pfDataAdd);break;case EX_MULTIPLY_MATRIX:/*multiplication part.*/iRet = MultiplyMatrix(EX_MULTIPLY_MATRIX, pstMatrixA, pstMatrixB, &stMatrixC);if (EX_TRUE != iRet)/*For checking.*/printf("rnerr multiply matrix operation!rn");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);

15、return iRet;printf("rnA * B =: rn");iRet = PrintMatrixData(&stMatrixC);if (EX_TRUE != iRet)printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(stMatrixC.pfDataAdd);break;case EX_INVERSE_MATRIX:/*inverse.*/if (EX_MATRIX_UNINIT = g_cFlag)/*For checki

16、ng the input.*/printf("please choose 1 operation at first.rn");return EX_FALSE;pfTmpBuf = (float *)malloc(pstMatrixA->ucRow * pstMatrixA->ucCol * sizeof(float);if (pfTmpBuf = NULL)/*For checking.*/printf("err malloc memory.rn");return EX_MALLOC;elsememset(pfTmpBuf, 0, (pstM

17、atrixA->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.

18、pfDataAdd, stMatrixC.ucRow);if (EX_TRUE != iRet)/*For checking.*/printf("rnerr inverse matrix operation!rn");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);return iRet;printf("rnInverse of A =: rn");iRet = PrintInverseMatrixData(&stMatrixC);if (EX_TRUE != iRet)/*For chec

19、king.*/printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(stMatrixC.pfDataAdd);break;case EX_QUIT_MATRIX:/*users chose to end this program.*/printf("will quit matrix menu!rn");break;default:/*For checking.*/printf("err operate code!rn");retu

20、rn EX_FALSE;return EX_TRUE;int CheckMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB)if (pstMatrixA = NULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;if (EX_MATRIX_UNINIT = g_cFlag)printf("please choose 1 operation at first.rn");return EX

21、_FALSE;switch (iOpCode)case EX_ADD_MATRIX: case EX_SUBTRACT_MATRIX:if (pstMatrixA->ucCol = pstMatrixB->ucCol)&& (pstMatrixA->ucRow = pstMatrixB->ucRow);else/* ADD / Subtract operation */printf("rnAdd/Subtract operation is invalid!rn");return EX_FALSE;break;case EX_INVER

22、SE_MATRIX:if (2 = pstMatrixA->ucRow)&& (2 = pstMatrixA->ucCol);else/* Inverse operation */printf("rnMultiply/Inverse operation is invalid!rn");return EX_FALSE;break;case EX_MULTIPLY_MATRIX:if (pstMatrixA->ucRow = pstMatrixB->ucCol)&& (pstMatrixA->ucCol = pstM

23、atrixB->ucRow);else/* Multiply operation */printf("rnMultiply operation is invalid!rn");return EX_FALSE;break;default:printf("err operate code!rn");return EX_FALSE;return EX_TRUE;int AddMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC)int iR

24、et = EX_FALSE;unsigned char ucRow;unsigned char ucCol;unsigned char i, j;float fTmpData = 0.0;if (pstMatrixA = NULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;iRet = CheckMatrix(iOpCode, pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)return iRet;elseucRow = pstMatr

25、ixA->ucRow;ucCol = pstMatrixA->ucCol;/* create result matrix C */iRet = CreateResultMatrix(ucRow, ucCol, pstMatrixC);if (iRet != EX_TRUE)return iRet;for (i = 0; i < ucRow; i+)for (j = 0; j < ucCol; j+)fTmpData = (*(pstMatrixA->pfDataAdd + i * ucCol + j) + *(pstMatrixB->pfDataAdd +

26、i * ucCol + j);*(pstMatrixC->pfDataAdd + i * ucCol + j) = fTmpData;return EX_TRUE;int SubtractMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC)int iRet = EX_FALSE;unsigned char ucRow;unsigned char ucCol;unsigned char i, j;float fTmpData = 0.0;if (pstMatrixA = N

27、ULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;iRet = CheckMatrix(iOpCode, pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)return iRet;elseucRow = pstMatrixA->ucRow;ucCol = pstMatrixA->ucCol;/* create result matrix C */iRet = CreateResultMatrix(ucRow, ucCol, p

28、stMatrixC);if (iRet != EX_TRUE)return iRet;for (i = 0; i < ucRow; i+)for (j = 0; j < ucCol; j+)fTmpData = (*(pstMatrixA->pfDataAdd + i * ucCol + j) - *(pstMatrixB->pfDataAdd + i * ucCol + j);*(pstMatrixC->pfDataAdd + i * ucCol + j) = fTmpData;return EX_TRUE;int MultiplyMatrix(int iOpC

29、ode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC)int iRet = EX_FALSE;unsigned char ucRow;unsigned char ucCol;unsigned char i, j, k;float fTmpData = 0.0;if (pstMatrixA = NULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;iRet = CheckMatrix(iOpCo

30、de, pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)return iRet;elseucRow = pstMatrixA->ucRow;ucCol = pstMatrixB->ucCol;/* create result matrix C */iRet = CreateResultMatrix(ucRow, ucCol, pstMatrixC);if (iRet != EX_TRUE)return iRet;for (i = 0; i < ucRow; i+)for (j = 0; j < ucCol; j+)for (k =

31、 0; k < pstMatrixA->ucCol; k+)fTmpData += (float)(*(pstMatrixA->pfDataAdd + i * ucCol + k) * *(pstMatrixB->pfDataAdd + j + k * ucCol);*(pstMatrixC->pfDataAdd + i * ucCol + j) = fTmpData;fTmpData = 0;return EX_TRUE;int CreateResultMatrix(unsigned char ucRow, unsigned char ucCol, void *

32、pvData)Matrix_s *pstTmpData = NULL;int iRet = EX_FALSE;if (pvData = NULL)printf("para is null.rn");return EX_FALSE;elsepstTmpData = (Matrix_s *)pvData;/* create result matrix C */memset(pstTmpData, 0, sizeof(Matrix_s);pstTmpData->ucRow = ucRow;pstTmpData->ucCol = ucCol;iRet = CreateMatrixMem(pstTmpData);if (iRet != EX_TRUE)printf("err create result Matrix C!rn");return iRet;return EX_TRUE;int InverseMatrix(float a, int n) int *is,*js;int i,j,k,l,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論