C4GPLT_L1-048_矩阵A乘以B
2017-12-26 15:03
288 查看
代码
思路
总结
这道题目要实现的功能大致可以分为以下五个部分:
结构体形式存储矩阵
A. 指向矩阵存储位置的指针
B. 矩阵行数
C. 矩阵列数
存储输入的矩阵
void StoreMatrix(CMatrix* pMatrix)
接收矩阵的行数、列数,然后通过malloc函数分配相应大小的存储空间,紧接着就可以接收矩阵的各个元素值。
对这一种数据结构,我还是有一些疑问的:使用二维数组来存储矩阵似乎更加接近矩阵的数据构成,不知道有无更好的方式来进行动态存储。
打印输出的矩阵
void PrintMatrix(CMatrix* pMatrix)
依次输出矩阵的行数,列数及矩阵内容
取得矩阵的元素 Ai,jAi,j
int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum)
根据行序号与列序号输出元素
矩阵的乘法
void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix)
1.在进行指针运算时,一定要预防越界情况的发生
2.free函数释放动态分配的存储时,一定要先检查指针是否确实指向动态分配的存储
最后还是要吹嘘一把的^_^:
没有调查,就没有发言权
你对于某个问题没有调查,就停止你对于某个问题的发言权。这不太野蛮了吗?一点也不野蛮,你对那个问题的现实情况和历史情况既然没有调查,不知底里,对于那个问题的发言便一定是瞎说一顿。瞎说一顿之不能解决问题是大家明了的,那末,停止你的发言权有什么不公道呢?许多的同志都成天地闭着眼睛在那里瞎说,这是共产党员的耻辱,岂有共产党员而可以闭着眼睛瞎说一顿的吗?
要不得!要不得!注重调查!反对瞎说!
毛泽东《反对本本主义》
思路
总结
代码
#include <stdio.h> #include <stdlib.h> #define nullptr 0 typedef struct CMatrix{ int* pMatrixAddr; int RSize; int CSize; }CMatrix; void InitMatrix(CMatrix* pMatrix); int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum); void StoreMatrix(CMatrix* pMatrix); void PrintMatrix(CMatrix* pMatrix); void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix); void FreeMatrixStore(CMatrix* pMatrix); int main() { CMatrix MatrixA, MatrixB, ResultMatrix; InitMatrix(&MatrixA); InitMatrix(&MatrixB); InitMatrix(&ResultMatrix); StoreMatrix(&MatrixA); StoreMatrix(&MatrixB); MultiplyMatrix(&MatrixA, &MatrixB, &ResultMatrix); if(ResultMatrix.pMatrixAddr != nullptr) PrintMatrix(&ResultMatrix); FreeMatrixStore(&MatrixA); FreeMatrixStore(&MatrixB); FreeMatrixStore(&ResultMatrix); return 0; } void InitMatrix(CMatrix* pMatrix) { pMatrix->RSize = 0; pMatrix->CSize = 0; pMatrix->pMatrixAddr = nullptr; } int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum) { return pMatrix->pMatrixAddr + RawNum * pMatrix->CSize + ColumnNum; } void StoreMatrix(CMatrix* pMatrix) { int i, j; scanf("%d %d", &pMatrix->RSize, &pMatrix->CSize); pMatrix->pMatrixAddr = (int*)malloc(sizeof(int)*(pMatrix->RSize)*(pMatrix->CSize)); for(i=0; i<pMatrix->RSize; i++) { for(j=0; j<pMatrix->CSize; j++) { scanf("%d", GetElement(pMatrix, i, j)); } } return; } void PrintMatrix(CMatrix* pMatrix) { int i, j; printf("%d %d\n",pMatrix->RSize, pMatrix->CSize); for(i=0; i<pMatrix->RSize; i++) { for(j=0; j<pMatrix->CSize; j++) { printf("%d", *GetElement(pMatrix, i, j)); if(j != pMatrix->CSize - 1){ printf(" "); } } printf("\n"); } return; } void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix) { int i, j, k; if(pMatrixA->CSize != pMatrixB->RSize){ printf("Error: %d != %d\n", pMatrixA->CSize, pMatrixB->RSize); } else{ pResultMatrix->RSize = pMatrixA->RSize; pResultMatrix->CSize = pMatrixB->CSize; pResultMatrix->pMatrixAddr = (int*)malloc(sizeof(int)*(pMatrixA->RSize)*(pMatrixB->CSize)); for(i=0; i<pMatrixA->RSize; i++) { for(j=0; j<pMatrixB->CSize; j++) { *GetElement(pResultMatrix, i, j) = 0; for(k=0; k<pMatrixA->CSize; k++) { *GetElement(pResultMatrix, i, j) += (*GetElement(pMatrixA, i, k))* (*GetElement(pMatrixB, k, j)); } } } } return; } void FreeMatrixStore(CMatrix* pMatrix) { if(pMatrix->pMatrixAddr != nullptr) free(pMatrix->pMatrixAddr); return; }
思路
我对这道题目做了一些扩展,不仅能够对行(列)数在100以内的矩阵可以进行乘法,在内存允许的情况下,可以对任意(列)数的矩阵进行乘除运算。这道题目要实现的功能大致可以分为以下五个部分:
结构体形式存储矩阵
A. 指向矩阵存储位置的指针
B. 矩阵行数
C. 矩阵列数
存储输入的矩阵
void StoreMatrix(CMatrix* pMatrix)
接收矩阵的行数、列数,然后通过malloc函数分配相应大小的存储空间,紧接着就可以接收矩阵的各个元素值。
对这一种数据结构,我还是有一些疑问的:使用二维数组来存储矩阵似乎更加接近矩阵的数据构成,不知道有无更好的方式来进行动态存储。
打印输出的矩阵
void PrintMatrix(CMatrix* pMatrix)
依次输出矩阵的行数,列数及矩阵内容
取得矩阵的元素 Ai,jAi,j
int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum)
根据行序号与列序号输出元素
矩阵的乘法
void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix)
总结
这道题目本质上考察的其实是如何将malloc分配的一维线性数据转化成二维数组数据,需要注意的有两点:1.在进行指针运算时,一定要预防越界情况的发生
2.free函数释放动态分配的存储时,一定要先检查指针是否确实指向动态分配的存储
最后还是要吹嘘一把的^_^:
没有调查,就没有发言权
你对于某个问题没有调查,就停止你对于某个问题的发言权。这不太野蛮了吗?一点也不野蛮,你对那个问题的现实情况和历史情况既然没有调查,不知底里,对于那个问题的发言便一定是瞎说一顿。瞎说一顿之不能解决问题是大家明了的,那末,停止你的发言权有什么不公道呢?许多的同志都成天地闭着眼睛在那里瞎说,这是共产党员的耻辱,岂有共产党员而可以闭着眼睛瞎说一顿的吗?
要不得!要不得!注重调查!反对瞎说!
毛泽东《反对本本主义》
相关文章推荐
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- 【天梯赛】L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- 天梯赛习题 L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048 矩阵A乘以B(矩阵乘法运算)
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- PAT 天梯赛 L1-048. 矩阵A乘以B 【数学】
- PAT - 天梯赛 L1-048 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- 团体程序设计天梯赛-练习集 L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B
- L1-048. 矩阵A乘以B(矩阵乘法)