您的位置:首页 > 其它

C4GPLT_L1-048_矩阵A乘以B

2017-12-26 15:03 288 查看
代码

思路

总结

代码

#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函数释放动态分配的存储时,一定要先检查指针是否确实指向动态分配的存储

最后还是要吹嘘一把的^_^:

没有调查,就没有发言权

你对于某个问题没有调查,就停止你对于某个问题的发言权。这不太野蛮了吗?一点也不野蛮,你对那个问题的现实情况和历史情况既然没有调查,不知底里,对于那个问题的发言便一定是瞎说一顿。瞎说一顿之不能解决问题是大家明了的,那末,停止你的发言权有什么不公道呢?许多的同志都成天地闭着眼睛在那里瞎说,这是共产党员的耻辱,岂有共产党员而可以闭着眼睛瞎说一顿的吗?

要不得!要不得!注重调查!反对瞎说!

毛泽东《反对本本主义》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: