首页 > 编程 > C++ > 正文

学习二维动态数组指针做矩阵运算的方法

2020-05-23 14:16:44
字体:
来源:转载
供稿:网友

这片文章介绍了如何利用二维动态数组指针做矩阵运算,需要的朋友可以参考下

本文分享了利用二维动态数组指针做矩阵运算的实现代码。

1. 头文件

 

 
  1. // juzhen 2.cpp : Defines the entry point for the console application. 
  2. // 
  3.  
  4. #include "stdafx.h" 
  5. #include "stdlib.h" 
  6. #include "windows.h" 
  7. #define OK 0 
  8. #define NG -1 
  9. typedef struct mat 
  10. int nRow; /* 行数 */ 
  11. int nCol; /* 列数 */ 
  12. int* pData; /* 指向矩??体的指? */ 
  13. }MAT; 

2. 程序代码

 

 
  1. #include "stdafx.h" 
  2. #include "Matrix_cal.h" 
  3. /* Entity and initial matrix of the application matrix function */ 
  4. int MATAlloc(MAT *pMat, int nRow, int nCol) 
  5. pMat->pData = (int *) malloc (nRow * nCol * sizeof(int) ); 
  6. if(NULL == pMat->pData) 
  7. printf("Memary is error!/n"); 
  8. return NG; 
  9. for(int i=0; i<nRow; ++i) 
  10. for(int j=0; j<nCol; ++j) 
  11. *(pMat->pData + i*nCol + j)=0; 
  12. pMat->nRow = nRow; 
  13. pMat->nCol = nCol; 
  14. return OK; 
  15.  
  16. /* Release the memory space and reset the matrix data function */ 
  17. void MATFree(MAT* pMat) 
  18. free(pMat->pData); 
  19. pMat->pData = NULL; 
  20. pMat->nRow = 0; 
  21. pMat->nCol = 0; 
  22.  
  23. /* Import of matrix function */ 
  24. int MATAssign (MAT* pMat1, const MAT* pMat2) 
  25. MATAlloc(pMat1, pMat2->nRow, pMat2->nCol); 
  26. for(int i=0; i < pMat1->nRow; ++i) 
  27. for(int j=0; j < pMat1->nCol; ++j) 
  28. *(pMat1->pData + i * pMat1->nCol + j) = *(pMat2->pData + i * pMat1->nCol + j); 
  29. return OK;  
  30.  
  31. /* Matrix sum function */ 
  32. int MATAdd(const MAT* pMat1, const MAT* pMat2, MAT* pMat3) 
  33. MATAlloc(pMat3, pMat1->nRow, pMat1->nCol); 
  34. if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol)) 
  35. for(int i=0; i<pMat1->nRow; ++i) 
  36. for(int j=0; j<pMat1->nCol; ++j) 
  37. *(pMat3->pData + i * pMat3->nCol + j) = *(pMat1->pData + i * pMat1->nCol + j) + *(pMat2->pData + i * pMat1->nCol + j); 
  38. return OK;  
  39. else 
  40. printf("Not add!/n"); 
  41. return NG; 
  42.  
  43.  
  44. /* Matrix subtraction function */ 
  45. int MATSub(const MAT* pMat1, const MAT* pMat2, MAT* pMat3) 
  46. MATAlloc(pMat3, pMat1->nRow, pMat1->nCol); 
  47. if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol)) 
  48. for(int i=0; i<pMat1->nRow; ++i) 
  49. for(int j=0; j<pMat1->nCol; ++j) 
  50. *(pMat3->pData + i * pMat3->nCol + j) = *(pMat1->pData + i * pMat1->nCol + j) - *(pMat2->pData + i * pMat1->nCol + j); 
  51. return OK;  
  52. else 
  53. printf("Not Sub!/n"); 
  54. return NG; 
  55.  
  56.  
  57. /* Matrix clear */ 
  58. void MATClear(MAT* pMat) 
  59. for(int i=0; i<pMat->nRow; ++i) 
  60. for(int j=0; j<pMat->nCol; ++j) 
  61. *(pMat->pData + i * pMat->nCol + j)=0; 
  62.  
  63. /* Matrix multiplication C function */ 
  64. void MATMulC (MAT* pMat, int C) 
  65. for(int i=0; i<pMat->nRow; ++i) 
  66. for(int j=0; j<pMat->nCol; ++j) 
  67. *(pMat->pData + i * pMat->nCol + j) = C * (*(pMat->pData + i * pMat->nCol + j) ); 
  68.  
  69. /* Matrix multiplication function */ 
  70. int MATMul (const MAT* pMat1, const MAT* pMat2, MAT* pMat3) 
  71. MATAlloc(pMat3, pMat1->nRow, pMat2->nCol); 
  72. if(pMat1->nCol == pMat2->nRow) 
  73. for(int i=0; i<pMat1->nRow; ++i) 
  74. for(int j=0; j<pMat2->nCol; ++j) 
  75. for(int k=0; k<pMat1->nCol; ++k) 
  76. *(pMat3->pData + i * pMat2->nCol+j) += *(pMat1->pData + i * pMat2->nRow + k) * (*(pMat2->pData + k * pMat2->nCol + j) ); 
  77. return OK;  
  78. else 
  79. printf("not Mul/n"); 
  80. return NG; 
  81. /* Matrix transpose function */ 
  82. int MATTransport(const MAT* pMat1, MAT* pMat2) 
  83. MATAlloc(pMat2, pMat1->nCol, pMat1->nRow); 
  84. for(int i=0; i<pMat1->nRow; ++i) 
  85. for(int j=0; j<pMat1->nCol; ++j) 
  86. *(pMat2->pData + j * pMat1->nRow + i) = *(pMat1->pData + i * pMat1->nCol + j); 
  87. return OK; 
  88. /* 
  89. bool Check_digit(char *kk) 
  90. { 
  91. int a = strlen(kk); 
  92. for(int i = 0; i<a; ++i) 
  93. { 
  94. if( ( (int) (*(kk + i) ) > 48) && ( (int) (*(kk + i) ) < 57 || (int) (*(kk + i) ) == 32) ) 
  95. { 
  96. return 1; 
  97. } 
  98. } 
  99. return 0; 
  100. } 
  101.  
  102. */ 
  103.  
  104. /* Matrix initialization */ 
  105. void MATinit(MAT *pMat) 
  106. bool kos=1; 
  107. int nRow = 0, nCol = 0; 
  108. printf("Please input the number of rows: "); 
  109. scanf_s("%d",&nRow); 
  110. putchar('/n'); 
  111. printf("Please input the number of columns: "); 
  112. scanf_s("%d",&nCol); 
  113. putchar('/n'); 
  114. printf("Please input %dX%d Matrix:/n",nRow,nCol); 
  115. kos=MATAlloc(pMat,nRow,nCol); 
  116. for(int i=0; i<nRow; ++i) 
  117. for(int j=0; j<nCol; ++j) 
  118. scanf("%d", pMat->pData + i*nCol + j); 
  119. /*char arr[100][100]={0}; 
  120. for(int i=0; i<nRow; ++i) 
  121. { 
  122. for(int j=0; j<nCol; ++j) 
  123. { 
  124. scanf("%c", &arr[i][j]); 
  125. kos = Check_digit(&arr[i][j]); 
  126. } 
  127. } 
  128. //ks= atoi(arr[0]); 
  129. while(kos) 
  130. { 
  131. printf(" input is error,Please input again!"); 
  132. for(int i=0; i<nRow; ++i) 
  133. { 
  134. for(int j=0; j<nCol; ++j) 
  135. { 
  136. scanf("%c", arr[i]); 
  137. } 
  138. } 
  139. kos = Check_digit(arr[0]); 
  140. //ks= atoi(arr[0]); 
  141. } 
  142. for(int i=0; i<nRow; ++i) 
  143. { 
  144. for(int j=0; j<nCol; ++j) 
  145. { 
  146. *(pMat->pData + i*nCol + j) = atoi(&arr[i][j]); 
  147. } 
  148. } 
  149.  
  150. } 
  151. */ 
  152.  
  153. /* Output matrix */ 
  154. void Print(MAT *pMat) 
  155. printf("The result is:/n"); 
  156. for(int i = 0; i < pMat->nRow; ++i) 
  157. for(int j=0; j<pMat->nCol; ++j) 
  158. printf("%d ",*( pMat->pData + i * pMat->nCol + j) ); 
  159. putchar('/n'); 
  160.  
  161. int _tmain(int argc, _TCHAR* argv[]) 
  162. int nRow = 1,nCol = 1,sign = 1,C = 1,work = 1,sigal=0; 
  163. MAT Mat, Mat1, Mat2; 
  164. MAT *pMat = &Mat; 
  165. MAT *pMat1 = &Mat1; 
  166. MAT *pMat2 = &Mat2; 
  167. while(work) 
  168. system("cls"); 
  169. printf(" Welcome To The Matrix Operation system! /n"); 
  170. printf("------------------------------------------------/n"); 
  171. printf("1: Open The Generating matrix function!/n"); 
  172. printf("2: Open The Release matrix function!/n"); 
  173. printf("3: Open The Import matrix function!/n"); 
  174. printf("4: Open The Add matrix function!/n"); 
  175. printf("5: Open The Matrix subtraction function!/n"); 
  176. printf("6: Open The Clear matrix function!/n"); 
  177. printf("7: Open The Matrix multiplication C function!/n"); 
  178. printf("8: Open The Matrix multiplication function!/n"); 
  179. printf("9: Open The Matrix transpose function!/n"); 
  180. printf("------------------------------------------------/n"); 
  181. printf("Please Select operation type:"); 
  182. scanf("%d",&sign); 
  183. switch(sign) 
  184. case 1: 
  185. MATinit(pMat); 
  186. Print(pMat); 
  187. break
  188. case 2: 
  189. MATinit(pMat); 
  190. Print(pMat); 
  191. MATFree(pMat); 
  192. break
  193. case 3: 
  194.  
  195. MATinit(pMat2); 
  196. MATAssign (pMat1, pMat2); 
  197. Print(pMat1); 
  198. break
  199. case 4: 
  200. MATinit(pMat1); 
  201. MATinit(pMat2); 
  202. sigal = MATAdd(pMat1, pMat2,pMat); 
  203. if(0 == sigal) 
  204. Print(pMat); 
  205. break
  206. case 5: 
  207. MATinit(pMat1); 
  208. MATinit(pMat2); 
  209. sigal = MATSub(pMat1, pMat2,pMat); 
  210. if(0 == sigal) 
  211. Print(pMat); 
  212. break
  213. case 6: 
  214. MATinit(pMat); 
  215. Print(pMat); 
  216. MATClear(pMat); 
  217. Print(pMat); 
  218. break
  219. case 7: 
  220. printf("Please input the number of C: "); 
  221. scanf("%d",&C); 
  222. putchar('/n'); 
  223. MATinit(pMat); 
  224. MATMulC (pMat, C); 
  225. Print(pMat); 
  226. break
  227. case 8: 
  228. MATinit(pMat1); 
  229. MATinit(pMat2); 
  230. sigal = MATMul (pMat1, pMat2, pMat); 
  231. if(0 == sigal) 
  232. Print(pMat); 
  233. break
  234. case 9: 
  235. MATinit(pMat1); 
  236. MATTransport(pMat1, pMat2); 
  237. Print(pMat2); 
  238. break
  239. default: printf("input is error!"); 
  240. printf("Whether exit the Matrix calculation system?(1 is not exit,0 is exit)/n"); //whether exit the system. 
  241. scanf("%d", &work); 
  242. fflush(stdin); 
  243. while (work != 0 && work != 1) //work must is 1 or 0. 
  244. printf(" Input is error,Please input again!/n"); 
  245. scanf("%d", &work); 
  246. fflush(stdin); 
  247. printf("/n-------------Thanks For You Using The Matrix Calculation System !--------------/n"); 
  248. Sleep(2000); //deley some times. 
  249. return 0; 

以上就是实现二维动态数组指针做矩阵运算的代码,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表