矩阵乘法本身逻辑简单,实现这个函数却用了个吧小时,现将参考代码分享如下:
//矩阵乘法 此函数实现double型矩阵乘法 其他类型可以使用模板 或将double修改为其他类型
void Matrix_Multiplication_d(double* mA, int aM, int aN, double* mB, int bM, int bN, double* mR)
{
if (aN != bM || mA==NULL || mB==NULL || mR==NULL)
{
return;
}
int iTemp0 = 0;
int index0 = 0;
int index1 = 0;
double *sum = (double*)malloc(bN*sizeof(double));
if( sum == NULL )
{
return;
}
//循环处理矩阵A每一行
for (int am=0; am<aM; am++)
{
memset(sum, 0, sizeof(double)*bN);
//矩阵B
for (int bm=0; bm<bM; bm++)
{
iTemp0 = bm*bN;
for (int bn=0; bn<bN; bn++)
{
index0 = iTemp0 + bn;
index1 = am*aN + bm; //计算矩阵A对应位置
if (bm == 0)
{
sum[bn] = mB[index0]*mA[index1];
}
else
{
sum[bn] += mB[index0]*mA[index1];
}
}
}
memcpy(mR+am*bN, sum, sizeof(double)*bN);
}
free(sum);
}
调用方式
int _tmain(int argc, _TCHAR* argv[])
{
//一维数组
double mA[16] = {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16};
double mB[16] = {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16};
double mR[16] = {0};
Matrix_Multiplication_d(mA, 4, 4, mB, 4, 4, mR);
for (int i=0 ;i<16; i++)
{
cout<<mR[i]<<" ";
if ((i+1)%4 == 0)
{
cout<<endl;
}
}
cout<<endl;
//二维数组
double mA1[4][4] = {{1,2,3,4} , {5,6,7,8} , {9,10,11,12} , {13,14,15,16}};
double mB1[4][4] = {{1,2,3,4} , {5,6,7,8} ,{9,10,11,12} , {13,14,15,16}};
double mR1[4][4] = {0};
Matrix_Multiplication_d(&mA1[0][0], 4, 4, &mB1[0][0], 4, 4, &mR1[0][0]);
for (int n=0; n<4; n++)
{
for (int m=0; m<4; m++)
{
cout<<mR1[n][m]<<" ";
}
cout<<endl;
}
return 0;
}