C++实现重载矩阵的部分运算符

 更新时间:2022年10月28日 11:21:20   作者:青空を越えて  
这篇文章主要为大家详细介绍了如何利用C++实现重载矩阵的部分运算符,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下

前言

博主本人为C++菜鸟一只,本篇博客也是第一次写,主要目的用于自己mark,如有错误欢迎指出

本博客代码为我做C++实验时的代码,由于自己是菜鸟,所以代码内容掌握的也不是很熟。

在此记下此篇,待到日后查看也是属于自己青春的一部分吧。

正文

整个工程分为头文件,source,以及main构成。

工程的目的为实现对矩阵运算符‘+’,‘-’,‘*’,‘==’,‘!=’,‘<<’和‘>>’的重载,并在main中测试其情况。

以下为头文件

//Matrix.h
#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>
using namespace std;
class Matrix
{
public:
    Matrix operator + (Matrix&a);//重载 +
    Matrix operator - (Matrix&b);//重载 -
    Matrix operator * (Matrix&c);//重载 *
    bool operator == (Matrix&d);//重载 ==
    bool operator != (Matrix&e);//重载 !=
    friend ostream& operator << (ostream&,Matrix&);//重载 <<
    friend istream& operator>>(istream&,Matrix&);//重载 >>
    void setMatrix(int a, int b);//设置矩阵行列
private:
    int row;
    int col;
    int matrix[200][200];
};
#endif

关于 void setMatrix(int a, int b); 其实这个函数可以不设置,利用构造函数可以完成该功能,甚至更完美。但我有些小懒,就不想去修改了,如果出事的话…QAQ还是希望不会出事吧。

还有就是,矩阵我设置成了200*200,其实可以利用new调用动态内存来更好的实现,但由于我太菜,不想去用二重指针,故放弃了这个方案。

以下为cpp文件

//Matrix.cpp
#include <iostream>
#include "Matrix.h"

using namespace std;

void Matrix::setMatrix(int a, int b)//构造函数可以取代这个
{
    row=a;
    col=b;
}

Matrix Matrix::operator + (Matrix &a)//重载 +
{
    if (row!=a.row||col!=a.col)
    {
        throw"这两个矩阵不可相加";
    }

抛出异常,之所以使用这个,是因为没法cout<<“错误”;之后return 0强制退出,因为返回类型是矩阵,我当时没有尝试利用exit()函数…(果然我太菜了QAQ)

    else//矩阵元素相加
    {
        Matrix sum;//创建新矩阵,为接下来返回矩阵用
        sum.row=row;
        sum.col=col;
        for(int i=0; i<sum.row; i++)
        {
            for(int j=0; j<sum.col; j++)
            {
                sum.matrix[i][j]=matrix[i][j]+a.matrix[i][j];//矩阵加法计算规则
            }
        }
        return sum;//返回值为sum矩阵
    }
}

计算规则需要自己确定(代几应该都学过),如这个是加法,规则如上:sum矩阵的各位置元素分别为’+‘前矩阵和’+'后矩阵对应位置元素的和。

Matrix Matrix::operator-(Matrix &b)//重载 -
{
    if (row!=b.row||col!=b.col)
    {
        throw"这两个矩阵不可相减!";//抛出异常
    }
    else//矩阵元素相减
    {
        Matrix reduce;
        reduce.row=row;
        reduce.col=col;
        for(int i=0; i<reduce.row; i++)
        {
            for(int j=0; j<reduce.col; j++)
            {
                reduce.matrix[i][j]=matrix[i][j]-b.matrix[i][j];//减法规则
            }
        }
        return reduce;
    }
}

减法和加法类似,可以模仿着加法来,注意下计算规则就行

Matrix Matrix::operator*(Matrix&c)
{
    if (col!=c.row)
    {
        throw"这两个矩阵不可相乘!";
    }
    else//矩阵元素相乘
    {
        Matrix multi;
        multi.row=row;//新矩阵的行等于第一个矩阵的行
        multi.col=c.col;//新矩阵的列等于第二关矩阵的列
        for(int i=0; i<multi.row; i++)
        {
            for(int j=0; j<multi.col; j++)//为新矩阵元素赋值时注意新矩阵元素个数
            {
                multi.matrix[i][j]=0;//初始化新矩阵元素为0,为后面递加做准备
                for(int k=0; k<col; k++)
                {
                    multi.matrix[i][j]+=matrix[i][k]*c.matrix[k][j];//乘法计算规则
                }
            }
        }
        return multi;
    }
}

关于矩阵乘法的规则可以拿张纸先演算一下,这样方便自己理解。

bool Matrix::operator == (Matrix&d)//判断矩阵是否相等
{
    if (row!=d.row||col!=d.col)//先判断行列是否相等
    {
        return false;
    }
    for(int i=0; i<row; i++)//再判断元素是否相等,只要有一个不等,立刻返回false
    {
        for(int j=0; j<col; j++)
        {
            if(matrix[i][j]!=d.matrix[i][j])
            {
                return false;
            }
        }
    }
    return true;
}

bool Matrix::operator != (Matrix&e)//判断矩阵是否不等
{
    if (row!=e.row||col!=e.col)
    {
        return true;//原理同上,注意返回相反值
    }
    for(int i=0; i<row; i++)//原理同上,注意返回相反值
    {
        for(int j=0; j<col; j++)
        {
            if(matrix[i][j]!=e.matrix[i][j])
            {
                return true;
            }
        }
    }
    return false;
}

ostream& operator << (ostream &out,Matrix& mat)//重载输出矩阵
{
    for (int i = 0; i < mat.row; i++)
    {
        for (int j = 0; j < mat.col; j++)
        {
            out << mat.matrix[i][j];//将矩阵元素输出,注意矩阵元素的间距
            if (j == mat.col - 1)
                out << endl;
            else out << " ";
        }
    }
    return out;//返回输出流
}

istream& operator>>(istream&in, Matrix &mat)//重载输入矩阵
{
    for (int i = 0; i < mat.row; i++)
    {
        for (int j = 0; j < mat.col; j++)
        {
            in >> mat.matrix[i][j];//由行到列一次输入元素
        }
    }
    return in;//返回输入流
}

以下为main.cpp,主要用于测试。

//main.cpp
#include <iostream>
#include "Matrix.h"

using namespace std;

int main()
{
    int row, col;
    Matrix A;
    cout<<"Please input rows cols:\n";
    cin>>row>>col;//输入行列
    A.setMatrix(row,col);//为矩阵设置行列
    cout<<"Please input your matrix elements:\n";
    cin>>A;//输入元素,因为已经重载了>>,所以可以直接在>>后面加矩阵类A
    cout<<"以下是你创建的第一个矩阵!\n";
    cout<<A<<endl;//输出元素,因为已经重载了<<,所以可以直接在<<后面加矩阵类A
    Matrix B;//另一个矩阵
    cout<<"Please input another one's rows cols:\n";
    cin>>row>>col;
    B.setMatrix(row,col);
    cout<<"Please input your matrix elements:\n";
    cin>>B;
    cout<<"以下是你创建的第二个矩阵!\n";
    cout<<B<<endl;
    try//这是和throw,catch配合使用的关键字。具体使用可以谷歌或者百度
    {
        Matrix sum=A+B;
        cout<<"两个矩阵相加为:\n";
        cout<<sum<<endl;
    }
    catch (const char* msg)//如果throw抛出了异常,会(根据情况)捕获异常
    {
        cerr<< msg << endl;//打印异常语句
    }
    try
    {
        Matrix reduce=A-B;
        cout<<"两个矩阵相减为:\n";
        cout<<reduce<<endl;
    }
    catch (const char* msg)
    {
        cerr<< msg << endl;
    }
    try
    {
        Matrix multi=A*B;
        cout<<"两个矩阵相乘为:\n";
        cout<<multi<<endl;
    }
    catch (const char* msg)
    {
        cerr<< msg << endl;
    }
    if(A==B)//测试 == 是否重载成功
        cout<<"两个矩阵相等!( == 为真测试通过!)"<<endl;
    else
        cout<<"两个矩阵不相等!( == 为假测试通过!)"<<endl;
    if(A!=B)// 测试 !=是否重载成功
        cout<<"矩阵不相等!( != 为真测试通过!)"<<endl;
    else
        cout<<"矩阵相等!( != 为假测试通过!)"<<endl;
    return 0;
}

运行结果

矩阵相乘:

矩阵相加减:

以上就是C++实现重载矩阵的部分运算符的详细内容,更多关于C++重载矩阵运算符的资料请关注脚本之家其它相关文章!

相关文章

  • Qt操作SQLite数据库的教程详解

    Qt操作SQLite数据库的教程详解

    SQLite是一款开源、轻量级、跨平台的数据库,无需server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。本文为大家介绍了Qt操作SQLite数据库的示例,希望对大家有所帮助
    2022-12-12
  • C语言中各种运算类型全面总结

    C语言中各种运算类型全面总结

    C语言运算符是说明特定操作的符号,它是构造C语言表达式的工具,C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都为运算符处理
    2022-04-04
  • 详解Dijkstra算法之最短路径问题

    详解Dijkstra算法之最短路径问题

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。本文将介绍其原理,并用C++实现
    2021-06-06
  • Qt实现TCP同步与异步读写消息的示例代码

    Qt实现TCP同步与异步读写消息的示例代码

    这篇文章主要为大家详细介绍了如何在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息,有需要的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 用c语言实现和平精英的完整代码

    用c语言实现和平精英的完整代码

    这篇文章主要介绍了用c语言实现和平精英的完整代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C++11原子操作详解

    C++11原子操作详解

    这篇文章主要为大家介绍了C++的原子操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C++ 关于MFC List Control 控件的总结

    C++ 关于MFC List Control 控件的总结

    这篇文章主要介绍了C++ 关于MFC List Control 控件的总结的相关资料,十分的详细,有需要的朋友可以参考下
    2015-06-06
  • C++中检查vector是否包含给定元素的几种方式详解

    C++中检查vector是否包含给定元素的几种方式详解

    这篇文章主要介绍了C++中检查vector是否包含给定元素的几种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • C语言分治法实现归并排序

    C语言分治法实现归并排序

    这篇文章主要为大家详细介绍了C语言实现归并排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 亚马逊经典面试题实例详解

    亚马逊经典面试题实例详解

    这篇文章主要介绍了亚马逊经典面试题实例详解的相关资料,希望通过本文能帮助到大家,让大家学习理解这部分内容,需要的朋友可以参考下
    2017-10-10

最新评论