C++ 矩阵乘法

194 篇文章 42 订阅
//构造矩阵类,重载乘法操作符
//作者: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<<"两矩阵无法进行乘法运算.\n"<<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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值