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核心元素之设计类,类,属性,方法,可见性
设计类
随机推荐
- idea推送项目到github
参考: https://blog.csdn.net/SoWhatWorld/article/details/103817786?depth_1-utm_source=distribute.pc_rel ...
- freemarker与vue使用图片路径获取问题,可双单引号一起使用则可
<el-table :data="leftPage.datas" style="width: 100%" @selection-change=" ...
- 学习JDK之“Future机制==>多线程”
什么是Future接口 Future是java.util.concurrent.Future,是Java提供的接口,可以用来做异步执行的状态获取,它避免了异步任务在调用者那里阻塞等待,而是让调用者可以 ...
- 顺利通过EMC试验(2)
限制值 电磁波照射,静电放电敏感性
- 从问题找原因之CSS浮动清除
问题描述 浮动元素导致的后面img标签居中对齐"失败",如下图 <div> <div class="content1"> <div ...
- node-webkit文档翻译#package.json
title: node-webkit文档翻译#package.json date: 2013-12-07 21:38:25 tags: node-webkit 基本示例 { "main&qu ...
- 7步学会在Windows下上架iOS APP流程
之前用跨平台开发工具做了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发者账号,但没那么简单,还要用到Mac电脑的钥匙串申请发布证书和上传 ...
- 体验js之美第八课-面向对象创建和继承终结篇
概述 到这里我们讲说js面向对象的系列部分的最后一个课程,面向对象必须掌握两个东西一个是对象的创建一个是继承.这节课我们重点说说这两个问题最后我们说下在ES6里面面向对象怎么玩. 1对象的创建 我们第 ...
- python大佬养成计划----flask_bootstrap装饰网页
flask_bootstrap Bootstrap 是 Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代 Web 浏览器. Boo ...
- 前端系列——快速理解babel6配置过程
繁琐的配置? 你能快速读懂babel的官方文档吗? 你能根据官方文档快速配置好babelrc吗? 你能明白自己需要哪些插件吗? 没有搞明白这3个问题,请往下看. 快速理解babel 6 来看一张让人颤 ...