- 一、矩阵的乘法
- 二、实现步骤
- 1.定义结构体(二维数组)
- 2.矩阵初始化
- 3、二维数组随机赋值
- 4、打印
- 5、相乘
一、矩阵的乘法
两个矩阵只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。
运算规则:
将第一个矩阵的第i行的每个元素分别乘上第二个矩阵第j列的每个元素然后进项相加,得到的结果就为新矩阵的第i行第j列的元素。
typedef struct TwoArray
{
int rows;
int columns;
int** element;
}TwoArray,*TwoArrayPtr;
2.矩阵初始化
TwoArrayPtr initTwoArray(int prows,int pcolumns)
{
int i;
TwoArrayPtr result=(TwoArrayPtr)malloc(sizeof(struct TwoArray));
result->rows=prows;
result->columns=pcolumns;
result->element=(int**)malloc(sizeof(int)*pcolumns);
for(i=0;i
result->element[i]=(int*)malloc(sizeof(int)*pcolumns);
}
return result;
}
3、二维数组随机赋值
void randomTwoArray(TwoArrayPtr paraPtr,int LowerBound,int UpperBound)
{
int i,j;
for(i=0;irows;i++)
{
for(j=0;jcolumns;j++)
{
paraPtr->element[i][j]=rand()%(UpperBound-LowerBound)+LowerBound;
}
}
}
4、打印
void printTwoArray(TwoArrayPtr paraPtr)
{
int i,j;
for(i=0;irows;i++)
{
for(j=0;jcolumns;j++)
{
printf("%d ",paraPtr->element[i][j]);
}
printf("rn");
}
}
5、相乘
TwoArrayPtr matrixMultiply(TwoArrayPtr paraPtr1,TwoArrayPtr paraPtr2)
{
int i,j,k,sum;
if(paraPtr1->columns!=paraPtr2->rows)
{
printf("矩阵无法相乘!");
return NULL;
}
TwoArrayPtr resultPtr=initTwoArray(paraPtr1->rows,paraPtr2->columns);
for(i=0;irows;i++)
{
for(j=0;jcolumns;j++)
{
sum=0;
for(k=0;kcolumns;k++)
{
sum=sum+paraPtr1->element[i][k]*paraPtr2->element[k][j];
}
resultPtr->element[i][j]=sum;
printf("sum=%d ",sum);
}
}
return resultPtr;
}
完整代码:
#include#include #include typedef struct TwoArray { int rows; int columns; int** element; }TwoArray,*TwoArrayPtr; TwoArrayPtr initTwoArray(int prows,int pcolumns) { int i; TwoArrayPtr result=(TwoArrayPtr)malloc(sizeof(struct TwoArray)); result->rows=prows; result->columns=pcolumns; result->element=(int**)malloc(sizeof(int)*pcolumns); for(i=0;i result->element[i]=(int*)malloc(sizeof(int)*pcolumns); } return result; } void randomTwoArray(TwoArrayPtr paraPtr,int LowerBound,int UpperBound) { int i,j; for(i=0;i rows;i++) { for(j=0;j columns;j++) { paraPtr->element[i][j]=rand()%(UpperBound-LowerBound)+LowerBound; } } } void printTwoArray(TwoArrayPtr paraPtr) { int i,j; for(i=0;i rows;i++) { for(j=0;j columns;j++) { printf("%d ",paraPtr->element[i][j]); } printf("rn"); } } TwoArrayPtr matrixMultiply(TwoArrayPtr paraPtr1,TwoArrayPtr paraPtr2) { int i,j,k,sum; if(paraPtr1->columns!=paraPtr2->rows) { printf("矩阵无法相乘!"); return NULL; } TwoArrayPtr resultPtr=initTwoArray(paraPtr1->rows,paraPtr2->columns); for(i=0;i rows;i++) { for(j=0;j columns;j++) { sum=0; for(k=0;k columns;k++) { sum=sum+paraPtr1->element[i][k]*paraPtr2->element[k][j]; } resultPtr->element[i][j]=sum; printf("sum=%d ",sum); } } return resultPtr; } void test() { TwoArrayPtr temp1,temp2,temp3; temp1=initTwoArray(3,2); randomTwoArray(temp1,1,5); printf("第一个矩阵为:n"); printTwoArray(temp1); temp2=initTwoArray(2,4); randomTwoArray(temp2,0,5); printf("第二个矩阵为:n"); printTwoArray(temp2); temp3=matrixMultiply(temp1,temp2); printf("n第三个矩阵为:n"); printTwoArray(temp3); } int main() { test(); return 0; }
运行结果:
第一个矩阵为: 2 4 3 1 2 1 第二个矩阵为: 3 3 2 4 0 0 1 2 sum=6 sum=6 sum=8 sum=16 sum=9 sum=9 sum=7 sum=14 sum=6 sum=6 sum=5 sum=10 第三个矩阵为: 6 6 8 16 9 9 7 14 6 6 5 10



