c++中矩阵相乘(对象数组与对象指针的应用)

c++中矩阵相乘(对象数组与对象指针的应用)

  1. 设计一个矩阵类 Matrix(矩阵由二维数组实现),有分配空间和对矩阵赋值的功能。
  2. 将这个矩阵类的对象作为参数传送到函数 Mul()
  3. 用三种方式传递参数:
    直接传送:Mul(Matrix a,Matrix b),实际上只是传送值,在函数中针对 对象的任何修改均不影响该对象本身
    指针传送:Mul(Matrix *pa,Matrix *pb)
    引用传送:Mul(Matrix &a,Matrix &b)

  4. 将 Mul() 函数实现

  5. 定义一个友元函数实现转制功能。转制是指将数组中 a[i][j]与 a[j][i]的值对调。
    下面给出代码
#include<iostream>   
using namespace std;

class Matrix  {   //定义类
private:       
    int **pmatrix;       
    int imaxx,imaxy;       
    static int matrixnum;  //计算有多少个矩阵 
public:       
    Matrix(unsigned int x,unsigned int y);       
    Matrix(Matrix &m);       
    ~Matrix();       
    void SetValue(unsigned int x,unsigned int y,int value);       
    void input();       
    void print() const;       
    friend Matrix Rotate(Matrix &m);  //定义友元函数实现转置功能     
    friend Matrix Mul(Matrix a,Matrix b); //定义MUL函数,实现矩阵相乘的功能
    unsigned int getx(){return imaxx;}
    unsigned int gety(){return imaxy;}
    int getvalue( int x, int y){
        return pmatrix[x][y];
    }
    };   


    int Matrix::matrixnum=0;  //静态变量初始化


Matrix::Matrix(unsigned int x,unsigned int y) {  //直接传送     
        pmatrix=new int *[x];       //为二维数组分配空间     
        for(int i=0;i<x;i++)   
        pmatrix[i]=new int[y];      
        imaxx=x;       
        imaxy=y;       
        matrixnum++;   }

Matrix::Matrix(Matrix &m){       //引用传送(需要具体)
        imaxx=m.imaxx;       
        imaxy=m.imaxy;       
        pmatrix=new int *[imaxx];       
        for(int i=0;i<imaxx;i++)           
            pmatrix[i]=new int[imaxy];   
        for(i=0;i<imaxx;i++)           
        for(int j=0;j<imaxy;j++)               
            pmatrix[i][j]=m.pmatrix[i][j];       
        matrixnum++;   }

Matrix::~Matrix()  {   //析构函数
    for(int i=0;i<imaxx;i++)           
        delete[]pmatrix[i];       
    delete[]pmatrix;       
    matrixnum--;   } 


void Matrix::SetValue(unsigned int x,unsigned int y,int value)  {       //设置单个矩阵元素的值          
        pmatrix[x][y]=value;           
        }    

void Matrix::input()  {       //设置整个矩阵的值
    int x,y,value;       
    for(x=0;x<imaxx;x++)           
        for(y=0;y<imaxy;y++)           
        {               
            cin>>value;               
            SetValue(x,y,value);           }   }  

void Matrix::print()const  {       
    int x,y;       
    cout<<"共有"<<matrixnum<<"个矩阵"<<endl;       
    cout<<"Matrix ["<<imaxx<<","<<imaxy<<"]";       
    for(x=0;x<imaxx;x++)  
    {           
        cout<<endl;           
        for(y=0;y<imaxy;y++)               
            cout<<pmatrix[x][y]<<"  ";       
    }   
}    


Matrix Rotate(Matrix &m)  {       //定义友元函数达到转置的目的
        unsigned int i,j;       
        Matrix a(m.imaxy,m.imaxx);       
        for(i=0;i<m.imaxx;i++)           
            for(j=0;j<m.imaxy;j++)              
                a.pmatrix[j][i]=m.pmatrix[i][j];      
            return a;  }


Matrix Mul(Matrix a,Matrix b)  {   //当以矩阵相乘函数       直接传递
    int x,y,z;     
    Matrix c(a.imaxx,b.imaxy);   
    for(x=0;x<a.imaxx;x++)    
        for(y=0;y<b.imaxy;y++)  {    
            c.pmatrix[x][y]=0;        
            for(z=0;z<a.imaxy;z++)           
            c.pmatrix[x][y]+=a.pmatrix[x][z]*b.pmatrix[z][y];           
                    }      
            return c;   }   
Matrix Mul(Matrix* a,Matrix* b)  {   //当以矩阵相乘函数     指针传递
    int x,y,z;     
    Matrix c(a->getx(),b->gety());   
    for(x=0;x<a->getx();x++)    
        for(y=0;y<b->gety();y++)  {    
            int sum=0;        
            for(z=0;z<=a->getx();z++)           
            sum+=(a->getvalue(x,z)*(b->getvalue(z,y)));           
            c.SetValue(x,y,sum);
        }
            return c;   }  

 Matrix Mul(Matrix& a,Matrix& b)  {   //当以矩阵相乘函数   引用传递     
    int x,y,z;     
    Matrix c(a.getx(),b.gety());   
    for(x=0;x<a.getx();x++)    
        for(y=0;y<b.gety();y++)  {    
            int sum=0;        
            for(z=0;z<=a.getx();z++)           
            sum+=(a.getvalue(x,z)*(b.getvalue(z,y)));           
            c.SetValue(x,y,sum);
        }
            return c;   }  


    int main()  {     
        Matrix a(2,3);   
        cout<<"输入 a[2][3] :"<<endl;    
        a.input();      
        cout<<endl;     
        a.print();      
        cout<<endl;     
        Matrix b(3,3);  
        cout<<"输入 b[3][3] :"<<endl;  
        b.input();
        cout<<endl;    
        b.print();     
        cout<<endl;    
        Matrix c=Mul(&a,&b);     
        cout<<"a,b矩阵相乘";
        c.print()  
        cout<<e - 列表内容;       
        cout<<"将矩阵a[2][3]转置: "<<endl;   
        Matrix d=Rotate(a);    
        d.print();    
        cout<<endl;       
        return 0;   } 

注意点:
1) 在定义友元函数是不需要有类的限定
2) 引用函数时要记得()
3) 在通过引用和数组对矩阵进行操作时,是对矩阵本身操作,而直接传递相当于是对形参进行操作,不影响实参
4) 再给二重指针分配空间时,二级指针=指针数组,指针数组中的元素值=整形数组

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值