zoukankan      html  css  js  c++  java
  • C++ 矩阵乘法

    //构造矩阵类,重载乘法操作符
    //作者:nuaazdh
    //时间:2011年12月1日
    
    #include <iostream>
    
    using namespace std;
    
    //Matrix矩阵类
    class Matrix
    {
    public:
        Matrix(int mm, int nn)//构造函数
        {
            m=mm;
            n=nn;
            int i,j;
            data=new double*[mm];
            for(i=0;i<mm;i++)
                data[i]=new double[nn];
            for(i=0;i<m;i++)//矩阵全部元素清零
                for(j=0;j<n;j++)
                    data[i][j]=0.0;
        } //构造M行N列的矩阵
    
        Matrix(const Matrix &src) //拷贝构造函数
        {
            m=src.m;
            n=src.n;
              int i,j;
            data=new double*[m];//动态建立二维数组
            for(i=0;i<m;i++)
                data[i]=new double[n];
            for(i=0;i<m;i++)//动态数组赋值
                for(j=0;j<n;j++)
                    data[i][j]=src.data[i][j];
        }
    
        ~Matrix()//析构函数
        {
            for(int i=0;i<m;i++)
                delete []data[i];
            delete []data;
        }
        Matrix& operator=(const Matrix &src);//重载"="运算符
        Matrix operator * (const Matrix &m2); //矩阵乘法
        void display();
        void input();
        private:
            double **data;
        int m,n;//矩阵的行数,列数
    };//类定义结束
    
    Matrix& Matrix::operator=(const Matrix &src) //重载"="运算符
    {
        int i,j;
        for(i=0;i<m;i++)
            delete []data[i];
        delete []data;
        m=src.m;n=src.n;
        data=new double*[m];//动态建立二维数组
        for(i=0;i<m;i++)
            data[i]=new double[n];
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                data[i][j]=src.data[i][j];
        return *this;
    }
    
    //矩阵*运算符重载
    Matrix Matrix::operator *(const Matrix &m2)//矩阵乘法的实现
    {
        Matrix m3(this->m,m2.n);
        if(this->n!=m2.m)
        {
            cout<<"两矩阵无法进行乘法运算.
    "<<endl;
            exit(0);
        }
        int i,j,k,l;
        for(i=0;i<this->m;i++)
            for(j=0;j<m2.n;j++)
            {
                for(k=0;k<this->n;k++)
                 {
                    m3.data[i][j]+=this->data[i][k]*m2.data[k][j];
                 }
    
            }
        return m3;
    }
    
    //输入矩阵元素
    void Matrix::input()
    {
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                cin>>data[i][j];
    }
    
    //显示矩阵元素
    void Matrix::display()
    {
        int i,j;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                cout<<data[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    
    //主函数
    int main(int argc, char* argv[])
    {
        int x,y;
        cout<<"矩阵1行数:";
        cin>>x;
        cout<<"矩阵1列数:";
        cin>>y;
        Matrix A(x,y);
        cout<<"请输入矩阵1元素(按行,共"<<x*y<<" 个)"<<endl;
        A.input();
        cout<<"矩阵1:"<<endl;
        A.display();
        cout<<"矩阵2行数:";
        cin>>x;
        cout<<"矩阵2列数:";
        cin>>y;
        Matrix B(x,y);
        cout<<"请输入矩阵2元素(按行,共"<<x*y<<" 个)"<<endl;
        B.input();
        cout<<"矩阵2:"<<endl;
        B.display();
        Matrix C=A*B;
        cout<<"矩阵1 与 矩阵2 的乘积:"<<endl;
        C.display();
        return 0;
    }
    


    执行结果:



  • 相关阅读:
    D. The Fair Nut and the Best Path 树形dp (终于会了)
    (二)网络流之最大流
    网络流(知识点) 一 终究还是躲不掉
    dp 优化 F2. Pictures with Kittens (hard version)
    da shu mo ban
    AtCoder Regular Contest 090 F
    Codeforces 918D MADMAX 图上dp 组合游戏
    Codeforces 918C The Monster
    AtCoder Regular Contest 090 C D E F
    poj 3623 Best Cow Line, Gold 后缀数组 + 贪心
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3878229.html
Copyright © 2011-2022 走看看