矩阵与向量相乘(修改版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.cpp
**********************************
#include<iostream>
using namespace std;
#include "2.h"
int main() {
int row,col;
cout<<"请输入矩阵的行数与列数:";
cin>>row>>col;
Mat m(row,col);
Vec v(col);
Vec r(row);
cout<<"请输入矩阵的元素 \n";
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
cin>>m.element(i,j);
}
cout<<"请输入向量的元素 \n";
for(i=0;i<col;i++)
cin>>v.element(i);
Mul(m,v,r);
cout<<"the number of the Mat: "<<m.HowMat()<<endl;
cout<<"the number of the Vec: "<<v.HowVec()<<endl;
cout<<"矩阵: \n";
m.display();
cout<<"与向量: \n";
v.display();
cout<<"的乘积:\n";
r.display();
return 0;
}
2.h
**************************
#include<cstdlib>
using namespace std;
#define string
class Matrix
{
public:
virtual void display()=0;
};
//矩阵类定义
class Mat: public Matrix
{
int *p_data;
int row,col;
static int num_Mats;
public:
Mat(int r,int c);
~Mat();
int &element(int r,int j); //访问矩阵元素
int element(int i,int j) const; //访问矩阵元素(为常量对象提供)
int dim_row()const;
int dim_col()const;
void display();
static int HowMat();
};
//向量类的定义
class Vec: public Matrix
{
int *p_data;
int num;
static int num_Vecs;
public:
Vec(int n);
~Vec();
int &element(int i); //访问向量元素
int element(int i) const;
int dim() const;
void display() ;
static int HowVec();
};
void Mul(const Mat &m,const Vec &v,Vec &r) ;
3.cpp
******************************
#include<iostream>
using namespace std;
#include "2.h"
int Mat::num_Mats = 0;
int Vec::num_Vecs = 0;
int Mat::HowMat()
{
return num_Mats;
}
int Vec::HowVec()
{
return num_Vecs;
}
//矩阵类的实现
Mat::Mat(int r,int c)
{
if(r <=0|| c<=0)
{
cout<<"矩阵尺寸不合法!"<<endl;
exit(-1);
}
row=r;col=c;
p_data =new int[row*col];
num_Mats++;
}
Mat::~Mat()
{
delete []p_data;
num_Mats--;
}
int & Mat::element(int i,int j)
{
if(i<0|| i>=row || j<0 ||j>=col)
{
cout<<"the index is wrong!"<<endl;
exit(-1);
}
return *(p_data+i*col+j);
}
int Mat::elem
ent(int i,int j) const {
if(i<0||i>=row || j<0||j>=col)
{
cout<<"矩阵下标越界! \n"<<endl;
exit(-1);
}
return *(p_data+i*col+j);
}
int Mat::dim_row()const
{
return row;
}
int Mat::dim_col()const
{
return col;
}
void Mat::display()
{
int *p=p_data;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cout<<*p<<' ';
p++;
}
cout<<endl;
}
}
//向量类的实现
Vec::Vec(int n)
{
if(n<=0)
{
cout<<"向量尺寸不合法!"<<endl;
exit(-1);
}
num =n;
p_data=new int[num];
num_Vecs++;
}
Vec::~Vec()
{
delete []p_data;
num_Vecs--;
}
int &Vec::element(int i)
{
if(i<0||i>= num)
exit(-1);
return p_data[i];
}
int Vec::element(int i) const
{
if(i<0||i>= num)
exit(-1);
return p_data[i];
}
int Vec::dim() const
{
return num;
}
void Vec::display() const
{
int *p=p_data;
for(int i=0;i<num;i++,p++)
cout<<*p<<' ';
cout<<endl;
}
//矩阵与向量相乘
void Mul(const Mat &m,const Vec &v,Vec &r)
{
if(m.dim_col()!=v.dim() ||
m.dim_row()!=r.dim())
{
cerr << "矩阵与向量尺寸不匹配! \n ";
exit(-1);
}
int row=m.dim_row(),col=m.dim_col();
for(int i=0;i<row;i++)
{
r.element(i)=0;
for(int j=0;j<col;j++)
{
r.element(i)+=m.element(i,j)*v.element(j);
}
}
}