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
测试结果:

原写于2019年05月28日 12:37:45
C++实现矩阵类和向量类的更多相关文章
- 初识UML类图--类之间关系
		
前言 最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这 ...
 - [.net 面向对象编程基础] (9) 类和类的实例
		
[.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...
 - java异常处理:建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),
		
建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...
 - 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类
		
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
 - 日期操作类--GregorianCalendar类
		
GregorianCalendar--API JavaTM Platform Standard Ed. 6 GregorianCalendar类 Calendar类实现了公历日历,GregorianC ...
 - Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍
		
在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法.如下所示: 其方法的调用方式是在run方法中,如下所示: ...
 - C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
		
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
 - Java API —— Set接口 &  HashSet类 & LinkedHashSet类
		
1.Set接口 1)Set接口概述 一个不包含重复元素的 collection,无序(存储顺序和取出顺序不一致),唯一. (List有序,即存储顺序和取出顺序一致,可重复) ...
 - <九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性
		
设计类
 
随机推荐
- CSS 网站布局
			
Flex:https://www.html.cn/archives/8629 Grid:https://www.html.cn/archives/8510/ http://www.ruanyif ...
 - Java 中的同步集合与并发集合有什么区别?
			
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发 集合的可扩展性更高.在 Java1.5 之前程序员们只有同步集合来用且在多线程并发 的时候会导致争用,阻碍了系统的扩展性.Jav ...
 - Spring Framework 中有多少个模块,它们分别是什么?
			
Spring 核心容器 – 该层基本上是 Spring Framework 的核心.它包含以下模块: Spring Core Spring Bean SpEL (Spring Expression L ...
 - 全网最硬核 Java 新内存模型解析与实验单篇版(不断更新QA中)
			
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
 - js技术之拖动table标签
			
一.js技术之拖动table标签 起因:前几天公司,突然安排一个任务 任务描述:要求尺码table列表要像Excel表中一样可以直接移动整行尺码到任意行位置 技术点:采用ui的sortable技术来h ...
 - Demo示例——Bundle打包和加载
			
Unity游戏里面的场景.模型.图片等资源,是如何管理和加载的? 这就是本文要讲的资源管理方式--bundle打包和加载. 图片 Unity游戏资源管理有很多方式: (1)简单游戏比如demo,可以直 ...
 - 领域驱动(DDD)设计和开发实战
			
领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中.大部分关于此主题的著作和文章都以 Eric Evans 的书<领域驱动设计>为基础,主要从概念和设计的角度探讨领域建模 ...
 - 简单vue项目脚手架
			
简单vue项目脚手架 github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-ro ...
 - 【uniapp 开发】工具类 -- MathUtil
			
获取随机数 /* ** randomWord 产生任意长度随机字母数字组合 ** randomFlag 是否任意长度 min 任意长度最小位[固定位数] max 任意长度最大位 ** ** 生成6-1 ...
 - 将百度地图Demo抽取出来安到自己的程序中
			
今日所学: 使用百度地图ADK实现手机定位 [Android]使用百度.高德.腾讯地图SDK获取定位数据与屏幕截图分享到QQ_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 代码获取SHA1 (2 ...