如果A是个x行y列的矩阵,B是个y行Z列的矩阵,把A和B相乘,其结果将是另一个\行2列的矩阵0。这个矩阵的每个元素是由下面的公式决定的:
结果矩阵中14这个值是通过2X-2加上-6X-3得到的。编写一个函数,用于执行两个矩阵的乘法。函数的原型应该如下:
void matrix_multiply( int *ml, int *m2, int *r,int x, int y, int z );
m1是一个x行y列的矩阵,m2是一个y行Z列的矩阵。这两个矩阵应该相乘,结果存储于r中,它是一个x行z列的矩阵。记住,你应该对公式作些修改。
//矩阵相乘
#include<stdio.h>
void matrix_multiply1(int (*m1),int (*m2),int (*r),int x,int y,int z);
void matrix_multiply2(int (*m1),int (*m2),int (*r),int x,int y,int z);
int main(void)
{
int m1[3][3]={
{
2,-6,1
},
{
3,5,2
},
{
1,-1,3
}
};
int m2[3][4]={
{
4,-2,-4,-5
},
{
-7,-3,6,7
}
,
{
-7,-3,6,7
}
};
int r[3][4]={
0
};
int q[3][4],r[3][4];
matrix_multiply1(m1,m2,q,3,3,4);
for(int t=0;t<3;t++)
{
for(int j=0;j<4;j++)
{
printf("%-10d ",q[t][j]);
}
printf("\n");
}
printf("\n");
matrix_multiply2(m1,m2,r,3,3,4);
for(int t=0;t<3;t++)
{
for(int j=0;j<4;j++)
{
printf("%-10d ",r[t][j]);
}
printf("\n");
}
return 0;
}
void matrix_multiply1(int (*m1),int (*m2),int (*r),int x,int y,int z)
{
int num=0,a,b;
int col=0,raw=0;
for(int i=0;i<x;i++)
{
raw=i*y;//行列
int rawcol=i*z;
for(int t=0;t<z;t++)
{
num=0;
for(int j=0;j<y;j++)
{
col=j*z;//行
a=*(m1+raw+j);
b=*(m2+col+t);
num+=a*b;
}}
*(r+rawcol+t)=num;
}
}
}
void matrix_multiply2(int (*m1),int (*m2),int (*r),int x,int y,int z)
{
register int *m1p;
register int *m2p;
register int k;
int row,column;
for(row=0;row<x;row++)
{
for(column=0;column<z;column++)
{
m1p=m1+row*y;
m2p=m2+column;
for(k=0;k<y;k++)
{
*r+=*m1p * *m2p;
m1p+=1;
m2p+=z;
}
r++;
}
}
}
输出结果: