C++利用类实现矩阵的数乘,乘法以及点乘

 更新时间:2022年11月17日 11:48:33   作者:cc‍  
这篇文章主要为大家详细介绍了C++如何利用类实现矩阵的数乘,乘法以及点乘,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下

 程序的探索经过如下:

 ①首先考虑到后续代码的维护及其复用性,为此考虑用类实现

 ②矩阵基本的类成员应该包括矩阵的行列数以及矩阵名以及初始化、输入输出

 ③由于需要实现三种矩阵乘法运算,为此考虑利用运算符重载使用友元函数重载* +运算符分别实   现矩阵的数乘、乘法以及点乘

源码如下:

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long ll;
class Matrix                                          //封装一个矩阵类便于后续使用
{
    int row;
    int col;                                       
    int** base;                                       //二维数组存放矩阵
public:
    Matrix(int r,int c)                               //构造函数初始化
    {
        row = r;
        col = c;
        create();
    }
    //在外部则写作:
    //Matrix::Matrix(int r, int c)
    //{
    //  row=r; col=c; create();
    //} 
    Matrix(const Matrix& e)                            //拷贝构造函数
    {
        row = e.getrow();
        col = e.getcol();
        create();
        for(int i = 0;i<row;i++)
        {
            for(int j = 0;j<col;j++)
            {
                base[i][j] = e[i][j];
            }
        }
    }
    ~Matrix()                                          //析构函数防止内存泄露
    {
        destroy();
    }
    Matrix& operator=(const Matrix& e)                //重载等于号实现深拷贝
    {
        destroy();
        row = e.getrow();
        col = e.getcol();
        create();
        for(int i = 0;i<row;i++)
        {
            for(int j = 0;j<col;j++)
            {
                base[i][j] = e[i][j];
            }
        }
        return *this;
    }
    int* operator[](int i)const                       //重载[]以方便用"变量名[][]" 的形式读写矩阵内容
    {
        return base[i];
    }
    int getrow()const                                 //对外提供矩阵信息
    {
        return row;
    }
    int getcol()const                                  //对外提供矩阵信息
    {
        return col;
    }
    friend Matrix operator*(int n,Matrix &e);        //重载 * 实现数乘 
    friend Matrix operator*(Matrix& e,Matrix& f);    //重载 * 实现矩阵乘法 
    friend Matrix operator+(Matrix& e,Matrix& f);    //重载 + 实现矩阵点乘 
private:
    void create()                                      //创建一个二维数组
    {
        base = new int*[row];
        for(int i = 0;i<row;i++)
        {
            base[i] = new int[col];
        }
    }
    void destroy()                                     //释放一个二维数组
    {
        for(int i = 0;i<row;i++)
        {
            delete[] base[i];
        }
        delete[] base;
    }
};
ostream& operator<<(ostream& cout,const Matrix& e)     //重载<<方便输出
{
    int r = e.getrow();
    int c = e.getcol();
    cout<<"row="<<r<<" col="<<c<<endl;
    for(int i = 0;i<r;i++)
    {
        for(int j = 0;j<c;j++)
        {
            cout<<e[i][j]<<" ";
        }
        cout<<endl;
    }
    return cout;
}
istream& operator>>(istream& cin,Matrix& e)           //重载>>方便输入
{ 
    int r = e.getrow();
    int c = e.getcol();
    for(int i = 0;i<r;i++)
    {
        for(int j = 0;j<c;j++)
        {
            cin>>e[i][j];
        }
    }
    return cin;
}
Matrix operator*(int n,Matrix& e)              //重载 * 实现数乘
{
    Matrix ret(e.getrow(),e.getcol()); 
    for(int i=0;i<e.getrow();++i)
     {
         for(int j=0;j<e.getcol();++j)
         {
             ret[i][j]=n*e[i][j];
         }
     }
    return ret;      
}
Matrix operator*(Matrix& e,Matrix& f)        //重载 * 实现矩阵乘法 
{
    Matrix ret(e.getrow(),f.getcol());
    for(int i = 0;i<e.getrow();++i)
    {
        for(int j = 0;j<f.getcol();++j)
        {
             ret[i][j] = 0;
             for(int k = 0;k<e.getcol();++k)
             {
                ret[i][j]+= e[i][k]*f[k][j];
             }                
        }
    }
    return ret;
}
Matrix operator+(Matrix& e,Matrix& f)      //重载 + 实现矩阵点乘 
{
    Matrix ret(e.getrow(),e.getcol());     //矩阵 e 与矩阵 f为同形矩阵 取谁的行列数都一样
    for(int i=0;i<e.getrow();++i)
    {
        for(int j=0;j<e.getcol();++j)
        {
            ret[i][j]=e[i][j]*f[i][j];
        }
     } 
    return ret;
}
int main()
{
    cout<<"请输入要进行的运算(包括数乘、乘法以及点乘)"<<endl;
    cout<<"数乘 1  乘法 2  点乘3 "<<endl; 
    int choice;
    cin>>choice;
    switch (choice)
    {
        case 1:
            { 
             int array1[2];
             cout<<"请输入矩阵的行数列数"<<endl;
             for (int i=0;i<2;++i)
                cin>>array1[i];
             int num;
             Matrix A(array1[0],array1[1]);
             cout<<"请输入乘数"<<endl;
             cin>>num;
             cout<<"请给矩阵A赋值"<<endl;
             cin>>A;
             cout<<"num与A数乘\n"; 
             cout<<num*A;
            }
        break;
        case 2: 
            {
             int array2[4];
             cout<<"请输入矩阵的行数列数"<<endl;
             for (int j=0;j<4;++j)
                cin>>array2[j];
             if(array2[1]!=array2[2])
              {
                  cout<<"第一个矩阵列数不等于第二个矩阵行数"<<"\n";
                  cout<<"请重启动再次输入"<<endl;
                }
                else
             {
                Matrix B(array2[0],array2[1]);
                 cout<<"请给矩阵B赋值"<<endl;
                cin>>B;
                Matrix C(array2[2],array2[3]);
                cout<<"请给矩阵C赋值"<<endl;
                cin>>C;
                cout<<"矩阵B与矩阵C乘法\n";
                cout<<B*C;
             }
            }
        break;
        case 3:
            {
             int array3[4];
              cout<<"请输入矩阵的行数列数"<<endl;
             for (int k=0;k<4;++k)
                cin>>array3[k];
             if(array3[1]!=array3[3]||array3[0]!=array3[2])
              {
                  cout<<"两个矩阵不同形"<<"\n";
                  cout<<"请重启动再次输入"<<endl;
                }
                else
             {
                Matrix D(array3[0],array3[1]);
                 cout<<"请给矩阵D赋值"<<endl;
                cin>>D;
                Matrix E(array3[2],array3[3]);
                cout<<"请给矩阵E赋值"<<endl;
                cin>>E;
                cout<<"矩阵D与矩阵E点乘\n";
                cout<<D+E;
             }
            }
    }
    return 0;
}

到此这篇关于C++利用类实现矩阵的数乘,乘法以及点乘的文章就介绍到这了,更多相关C++矩阵数乘 点乘内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用C语言实现简单扫雷小游戏

    用C语言实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了用C语言实现简单扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C 语言基础之初识 C 语言常量

    C 语言基础之初识 C 语言常量

    C语言中的常量分为以下几种:字面常量、const修饰的常变量、#define定义的标识符常量等,下面我们将详细对C语言这几个常量做介绍,感兴趣的小伙伴可以参考一下
    2021-09-09
  • C语言小程序 如何判断两个日期之差

    C语言小程序 如何判断两个日期之差

    输入两个日期,计算之间相差多少天。 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样
    2013-07-07
  • C语言运用回调函数实现计算器

    C语言运用回调函数实现计算器

    这篇文章主要为大家详细介绍了C语言运用回调函数实现计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C语言实现BMP图像开运算处理

    C语言实现BMP图像开运算处理

    这篇文章主要为大家详细介绍了C语言实现BMP图像开运算处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++继承中的对象构造与析构和赋值重载详解

    C++继承中的对象构造与析构和赋值重载详解

    这篇文章主要为大家详细介绍了C++继承中的对象构造与析构和赋值重载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言中的自定义类型之结构体与枚举和联合详解

    C语言中的自定义类型之结构体与枚举和联合详解

    今天我们来学习一下自定义类型,自定义类型包括结构体、枚举、联合体,小编觉得挺不错的,现在就分享给大家,也给大家做个参考
    2022-06-06
  • epoll封装reactor原理剖析示例详解

    epoll封装reactor原理剖析示例详解

    这篇文章主要为大家介绍了epoll封装reactor原理剖析示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • C语言数据结构的时间复杂度和空间复杂度

    C语言数据结构的时间复杂度和空间复杂度

    算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度,感兴趣的同学可以参考阅读
    2023-04-04
  • C语言编程实现扫雷游戏

    C语言编程实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言编程实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论