一、矩阵的乘法
两个矩阵只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。
运算规则:
将第一个矩阵的第i行的每个元素分别乘上第二个矩阵第j列的每个元素然后进项相加,得到的结果就为新矩阵的第i行第j列的元素。
二、实现步骤
1.定义结构体(二维数组)
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<prows;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;i<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
paraPtr->element[i][j]=rand()%(UpperBound-LowerBound)+LowerBound;
}
}
}
4、打印
void printTwoArray(TwoArrayPtr paraPtr)
{
int i,j;
for(i=0;i<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
printf("%d ",paraPtr->element[i][j]);
}
printf("\r\n");
}
}
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;i<paraPtr1->rows;i++)
{
for(j=0;j<paraPtr2->columns;j++)
{
sum=0;
for(k=0;k<paraPtr1->columns;k++)
{
sum=sum+paraPtr1->element[i][k]*paraPtr2->element[k][j];
}
resultPtr->element[i][j]=sum;
printf("sum=%d ",sum);
}
}
return resultPtr;
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
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<prows;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<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
paraPtr->element[i][j]=rand()%(UpperBound-LowerBound)+LowerBound;
}
}
}
void printTwoArray(TwoArrayPtr paraPtr)
{
int i,j;
for(i=0;i<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
printf("%d ",paraPtr->element[i][j]);
}
printf("\r\n");
}
}
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<paraPtr1->rows;i++)
{
for(j=0;j<paraPtr2->columns;j++)
{
sum=0;
for(k=0;k<paraPtr1->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