欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘

 更新時(shí)間:2022年11月17日 11:48:33   作者:cc?  
這篇文章主要為大家詳細(xì)介紹了C++如何利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下

 程序的探索經(jīng)過如下:

 ①首先考慮到后續(xù)代碼的維護(hù)及其復(fù)用性,為此考慮用類實(shí)現(xiàn)

 ②矩陣基本的類成員應(yīng)該包括矩陣的行列數(shù)以及矩陣名以及初始化、輸入輸出

 ③由于需要實(shí)現(xiàn)三種矩陣乘法運(yùn)算,為此考慮利用運(yùn)算符重載使用友元函數(shù)重載* +運(yùn)算符分別實(shí)   現(xiàn)矩陣的數(shù)乘、乘法以及點(diǎn)乘

源碼如下:

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long ll;
class Matrix                                          //封裝一個(gè)矩陣類便于后續(xù)使用
{
    int row;
    int col;                                       
    int** base;                                       //二維數(shù)組存放矩陣
public:
    Matrix(int r,int c)                               //構(gòu)造函數(shù)初始化
    {
        row = r;
        col = c;
        create();
    }
    //在外部則寫作:
    //Matrix::Matrix(int r, int c)
    //{
    //  row=r; col=c; create();
    //} 
    Matrix(const Matrix& e)                            //拷貝構(gòu)造函數(shù)
    {
        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()                                          //析構(gòu)函數(shù)防止內(nèi)存泄露
    {
        destroy();
    }
    Matrix& operator=(const Matrix& e)                //重載等于號(hào)實(shí)現(xiàn)深拷貝
    {
        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                       //重載[]以方便用"變量名[][]" 的形式讀寫矩陣內(nèi)容
    {
        return base[i];
    }
    int getrow()const                                 //對(duì)外提供矩陣信息
    {
        return row;
    }
    int getcol()const                                  //對(duì)外提供矩陣信息
    {
        return col;
    }
    friend Matrix operator*(int n,Matrix &e);        //重載 * 實(shí)現(xiàn)數(shù)乘 
    friend Matrix operator*(Matrix& e,Matrix& f);    //重載 * 實(shí)現(xiàn)矩陣乘法 
    friend Matrix operator+(Matrix& e,Matrix& f);    //重載 + 實(shí)現(xiàn)矩陣點(diǎn)乘 
private:
    void create()                                      //創(chuàng)建一個(gè)二維數(shù)組
    {
        base = new int*[row];
        for(int i = 0;i<row;i++)
        {
            base[i] = new int[col];
        }
    }
    void destroy()                                     //釋放一個(gè)二維數(shù)組
    {
        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)              //重載 * 實(shí)現(xiàn)數(shù)乘
{
    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)        //重載 * 實(shí)現(xiàn)矩陣乘法 
{
    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)      //重載 + 實(shí)現(xiàn)矩陣點(diǎn)乘 
{
    Matrix ret(e.getrow(),e.getcol());     //矩陣 e 與矩陣 f為同形矩陣 取誰的行列數(shù)都一樣
    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<<"請(qǐng)輸入要進(jìn)行的運(yùn)算(包括數(shù)乘、乘法以及點(diǎn)乘)"<<endl;
    cout<<"數(shù)乘 1  乘法 2  點(diǎn)乘3 "<<endl; 
    int choice;
    cin>>choice;
    switch (choice)
    {
        case 1:
            { 
             int array1[2];
             cout<<"請(qǐng)輸入矩陣的行數(shù)列數(shù)"<<endl;
             for (int i=0;i<2;++i)
                cin>>array1[i];
             int num;
             Matrix A(array1[0],array1[1]);
             cout<<"請(qǐng)輸入乘數(shù)"<<endl;
             cin>>num;
             cout<<"請(qǐng)給矩陣A賦值"<<endl;
             cin>>A;
             cout<<"num與A數(shù)乘\n"; 
             cout<<num*A;
            }
        break;
        case 2: 
            {
             int array2[4];
             cout<<"請(qǐng)輸入矩陣的行數(shù)列數(shù)"<<endl;
             for (int j=0;j<4;++j)
                cin>>array2[j];
             if(array2[1]!=array2[2])
              {
                  cout<<"第一個(gè)矩陣列數(shù)不等于第二個(gè)矩陣行數(shù)"<<"\n";
                  cout<<"請(qǐng)重啟動(dòng)再次輸入"<<endl;
                }
                else
             {
                Matrix B(array2[0],array2[1]);
                 cout<<"請(qǐng)給矩陣B賦值"<<endl;
                cin>>B;
                Matrix C(array2[2],array2[3]);
                cout<<"請(qǐng)給矩陣C賦值"<<endl;
                cin>>C;
                cout<<"矩陣B與矩陣C乘法\n";
                cout<<B*C;
             }
            }
        break;
        case 3:
            {
             int array3[4];
              cout<<"請(qǐng)輸入矩陣的行數(shù)列數(shù)"<<endl;
             for (int k=0;k<4;++k)
                cin>>array3[k];
             if(array3[1]!=array3[3]||array3[0]!=array3[2])
              {
                  cout<<"兩個(gè)矩陣不同形"<<"\n";
                  cout<<"請(qǐng)重啟動(dòng)再次輸入"<<endl;
                }
                else
             {
                Matrix D(array3[0],array3[1]);
                 cout<<"請(qǐng)給矩陣D賦值"<<endl;
                cin>>D;
                Matrix E(array3[2],array3[3]);
                cout<<"請(qǐng)給矩陣E賦值"<<endl;
                cin>>E;
                cout<<"矩陣D與矩陣E點(diǎn)乘\n";
                cout<<D+E;
             }
            }
    }
    return 0;
}

到此這篇關(guān)于C++利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘的文章就介紹到這了,更多相關(guān)C++矩陣數(shù)乘 點(diǎn)乘內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)字圖像處理之圖像縮放

    C語言數(shù)字圖像處理之圖像縮放

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)字圖像處理之圖像縮放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++深入探究類與對(duì)象之對(duì)象模型與this指針使用方法

    C++深入探究類與對(duì)象之對(duì)象模型與this指針使用方法

    C++對(duì)象模型中只有類的非static成員以及一個(gè)指向虛函數(shù)表的指針被配置于類對(duì)象內(nèi),其他都在類對(duì)象外,在 C++ 中,每一個(gè)對(duì)象都能通過 this 指針來訪問自己的地址。this 指針是所有成員函數(shù)的隱含參數(shù)。因此,在成員函數(shù)內(nèi)部,它可以用來指向調(diào)用對(duì)象
    2022-04-04
  • ReSharper 的安裝使用詳細(xì)教程

    ReSharper 的安裝使用詳細(xì)教程

    resharper安裝教程是關(guān)于vs2012一個(gè)非常好用的插件的安裝教程,建議大家嘗試安裝,今天通過本教程幫助大家學(xué)習(xí)ReSharper 的安裝使用詳細(xì)教程,感興趣的朋友一起看看吧
    2021-06-06
  • C語言中利用封裝好的函數(shù)實(shí)現(xiàn)英文字母的大小寫轉(zhuǎn)換

    C語言中利用封裝好的函數(shù)實(shí)現(xiàn)英文字母的大小寫轉(zhuǎn)換

    這篇文章主要介紹了C語言中利用封裝好的函數(shù)實(shí)現(xiàn)英文字母的大小寫轉(zhuǎn)換,需要的朋友可以參考下
    2017-10-10
  • C語言實(shí)現(xiàn)推箱子功能匯總

    C語言實(shí)現(xiàn)推箱子功能匯總

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)推箱子功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++如何用智能指針管理內(nèi)存資源

    C++如何用智能指針管理內(nèi)存資源

    這篇文章主要介紹了C++如何用智能指針管理內(nèi)存資源,幫助大家更好的理解和使用c++開發(fā),感興趣的朋友可以了解下
    2020-08-08
  • C/C++?QT實(shí)現(xiàn)自定義對(duì)話框的示例代碼

    C/C++?QT實(shí)現(xiàn)自定義對(duì)話框的示例代碼

    對(duì)話框分為多種,常見的有通用對(duì)話框,自定義對(duì)話框,模態(tài)對(duì)話框,非模態(tài)對(duì)話框等,本文主要介紹了QT自定義對(duì)話框,感興趣的可以了解一下
    2021-11-11
  • c++難以發(fā)現(xiàn)的bug(有趣)

    c++難以發(fā)現(xiàn)的bug(有趣)

    這篇文章主要介紹了c++難以發(fā)現(xiàn)的bug(有趣)的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • VScode+ESP32簡(jiǎn)單環(huán)境搭建

    VScode+ESP32簡(jiǎn)單環(huán)境搭建

    本文章向大家介紹ESP32-C3搭建環(huán)境教程,主要包括ESP32-C3搭建環(huán)境教程使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c++ 排查內(nèi)存泄漏的妙招

    c++ 排查內(nèi)存泄漏的妙招

    這篇文章主要介紹了c++ 如何用輔助類排查內(nèi)存泄漏,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論