如图所示,这是一道关于矩阵乘法的问题,当然,学过线性代数之后,我们对于矩阵的乘法已经有了一个明确的概念,这个地方不再赘述,我在这里想提出的是另一个角度——向量
我们知道,矩阵本身可以写成向量组的形式,对于矩阵的乘法,其实也可以看作左边矩阵的行向量组和右边矩阵的列向量组的相乘结果
那么,我们就不妨自己写一个向量类(当然,这个向量不是vector),重载向量的乘法,这样的话就可以得到矩阵的乘积了
上代码吧
#include <bits/stdc++.h>
using namespace std;
//创建一个向量类
class vec
{
private:
int a[100];
int size;
public:
vec() //默认构造,向量维数为0
{
size=0;
}
void add(int x) //对向量进行补充完善
{
a[size]=x;
size++;
}
int operator*(const vec &v) //重载向量的乘法
{
int sum=0;
for(int i=0;i<size;i++)
{
sum+=a[i]*v.a[i];
}
return sum;
}
};
int main()
{
int m,n,k;
cin>>m>>n>>k;//m个行向量,k个列向量
//创建两个向量组
vec *v1=new vec[m];
vec *v2=new vec[k];
//先对第一个向量组进行完善
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
int x;
cin>>x;
v1[i].add(x);
}
}
//接着完善第二个向量组,因为输入顺序原因,需要二维数组保存矩阵信息,然后再录入
int **p=new int *[n];
for(int i=0;i<n;i++)
{
p[i]=new int [k];
}
//保存矩阵信息
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
cin>>p[i][j];
}
}
//录入向量组
for(int i=0;i<k;i++)
{
for(int j=0;j<n;j++)
{
v2[i].add(p[j][i]);
}
}
//再录入之后,数组就没啥用了,所以可以直接释放
for(int i=0;i<n;i++)
{
delete []p[i];
}
delete []p;
//接着进行向量组的相乘运算
for(int i=0;i<m;i++)
{
for(int j=0;j<k;j++)
{
cout<<v1[i]*v2[j]<<" ";
}
cout<<endl;
}
//好习惯:用完之后释放内存
delete []v1;
delete []v2;
return 0;
}