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. overflow原理?

    overflow: hidden能清除块内子元素的浮动影响. 因为该属性进行超出隐藏时需要计算盒子内所有元素的高度, 所以会隐式清除浮动 创建BFC条件(满足一个): float的值不为none: o ...

  2. Shiro Session放到Redis中常遇到的问题

    Shiro会话管理:https://shiro.apache.org/session-management.html#SessionManagement-CustomSessionIDs Redis主 ...

  3. Springmvc入门基础(六) ---拦截器应用demo

    1.拦截器定义 Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理. 2.拦截器demo demo需求: 拦截用户请求,判断用 ...

  4. Dubbo telnet 命令能做什么?

    dubbo 服务发布之后,我们可以利用 telnet 命令进行调试.管理. Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令 连接服务 telnet localhost 20880 ...

  5. 简述 Mybatis 的插件运行原理,以及如何编写一个插件。

    Mybatis 仅可以编写针对 ParameterHandler.ResultSetHandler. StatementHandler.Executor 这 4 种接口的插件,Mybatis 使用 J ...

  6. nginx静态资源服务器配置

    编辑 nginx.conf server { listen 80; server_name file.youxiu326.xin; location /image/ { #访问 file.youxiu ...

  7. NetCore微服务实现事务一致性masstransit之saga使用

    demo如下,一个订单处理的小例子: 首先看看结果很简单: 核心代码如下: using MassTransit; using Microsoft.Extensions.DependencyInject ...

  8. numpy入门—Numpy的核心array对象以及创建array的方法

    Numpy的核心array对象以及创建array的方法 array对象的背景: Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组: Python的Li ...

  9. D2Admin 8月更新: 高级数据持久化|标签页右键|模块化等

    剧透:这次,D2Admin 带来了其它同类模板都没有的"花式"数据持久化功能,以及极少同类产品才有的标签页右键控制... 概述 D2Admin 7月份更新到了 1.1.5 版本 相 ...

  10. 将word文件转为excel文件

    有些word文件里的数据是有顺序或者规律,想转成表格的形式,下面就以我要转的word为例. 我的word文件是这样的 1.word转txt(文本文件) 文件--->另存为--->路径--- ...