HaveAnIdeaCy
11/22/2019 - 4:27 AM

矩阵计算.cpp

#include <iostream>
#include <iomanip>
using namespace std;
class IntArray{
private:
    int *p;
    int size;
public:
    IntArray(int n)
    {
        p=new int[n];
        size=n;
    }
    ~IntArray()
    {
        size=0;
        delete[] p;
    }
    IntArray(IntArray& array1)
    {
        p=new int[array1.size];
        size=array1.size;
        for (int i=0;i<size;i++)
            p[i]=array1.p[i];
    }
    IntArray& operator = (IntArray& array1)
    {
        int i,top;
        if(size>array1.size)
            top=array1.size;
        else top=size;
        for(i=0;i<top;i++)
            p[i]=array1.p[i];
        return *this;
    }
    int& operator[](int i)
    {
        int j;
        j=i;
        if(j<1) j=1;
        if(j>size) j=size;
        return p[j-1];
    }

};
class IntTwoArray{
public:
    int *p;
    int lines,cols;
public:

    IntTwoArray(int l,int c)
    {
        lines=l;
        cols=c;
        p=new int[lines*cols];

    }
    IntTwoArray()
    {
        lines=0;
        cols=0;
    }
    ~IntTwoArray()
    {
        lines=0;
        cols=0;
        delete[] p;
    }

    IntTwoArray(IntTwoArray& array1)
    {
        int i,j;
        p=new int[array1.lines*array1.cols];
        lines=array1.lines;
        cols=array1.cols;
        for (i=0;i<lines;i++)
            for(j=0;j<cols;j++)
                p[i*cols+j]=array1.p[i*array1.cols+j];
    }
    IntTwoArray& operator = (IntTwoArray& array1)
    {
        int i,j,topi,topj;
        if(lines>array1.lines)
            topi=array1.lines;
        else topi=lines;
        if(cols>array1.cols)
            topj=array1.cols;
        else topj=cols;
        for(i=0;i<topi;i++)
            for (j=0;j<topj;j++)
                p[i*cols+j]=array1.p[i*array1.cols+j];
        return *this;
    }
    int& operator()(int l,int c)
    {
        int l1,c1;
        l1=l;
        c1=c;
        if(l1<1) l1=1;
        if(l1>lines) l1=lines;
        if(c1<1) c1=1;
        if(c1>cols) c1=cols;

        return p[(l1-1)*cols+c1-1];
    }
    IntTwoArray& Add(IntTwoArray &a,IntTwoArray &b)
    {
        int i,j;
        lines=0;
        cols=0;
        if(a.lines==b.lines &&a.cols==b.cols) {
            lines = a.lines;
            cols=a.cols;
            p=new int[lines*cols];
            for(i=1;i<=lines;i++)
                for(j=1;j<=cols;j++)
                {
                    p[(i-1)*cols+j-1]=a.p[(i-1)*cols+j-1]+b.p[(i-1)*cols+j-1];
                }
        }
        else cout << "这两个矩阵不可以相加" << endl;
        return *this;
    }
    IntTwoArray& Mul(IntTwoArray &a,IntTwoArray &b)
    {
        int i=1,j=1,k=0;
        lines=0;
        cols=0;
        if(a.cols==b.lines) {
            lines = a.lines;
            cols=b.cols;
            p=new int[lines*cols];
            for (i=0;i<lines*cols;i++)
                p[i]=0;
            for(i=1;i<=lines;i++)
                for(j=1;j<=cols;j++)
                {
                    for(k=0;k<a.cols;k++)
                        p[(i-1)*cols+j-1]= p[(i-1)*cols+j-1]+(a.p[(i-1)*a.cols+k])*(b.p[k*b.cols+j-1]);
                }
        }
        else cout << "这两个矩阵不可以相乘" << endl;
        return *this;
    }

    void assignment(int *a,int n)
    {
        int i;
        for (i=0;i<n;i++)
            p[i]=a[i];
    }
    void show() {
        int i=0, j=0;
        if (lines > 0 && cols > 0) {
            for (i = 0; i < lines; i++) {
                for (j = 0; j < cols; j++) {
                    cout << setw(7) << p[i * cols + j];
                }
                cout << endl;
            }
            //cout << endl;
        }
        else cout<<"该矩阵为空"<<endl;
    }
};

int main() {
/*    IntArray a(10),b(a),c(10);
    c=a;
    a[0]=100;
    for (int i=-10;i<20;i++)
        a[i] = i;
    for(int i=-10;i<20;i++)
        cout<<a[i]<<endl;
*/
/*  IntTwoArray a(10,20),b(a),c(10,10);
    a(1,5)=100;
    int i,j;
    for(i=0;i<22;i++) {
        for (j = 0; j < 22; j++) {
            a(i, j) = j;
            cout << a(i, j) << " ";
        }
        cout << endl;
    }
*/
    IntTwoArray a1(2,3),a2(2,3),b(3,4),c1,c2,c3,c4;
    int x1[6]={1,2,3,4,5,6};
    int x2[12]={1,2,3,4,5,6,7,8,9,0,1,2};
    a1.assignment(x1,6);
    a2.assignment(x1,6);
    b.assignment(x2,12);
    cout<<"a1矩阵为:"<<endl;
    a1.show();
    cout<<"a2矩阵为:"<<endl;
    a2.show();
    cout<<"b矩阵为:"<<endl;
    b.show();

    cout<<"a1+a2="<<endl;
    c1.Add(a1,a2);
    c1.show();

    cout<<"a1+b="<<endl;
    c2.Add(a1,b);
    c2.show();

    cout<<"a1*b:"<<endl;
    c3.Mul(a1,b);
    c3.show();

    cout<<"a1*a2:"<<endl;
    c4.Mul(a1,a2);
    c4.show();
    return 0;
}