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

这篇具有很好参考价值的文章主要介绍了C++利用类实现矩阵的数乘、乘法以及点乘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    ----------------------------------矩阵的数乘、乘法、点乘---------------------------------------*
   *-description:用户选择运算方式后输入矩阵的规模并赋值,随即进行矩阵相关运算  
   *- author:Luo                                                                                                        
   *-e-mail:2459871931@qq.com                                                                               
   *- Version    :Dev-C++ 5.11                                                                                  
   *--------------------------------------------------------------------------------------------------------*

 小的第一次在CSDN论坛发文- -

 当是简单记录生活吧!有什么问题一起交流探讨!多指点指点俺!

 程序的探索经过如下:

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

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

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

 源码如下:

#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;
}

 以上是源码啦!喜欢的话可以点赞收藏,感谢大家!文章来源地址https://www.toymoban.com/news/detail-461629.html

到了这里,关于C++利用类实现矩阵的数乘、乘法以及点乘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过类实现矩阵加减法、乘法、转置(C++))

    定义一个二维方阵类 matrix 通过重载二元运算符“+”、“-”、“*”和一元运算符“~”, 来实现矩阵加、矩阵减、矩阵乘以及矩阵转置。 1.由于矩阵的行与列都是未知的,首先需要通过 动态分配内存 实现创建任意大小的矩阵,由于类中默认的构造函数无法满足我们的需求,

    2024年02月06日
    浏览(46)
  • 利用最小二乘法求解相机投影矩阵

    1、相机成像几何模型的建立 为了得到三维空间物体表面某点的几何位置与其所在二维平面图像中对应点之间的相关关系,需要建立相机成像的几何模型。 为了建立几何模型,首先需要构建几个重要的坐标系: 世界坐标系(World Coordinate):在环境中建立的三维坐标系,用来

    2024年02月05日
    浏览(34)
  • MATLAB中如何实现n个矩阵的点乘或相加

      - 如果你的矩阵都是同样的大小,你可以将它们存储在一个三维数组中,然后使用sum函数沿着第三个维度求和。例如,如果你有三个2×2的矩阵A、B和C,你可以这样做:   ```markdown M = cat(3,A,B,C); % 将A、B、C沿着第三个维度拼接成一个2×2×3的数组 S = sum(M,3); % 沿着第三个维度求

    2024年02月06日
    浏览(25)
  • 矩阵乘法(C++)

    题目描述: Alice在学线性代数。她觉得线代的计算特别麻烦,于是就来找你,希望你可以给她写一个程序计算两个矩阵的乘积。 矩阵乘法介绍: 矩阵A是一个N行P列的矩阵。 矩阵B是一个K行M列的矩阵。 当P=K时,A和B可以相乘(仅限于AB, BA不一定可行) 假设矩阵C=AB,那么 C**i , j ​

    2024年02月02日
    浏览(36)
  • 【C++】矩阵的乘法

    先复习一下矩阵的乘法 。 已知 求AB。  因为矩阵A是2×3矩阵,矩阵B是3×3矩阵,A的列数等于B的行数,所以矩阵A与B可以相乘,乘积AB是一个2×3矩阵。 矩阵相乘时需要注意两点,一点是矩阵1的列数要等与矩阵2的行数,一点是矩阵相乘后的矩阵 c[i][j] = a[i][k]*b[k][j]   由矩阵相

    2024年02月12日
    浏览(22)
  • 【数理知识】矩阵普通乘积,哈达玛积,克罗内克积,点乘,点积,叉乘,matlab代码实现

    序号 内容 1 【数理知识】向量数乘,内积,外积,matlab代码实现 2 【数理知识】矩阵普通乘积,哈达玛积,克罗内克积,点乘,点积,叉乘,matlab代码实现 首先介绍矩阵 在数学中,矩阵是一个按照长方阵列排列的复数或实数集合。由 m × n m times n m × n 个数 a i j a_{ij} a ij ​

    2024年02月04日
    浏览(62)
  • 线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算

    《线性代数》中会有较多陌生的概念,如矩阵的逆,线性相关线性无关等,具有一定的难度。因而本系列尽量会以不同于课本的视角去学习线性代数,有些可以做类比记忆的我们会去做一些类比记忆,比如矩阵的逆类比于我们数的除法,有一些比如线性相关和无关会尽量以几

    2024年02月04日
    浏览(31)
  • 学习笔记:两个3*3的矩阵,实现其对应位置的数相乘,返回一个新的矩阵

    入门小菜鸟的学习笔记,希望大佬们帮忙纠错啦~侵权立删。   解法一: 运行结果: 解法二:  运行结果: 个人学习笔记,仅供参考,如有错误,请多指正。 

    2024年02月15日
    浏览(38)
  • 12-矩阵的运算_加减法_数乘_转置

    在坐标系中可以这么去理解, 相当于一个图形扩大或缩小了几倍 矩阵的基本运算法则 矩阵的加减 矩阵的加法就是矩阵的对应位置相加,减法也是一样就是对应位置相减 数乘 转置 转置的操作和向量是一样的,就是把 aij 变成 aji,把行和列互换一下 对于矩阵而言, 转置其实

    2024年03月19日
    浏览(33)
  • C语言数据结构课设:矩阵的运算(转置.求和.求差.矩阵相乘.求逆.数乘),文件读取矩阵

      #include stdio.h #include string.h #includestdlib.h #includemath.h // 定义一个结构体类型,表示一个矩阵 typedef struct matrix {     int nrow; // 矩阵的行数     int ncol; // 矩阵的列数     double data[10][10]; // 矩阵的数据,最大为 10 x 10 } matrix; // 定义一个函数,用于显示一个矩阵的内容  void dis

    2024年03月27日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包