【模板】(旧)矩阵模板

矩阵模板

坚持oop!

#include<algorithm>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;

#define MATRIXSIZE (10)
struct MATRIX {

    LL lineSize,listSize; //  ÁÐ  ÐÐ
    int table[MATRIXSIZE][MATRIXSIZE];

    MATRIX() {

        lineSize=listSize=1;

        memset(table,0,sizeof(table));

    }

    MATRIX(const MATRIX &aMat) {

        lineSize=aMat.lineSize;
        listSize=aMat.listSize;

        for(int i=1; i<=lineSize; i++)
            for(int j=1; j<=listSize; j++)
                table[i][j]=aMat.table[i][j];

    }

    void Read () {

        cin>>lineSize>>listSize;

        for(int i=1; i<=lineSize; i++)
            for(int j=1; j<=listSize; j++)
                cin>>table[i][j];

    }

    void ReadOnlyTable (int tlineSize,int tlistSize) {

        lineSize=tlineSize;
        listSize=tlistSize;

        for(int i=1; i<=lineSize; i++)
            for(int j=1; j<=listSize; j++)
                cin>>table[i][j];

    }

    void Print () {

        for(int i=1; i<=lineSize; i++) {

            for(int j=1; j<=listSize; j++)
                cout<<table[i][j]<<" ";
            cout<<endl;

        }

    }

    void Mod (LL mod) {

        for(int i=1; i<=lineSize; i++)
            for(int j=1; j<=listSize; j++)
                table[i][j]%=mod;

    }

};

MATRIX operator + (MATRIX firstMat,MATRIX secondMat) {

    MATRIX newMat;

    newMat.lineSize=max(firstMat.lineSize,secondMat.lineSize);
    newMat.listSize=max(firstMat.listSize,secondMat.listSize);

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            newMat.table[i][j]=firstMat.table[i][j]+secondMat.table[i][j];

    return newMat;

}

MATRIX operator + (MATRIX aMat,LL num) {

    MATRIX newMat=aMat;

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            newMat.table[i][j]=aMat.table[i][j]+num;

    return newMat;

}

// copy
MATRIX operator - (MATRIX firstMat,MATRIX secondMat) {

    MATRIX newMat;

    newMat.lineSize=max(firstMat.lineSize,secondMat.lineSize);
    newMat.listSize=max(firstMat.listSize,secondMat.listSize);

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            newMat.table[i][j]=firstMat.table[i][j]-secondMat.table[i][j];

    return newMat;

}

MATRIX operator - (MATRIX aMat,LL num) {

    MATRIX newMat=aMat;

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            newMat.table[i][j]=aMat.table[i][j]-num;

    return newMat;

}

MATRIX operator * (MATRIX firstMat,MATRIX secondMat) {

    MATRIX newMat;

    if (firstMat.listSize!=secondMat.lineSize) return newMat;

    newMat.lineSize=firstMat.lineSize;
    newMat.listSize=secondMat.listSize;

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            for(int o=1; o<=firstMat.listSize; o++)
                newMat.table[i][j]+=firstMat.table[i][o]*secondMat.table[o][j];

  return newMat;  

}

MATRIX operator * (MATRIX aMat,LL num) {

    MATRIX newMat=aMat;

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            newMat.table[i][j]=aMat.table[i][j]*num;

    return newMat;

}

MATRIX Matrix_BuildIdentity (MATRIX aMat) {

    MATRIX newMat=aMat;

    newMat.lineSize=aMat.lineSize;
    newMat.listSize=aMat.listSize;

    for(int i=1; i<=newMat.lineSize; i++)
        for(int j=1; j<=newMat.listSize; j++)
            if (i==j) newMat.table[i][j]=1;
            else newMat.table[i][j]=0;

    return newMat;

}

MATRIX Matrix_QuickPower (MATRIX aMat,LL k) {

    MATRIX newMat=aMat,ansMat=Matrix_BuildIdentity(aMat);

    while (k!=0) {

        if (k&1==1) ansMat=ansMat*newMat;
        newMat=newMat*newMat;
        k>>=1;

    }

    return ansMat;

}

int main () { return 0; }
原文地址:https://www.cnblogs.com/Ztraveler/p/7170678.html