c++におけるマトリクス乗算(オブジェクト配列とオブジェクトポインタの適用)

9940 ワード

c++におけるマトリクス乗算(オブジェクト配列とオブジェクトポインタの適用)
  • マトリクスクラスMatrix(マトリクスは2次元配列で実現される)を設計し、空間を割り当て、マトリクスに値を割り当てる機能を有する.
  • この行列クラスのオブジェクトをパラメータとして関数Mul()
  • に渡す.
  • は3つの方法でパラメータを伝達する:直接伝送:Mul(Matrix a,Matrix b)は、実際には伝送値だけであり、関数の中でオブジェクトに対するいかなる修正もそのオブジェクト自身のポインタ伝送に影響しない:Mul(Matrix*pa,Matrix*pb)参照伝送:Mul(Matrix&a,Matrix&b)
  • Mul()関数を
  • に実装
  • は、トランスフォーム機能を実現する友元関数を定義する.転制とは、配列中のa[i][j]とa[j][i]の値を合わせることである.コード
  • を次に示す
    #include   
    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;inew 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;inew int[imaxy];   
            for(i=0;ifor(int j=0;j//    
        for(int i=0;idelete[]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;xfor(y=0;ycin>>value;               
                SetValue(x,y,value);           }   }  
    
    void Matrix::print()const  {       
        int x,y;       
        cout<<"  "<"   "<cout<<"Matrix ["<","<"]";       
        for(x=0;xcout<for(y=0;ycout<"  ";       
        }   
    }    
    
    
    Matrix Rotate(Matrix &m)  {       //             
            unsigned int i,j;       
            Matrix a(m.imaxy,m.imaxx);       
            for(i=0;ifor(j=0;jreturn a;  }
    
    
    Matrix Mul(Matrix a,Matrix b)  {   //                   
        int x,y,z;     
        Matrix c(a.imaxx,b.imaxy);   
        for(x=0;xfor(y=0;y0;        
                for(z=0;zreturn c;   }   
    Matrix Mul(Matrix* a,Matrix* b)  {   //                 
        int x,y,z;     
        Matrix c(a->getx(),b->gety());   
        for(x=0;xgetx();x++)    
            for(y=0;ygety();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;xfor(y=0;yint 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] :"<cout<cout<3,3);  
            cout<<"   b[3][3] :"<cout<cout<cout<<"a,b    ";
            c.print()  
            cout<cout<<"   a[2][3]  : "<cout<return 0;   } 
    

    注意点:1)友元関数がクラスを持たない限定2)参照関数であることを定義するときは()3)参照と配列で行列を操作するときは行列そのものを操作するが,直接伝達すると相当する形パラメータを操作し,実パラメータ4に影響を及ぼさない)二重ポインタに空間を割り当てるときは,二次ポインタ=ポインタ配列,ポインタ配列の要素値=整形配列