今天做了一个矩阵乘法的题,一开始感觉没什么,但是在做的时候去发现这题不是那么简单的,(可能是我太菜了吧),所以写在这里,防止以后忘了。。。。。。
矩阵乘法,学过线性代数的话应该都知道规则
现在这里有两个矩阵
1 2 3
4 5 6
1 2 3 4 3 2 1
2 3 4 5 4 3 2
3 4 5 6 5 4 3
他们是可以相乘的因为矩阵1的列数等于矩阵2的行数,相乘的规则是,用矩阵亿的每行分别对应去乘矩阵2的每一列,并对结果叠加,举个例子:就上述矩阵而言,结果矩阵的第一行第一列就是矩阵1的第一行和矩阵2的第一列对应乘积的和
当然,思路纯暴力模拟。。。。。。
下面是代码
【1.单组------C实现】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int h1,l1,h2,l2,h3,l3;//h表示行数,l表示列数
int a[100][100],b[100][100],c[100][100];//a吧,是原矩阵,c是相乘后的矩阵
scanf("%d%d%d%d",&h1,&l1,&h2,&l2);
if(l1!=h2)//判断矩阵是否能相乘
printf("0\n");
else
{
h3=h1;//对相乘后的矩阵行列赋值
l3=l2;
int i,j;
for(i=0;i<h1;i++)//输入原矩阵
for(j=0;j<l1;j++)
scanf("%d",&a[i][j]);
for(i=0;i<h2;i++)
for(j=0;j<l2;j++)
scanf("%d",&b[i][j]);
int p=0,q=0;//用来调整矩阵乘法的参数
for(i=0;i<h3;i++)
{
for(j=0;j<l3;j++)
{
int t;
p=0;
q=0;
for(t=0;t<l1;t++)//每次需要循环l1或者h2次,并对应位置相乘叠加
{
c[i][j]+=a[i][p]*b[q][j];
p++;
q++;
}
}
}
for(i=0;i<h3;i++)
for(j=0;j<l3;j++)
{
j==l3-1?printf("%d\n",c[i][j]):printf("%d ",c[i][j]);
}
}
return 0;
}
【2.多组输入------C++实现】
多组情况需要注意的是每次需要对相乘得到的矩阵清空,因为二维数组不好清空(其实是我不会),所以这里的方法是再每次输出后直接将对应位置赋值为0即可
//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;2 3 3 7
int main()
{
ios::sync_with_stdio(false);
int h1,l1,h2,l2,h3,l3;
int a[100][100],b[100][100],c[100][100];
while(cin>>h1>>l1>>h2>>l2)
{
if(l1!=h2)
cout<<'0'<<endl;
else
{
h3=h1;
l3=l2;
for(int i=0;i<h1;i++)
{
for(int j=0;j<l1;j++)
{
cin>>a[i][j];
}
}
for(int i=0;i<h2;i++)
{
for(int j=0;j<l2;j++)
{
cin>>b[i][j];
}
}
int p=0,q=0;
for(int i=0;i<h3;i++)
{
for(int j=0;j<l3;j++)
{
p=0;
q=0;
for(int t=0;t<l1;t++)
{
c[i][j]+=a[i][p]*b[q][j];
p++;
q++;
}
}
}
for(int i=0;i<h3;i++)
{
for(int j=0;j<l3;j++)
{
j==l3-1?cout<<c[i][j]<<endl:cout<<c[i][j]<<" ";
c[i][j]=0;
}
}
}
}
return 0;
}