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核心元素之设计类,类,属性,方法,可见性
设计类
随机推荐
- bash shell 中的 hash 命令有什么作用?
linux 命令'hash'管理着一个内置的哈希表,记录了已执行过的命令的完整路径,用该命令可以打印出你所使用过的命令以及执行的次数. [root@localhost ~]# hashhits com ...
- Redis的数据类型操作(二)
1.String:key-value(做缓存) Redis中所有的数据都是字符串.命令不区分大小写,key是区分大小写的.Redis是单线程的.Redis中不适合保存内容大的数据. get.set.i ...
- Java 中堆和栈有什么区别?
JVM 中堆和栈属于不同的内存区域,使用目的也不同.栈常用于保存方法帧和局 部变量,而对象总是在堆上分配.栈通常都比堆小,也不会在多个线程之间共享, 而堆被整个 JVM 的所有线程共享.
- github 编写README时常用的写法
参考:https://github.com/HeTingwei/ReadmeLearn#%E7%BC%96%E5%86%99readme%E6%97%B6%E5%B8%B8%E7%94%A8%E7%9 ...
- 解决联想笔记本 安装VM虚拟机后每次启动都会导致电脑蓝屏问题
现象描述: pc为联想笔记本 系统是微软家庭中文版,每次启动VM虚拟机都会出现蓝屏现象,出现错误代码system_service_exception 原因及解决方法: 对于Windows10家庭版 ...
- 安装Prettier
安装Prettier Prettier是优化代码格式的工具,可优化JavaScript.TypeScript.JSON等代码及配置文件. 使用命令yarn add -D --exact prettie ...
- Thoughtworks Technology Radar #26 技术雷达26期
Thoughtworks Technology Radar #26 Techniques Adopt Four key metrics Google Cloud's DevOps Research a ...
- Linux 0.11源码阅读笔记-文件管理
Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...
- 【编译原理】自底向上分析方法——LR文法分析方法的总结
LR(0).SLR(1).LR(1).LALR(1) de 若干方面的区别 目录 推导过程 分析能力 本质区别 文法对比 可以适当利用物理意义对二义性文法进行冲突处理 推导过程 LR(0)的基础上才有 ...
- tracert命令简述
1. 路由跟踪在线Tracert工具说明 Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径.Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP ...