矩阵相乘
写出行列不同的矩阵相乘的关键就是充分理解它们相乘之后得出的结果是怎么样的,对于本人代码新人,我还是理解了些许时候的。
样例:
第一个数组:两行三列{2 3 2 1 5 3};
第二个数组:三行两列{5 3 2 2 1 4};
样例得数:
三行三列数组:
根据答案输出可以看出其中规律,我们先把每一项“+”后面的算式舍去不看,我们会发现第一个数组的每一行的第一个数乘以对应的第二个数组的该行所有元素,一一对应(即第一个数组第一行第一个数分别乘以第二个数组的第一个行的每一个元素,得到相乘后的数组中第一行的所有元素)以此类推,第一个数组的第二行的第一个数乘以第二个数乘以第二个数组第二行的每一个元素,得到相乘后数组的第二行所有元素。
最后我们看到样例得数中‘+’后面的数据,仔细观察就会发现用了第一个数组的每一行的第二个元素去分别乘以第二个数组对应行的所有数,再分别相加。
下面看一下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int a[100][100]= {0};
int b[100][100]= {0};
int c[100][100]= {0};
int m,n,h,k,f,e;
printf("please input M and N:");//输入第一个数组的行数和列数
scanf("%d,%d",&m,&n);
printf("please input the first array:\n");//输入数组1
for(i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
}
}
printf("please input N and K:");//输入第二个数组的行数和列数
scanf("%d,%d",&n,&k);
printf("please input the second array:\n");//输入数组2
for(i=0; i<n; i++)
{
for (j=0; j<k; j++)
{
scanf("%d",&b[i][j]);
}
}
for(h=0;h<n;h++)//第一个矩阵的列数和第二个矩阵的行数
{
for(e=0;e<m;e++)//第一个矩阵的行数
{
for(f=0;f<k;f++)//第二个矩阵的列数
{
c[e][f]=a[e][h]*b[h][f]+c[e][f];//此处就是前面解释的相乘后的数组怎么得来的
}
}
}
for(i=0; i<m; i++)
{
for (j=0; j<k; j++)
{
printf("%3d",c[i][j]);
}
printf("\n");
}
return 0;
}
下面看一下输出:
这里有个地方值得注意的是,题目要求了第一个数组的列数要和第二个数组的行数相等。