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++实现矩阵类和向量类的更多相关文章

  1. 初识UML类图--类之间关系

    前言 最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这 ...

  2. [.net 面向对象编程基础] (9) 类和类的实例

    [.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...

  3. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  4. 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  5. 日期操作类--GregorianCalendar类

    GregorianCalendar--API JavaTM Platform Standard Ed. 6 GregorianCalendar类 Calendar类实现了公历日历,GregorianC ...

  6. Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍

    在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法.如下所示: 其方法的调用方式是在run方法中,如下所示: ...

  7. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;

    ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口:       2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...

  8. Java API —— Set接口 & HashSet类 & LinkedHashSet类

    1.Set接口     1)Set接口概述         一个不包含重复元素的 collection,无序(存储顺序和取出顺序不一致),唯一.  (List有序,即存储顺序和取出顺序一致,可重复) ...

  9. <九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性

    设计类

随机推荐

  1. 高度不定,宽100%,内一div高不确定,如何实现垂直居中?

    verticle-align: middle; 绝对定位50%加translateY(-50%) 绝对定位,上下左右全0,margin:auto

  2. Mybatis Plus使用租户过滤无效解决方案

    异常内容: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Pe ...

  3. SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?

    答:一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外, ...

  4. JS Promise对象学习

    Promise对象的三个状态 pending(进行中) fulfilled(已成功) rejected(已失败) Promise代表一个异步操作,对象的状态一旦改变,就不会再改变 Promise构造函 ...

  5. 信号量,semaphore源代码之我见

    信号量,Semaphore,一个限定访问线程数量的工具类,属于并发包java.util.concurrent 里面的类. Semaphore,内部提供了构造方法(包含默认的非公平信号量构造方法,已经可 ...

  6. sudo rosdep init 出现 ERROR: cannot download default sources list from:错误解决方法

    关于安装ROS时出现的rosdep init错误 sudo rosdep init ERROR: cannot download default sources list from: https:// ...

  7. js 关于setTimeout和Promise执行顺序问题

    js 关于setTimeout和Promise执行顺序问题 异步 -- Promise和setTimeout 执行顺序   Promise 和 setTimeout 到底谁先执行 定时器的介绍 Jav ...

  8. Mybatis 实现批量插入和批量删除源码实例

    Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...

  9. spring框架Aop学习

  10. 写入MySQL中文乱码问题

    相信使用数据库进行存储的大家都遇到过中文乱码问题,如何彻底解决?我百度了很多资料与博客,想把自己的经历总结起来给大家参考一下,接下来我先罗列一下大部分修改乱码问题的方法: 1.   修改MySQL数据 ...