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++矩阵数乘 点乘内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++动态规划算法实现矩阵链乘法

    问题描述: 给定n个矩阵的链<A1,A2,…,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案,使得计算乘积A1A2…An所需标量乘法次数最少. 动态规划的第一步是寻找最优子结构,然后就可以利用这种子结构从子问题的最优解构造出原问题的最优解.在矩阵链乘法问题中,我们假设A(i)A(i+1)…A(j)的最优括号方案的分割点在A(k)和A(k+1)之间.那么,继续对“前缀”子链A(i)A(i+1)…A(k)进行括号化时,我们应该直接采用独立求解它时所

  • C++ 利用硬件加速矩阵乘法的实现

    一.矩阵乘法定义 矩阵 A x × y 和 矩阵 B u × v 相乘的前提条件是 y = = u ,并且相乘后得到的矩阵为 C x × v(即 A 的行和 B 的列构成了矩阵 C的行列): 二.矩阵类封装 我们用 C++ 封装了一个 n × m 的矩阵类,用二维数组来存储数据,定义如下: #define MAXN 1000 #define LL __int64 class Matrix { private: int n, m; LL** pkData; public: Matrix() : n

  • C/C++如何实现两矩阵相乘之模拟法

    目录 数学中两矩阵怎么相乘? C/C++语言实现 总结 数学中两矩阵怎么相乘? 矩阵相乘需要前面矩阵的列数与后面矩阵的行数相同方可相乘. 将前面矩阵的第i行各元素分别与后面矩阵的第j列相应位置元素相乘相加作为结果矩阵的第i行第j列. eg: 上图前面矩阵的列数是3,后面矩阵的行数是3,所以他俩的某一行和某一列才能一一对应,进而才能进行矩阵相乘运算; C/C++语言实现 假设和上图一样的矩阵a*矩阵b 在草稿纸上模拟矩阵相乘的过程中,我们会发现,第一个矩阵a 分别用自己的第i行与 第二个矩阵b的第

  • C++使用cuBLAS加速矩阵乘法运算的实现代码

    本博客主要参考cuBLAS 库 词条实现,与原文不同的是,本博客: 将cuBLAS库的乘法运算进行了封装,方便了算法调用: 将原文的结果转置实现为了不转置,这样可以直接使用计算结果: 测试并更改了乘法参数,解决了原文中更改矩阵大小时报错的问题. 总的来说,本博客的代码利用cuBLAS库实现了两个矩阵相乘,提高了矩阵乘法的计算速度. test.cpp #include "cuda_runtime.h" #include "cublas_v2.h" #include &

  • C++中实现矩阵的加法和乘法实例

    C++中实现矩阵的加法和乘法实例 实现效果图: 实例代码: #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;//保存二维数组的元素 public: Matrix();//默认构造函数 Matrix(int r, int c); Matrix(const Matrix &is);//拷贝构造函数 void Madd(const Matrix &

  • C++稀疏矩阵的各种基本运算并实现加法乘法

    代码: #include <iostream> #include<malloc.h> #include<cstdio> using namespace std; #define M 4 #define N 4 #define MaxSize 100 typedef int ElemType; typedef struct { int r; int c; ElemType d;///元素值 } TupNode; ///三元组定义 typedef struct { int

  • C++实现对象化的矩阵相乘小程序

    复习数学1的线性代数,矩阵相乘这块有点晕,想编个C++对象化的矩阵相乘小程序. 相乘部分 void sum(juzhen a, juzhen b, juzhen &c) { int s=0; for (int i = 1; i <= a.m1(); i++)//A矩阵的M for (int j = 1; j <= b.n1(); j++)//B矩阵的S { for (k0 = 1; k0 <= a.n1(); k0++)//a.n1也就是b.m1(a的n,b的n)[行向量*列向量

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

    程序的探索经过如下: ①首先考虑到后续代码的维护及其复用性,为此考虑用类实现 ②矩阵基本的类成员应该包括矩阵的行列数以及矩阵名以及初始化.输入输出 ③由于需要实现三种矩阵乘法运算,为此考虑利用运算符重载使用友元函数重载* +运算符分别实   现矩阵的数乘.乘法以及点乘 源码如下: #include <bits/stdc++.h> #include <iostream> using namespace std; typedef long long ll; class Matrix /

  • 浅谈利用numpy对矩阵进行归一化处理的方法

    本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx = max(data) mn = min(data) return [(float(i) - m) / (mx - mn) for i in data] 代码只有5行并不复杂,但是需要注意的一点是一定要将计算的均值以及矩阵的最大.最小值存为变量放到循环里,如果直接在循环里计算对应的值会造成归一化特别慢,笔者之前有过深切的酸爽体验-. 以上这篇

  • Java如何利用POI读取Excel行数

    这篇文章主要介绍了java如何利用POI读取Execel行数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java 利用poi 读excel文件的操作,读取总的数据行数一般是通过调用 sheet.getLastRowNum() ;可是这样有时候会出现一些问题,例如,当其中一行的数据的确都为空,可是其原本的格式还在,并没有连带删除,这样计算出来的行数就不真实(比真实的大),还有当出现空白行时(也即某一行没有任何数据,通过Row row = sh

  • 利用Python来实现阿姆斯特朗数的检查实例

    一.什么是阿姆斯特朗数? 如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数). 一个正整数称为阿姆斯特朗阶数. 例: abcd... = an + bn + cn + dn + ... 如果是3位的阿姆斯特朗数字,则每个数字的立方和等于该数字本身. 例如: 153 = 1*1*1 + 5*5*5 + 3*3*3 // 153是一个阿姆斯特朗数. 二.案例 1. 检查阿姆斯特朗数(3位数字) 例 : # 检查该数字是否为阿姆斯壮数字的Python程序 # 接受用户的输入

  • 利用C++实现矩阵的相加/相称/转置/求鞍点

    1.矩阵相加 两个同型矩阵做加法,就是对应的元素相加. 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int a[3][3]={{1,2,3},{6,5,4},{4,3,2}}; int b[3][3]={{4,3,2},{6,5,4},{1,2,3}}; int c[3][3]={0,0,0,0,0,0,0,0,0}; int i,j; cout<<"Array A:"<<

  • C++利用静态成员或类模板构建链表的方法讲解

    直接上代码了,说明看注释就可以: 利用静态成员构建链表 #include <IOSTREAM.H> class Node { public: Node(int val, Node* next):val(val),next(next){} //~Node(){cout<<"del "<<val<<endl;} static void showAll();//打印全部节点的值 static void insertHead(int);//头插

  • Python 实现将数组/矩阵转换成Image类

    先说明一下为什么要将数组转换成Image类.我处理的图像是FITS (Flexible Image Transport System)文件,是一种灰度图像文件,也就是单通道图像. FITS图像的特点是灰度值取值为0~65535,这类图像在python下读成数组首先是不能直接转换成位图,也就不能用OpenCV.Image等方法了. 如果是普通的jpg图像,用自带的Image库就能实现很多功能. 下方的这幅图就是通过python下的Image库中的rotate函数实现的 接下来贴上代码. impor

  • C++实现特殊矩阵的压缩存储算法

    目录 1. 前言 2. 压缩对称矩阵 3. 压缩稀疏矩阵 3.1 三元组表 3.2 以列优先搜索 3.3 找出存储位置 4. 总结 1. 前言 什么是特殊矩阵? C++,一般使用二维数组存储矩阵数据. 在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵. 为了节省存储空间,可以设计算法,对这类特殊矩阵进行压缩存储,让多个相同的非零数据只分配一个存储空间:对零数据不分配空间. 本文将讲解如何压缩这类特殊矩阵,以及压缩后如何保证矩阵的常规操作

随机推荐