C++实现矩阵类和向量类

C++期末作业内容,写完之后觉得过于臃肿,又重新搞了个新的。新的当作业交,旧的拿来给同学参考。

【问题描述】请仿照复数类,设计一个矩阵类,设计矩阵类的构成元素
1.编写构造函数完成初始化
2.编写成员函数,读入一个矩阵,输出一个矩阵
3.编写成员函数,计算两个矩阵相加、相减、点乘
4.编写成员函数,利用运算符重载计算两个矩阵的相加、相乘、点乘、输出,并输出计算结果
例如输入3 3,表示是一个3*3的矩阵,输入一个矩阵
1.0 1.0 1.0
3.0 3.0 3.0
6.0 6.0 6.0
再输入3 3,再输入一个矩阵
9.0 9.0 9.0
6.0 6.0 6.0
5.0 5.0 5.0
输出相加的结果为
10.0 10.0 10.0
9.0 9.0 9.0
11.0 11.0 11.0
输出相减的结果为
-8.0 -8.0 -8.0
-3.0 -3.0 -3.0
1.0 1.0 1.0
输出点乘的结果为
20.0 20.0 20.0
60.0 60.0 60.0
120.0 120.0 120.0

【问题描述】基于以上的矩阵类和向量类,编写友元函数计算矩阵乘以向量
例如
例如输入3 3,表示是一个3*3的矩阵,输入一个矩阵
1.0 1.0 1.0
3.0 3.0 3.0
6.0 6.0 6.0
例如输入3,表示是一个3维列向量,输入一个列向量
1.2 3.4 5.6
输出结果为
10.2 30.6 61.2

#include <iostream>
using namespace std;
const int MAXDIMENSION=100; //维数上限 
class Vector{ //向量类 
	private:
		double value[MAXDIMENSION]; //向量的值 
		int dimension; //向量的维数 
	public:
		Vector(){}
		Vector(Vector& source){
			dimension=source.getDimension();
			for(int i=0;i<dimension;i++){
				value[i]=source.getValue(i);
			}
		}
		void setValue(int i,double newvalue){
			value[i]=newvalue;
		}
		double getValue(int i){
			return value[i];
		}
		void setDimension(int newDimension){
			dimension=newDimension;
		}
		int getDimension(){
			return dimension;
		}
		void input(){
			cin>>dimension;
			for(int i=0;i<dimension;i++){
				cin>>value[i];
			}
		}
		void output(){
			for(int i=0;i<dimension;i++){
				cout<<value[i]<<' ';
			}
			cout<<'\n';
		}
		Vector operator +(Vector& right){
			Vector left(*this);
			for(int i=0;i<dimension;i++){
				left.setValue(i,left.getValue(i)+right.getValue(i));
			}
			return left;
		}
		Vector operator -(Vector& right){
			Vector left(*this);
			for(int i=0;i<dimension;i++){
				left.setValue(i,left.getValue(i)-right.getValue(i));
			}
			return left;
		}
		double operator *(Vector& right){ //向量相乘,结果为一个数,而不是向量
			Vector left(*this);
			double ans=0;
			for(int i=0;i<dimension;i++){
				ans+=left.getValue(i)*right.getValue(i);
			}
			return ans;
		}
};
class Matrix{ //矩阵类 
	private:
		double value[MAXDIMENSION][MAXDIMENSION]; //矩阵的值 
		int row,column; //行数  列数 
	public:
		Matrix(){}
		Matrix(Matrix& source){
			row=source.getRow();
			column=source.getColumn();
			for(int i=0;i<row;i++){
				for(int j=0;j<column;j++){
					value[i][j]=source.getValue(i,j);
				}
			}
		}
		void setValue(int r,int c,double newvalue){
			value[r][c]=newvalue;
		}
		double getValue(int r,int c){
			return value[r][c];
		}
		void setRow(int newRow){
			row=newRow;
		}
		int getRow(){
			return row;
		}
		void setColumn(int newColumn){
			column=newColumn;
		}
		int getColumn(){
			return column;
		}
		void input(){
			cin>>row>>column;
			for(int i=0;i<row;i++){
				for(int j=0;j<column;j++){
					cin>>value[i][j];
				}
			}
		}
		void output(){
			for(int i=0;i<row;i++){
				for(int j=0;j<column;j++){
					cout<<value[i][j]<<' ';
				}
				cout<<'\n';
			}
		}
		Matrix operator +(Matrix& right){
			Matrix left(*this);
			for(int i=0;i<row;i++){
				for(int j=0;j<column;j++){
					left.setValue(i,j,left.getValue(i,j)+right.getValue(i,j));
				}
			}
			return left;
		}
		Matrix operator -(Matrix& right){
			Matrix left(*this);
			for(int i=0;i<row;i++){
				for(int j=0;j<column;j++){
					left.setValue(i,j,left.getValue(i,j)-right.getValue(i,j));
				}
			}
			return left;
		}
		Matrix operator *(Matrix& right){
			Matrix result;
			result.setRow(getRow());
			result.setColumn(right.getColumn());
			for(int i=0;i<result.getRow();i++){
				for(int j=0;j<result.getColumn();j++){
					for(int k=0;k<this->getColumn();k++){
						result.setValue(i,j,result.getValue(i,j)+this->getValue(i,k)*right.getValue(k,j));
					}
				}
			}
			return result;
		}
		Matrix mulVector(Vector vec){ //矩阵乘向量,我觉得并不需要用到友元函数 
			Matrix result;
			result.setColumn(vec.getDimension());
			result.setRow(1);
			for(int i=0;i<this->getRow();i++){
				for(int j=0;j<this->getColumn();j++){
					result.setValue(0,i,result.getValue(0,i)+this->getValue(i,j)*vec.getValue(j));
				}
			}
			return result;
		}
};

int main(){
	Vector a,b,c;
	Matrix d,e,f;
	cout<<"请输入向量维数和值:\n";
	a.input();
	cout<<"请输入向量维数和值:\n";
	b.input();
	cout<<"向量相加为:\n";
	c=a+b;
	c.output();
	cout<<"向量相减为:\n";
	c=a-b;
	c.output();
	cout<<"向量相乘为:\n";
	cout<<a*b<<"\n";
	cout<<"请输入矩阵的行数列数和值:\n";
	d.input();
	cout<<"请输入矩阵的行数列数和值:\n";
	e.input();
	cout<<"矩阵相加为:\n";
	f=d+e;
	f.output();
	cout<<"矩阵相减为:\n";
	f=d-e;
	f.output();
	cout<<"矩阵相乘为:\n";
	f=d*e;
	f.output();
	cout<<"请输入矩阵的行数列数和值:\n";
	e.input();
	cout<<"请输入向量的维数和值:\n";
	a.input();
	cout<<"矩阵乘向量结果为:\n";
	f=e.mulVector(a);
	f.output();
	return 0;
}

测试数据:

3
1.2 3.4 5.6
3
7.8 9.0 2.1
3 3
1.0 1.0 1.0
3.0 3.0 3.0
6.0 6.0 6.0
3 3
9.0 9.0 9.0
6.0 6.0 6.0
5.0 5.0 5.0
3 3
1.0 1.0 1.0
3.0 3.0 3.0
6.0 6.0 6.0
3
1.2 3.4 5.6

测试结果:
测试结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值