矩阵运算整合

函数+模板实现

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>

using namespace std;

int n,m,k;
vector<vector<int> >a,b,c;//因为普通二维数组不能作为形参传入函数,所以用vector 

//快读 
template<typename type>
inline void read(type &x)
{
    x=0;bool flag(0);char ch=getchar();
    while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    flag?x=-x:0;
}

//快写 
template<typename type>
inline void write(type x,bool mode)
{
    x<0?x=-x,putchar('-'):0;static short Stack[200],top(0);
    do Stack[++top]=x%10,x/=10; while(x);
    while(top) putchar(Stack[top--]|48);
    mode?puts(""):putchar(' ');
}

//初始化 
template<typename type>
inline void init(type n,type m,vector<vector<int> >&a)
{
    a.resize(n+1);
    for(int i=1;i<=n;i++) a[i].resize(m+1);
    return;
}

//矩阵输入 
template<typename type>
inline void matin(type n,type m,vector<vector<int> >&a)
{
    init(n,m,a);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            read(a[i][j]);
    return;
}

//矩阵输出 
template<typename type>
inline void matout(type n,type m,vector<vector<int> >&a)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) write(a[i][j],0);
        puts(" ");
    }
    puts("");
    return;
}

//矩阵加减法 
template<typename type>
inline void matadd(type n,type m,vector<vector<int> >&a,vector<vector<int> >&b,vector<vector<int> >&c)
{
    init(n,m,c);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            c[i][j]=a[i][j]+b[i][j];//对减法也适用 
    return;
}

//矩阵数乘 
template<typename type>
inline void matscamul(type n,type m,type k,vector<vector<int> >&a,vector<vector<int> >&c)//k为运算数 
{
    init(n,m,c);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            c[i][j]=a[i][j]*k;
    return;
}

//矩阵乘法 
template<typename type>
inline void matmul(type x,type y,type z,vector<vector<int> >&a,vector<vector<int> >&b,vector<vector<int> >&c)//a矩阵:x*y b矩阵:y*z 
{
    init(x,z,c);
    for(int i=1;i<=x;i++)
        for(int j=1;j<=z;j++)//注意顺序! 
            for(int k=1;k<=y;k++)
                c[i][j]+=a[i][k]*b[k][j];
    return;
}

//矩阵转置 
template<typename type>
inline void mattrans(type n,type m,vector<vector<int> >&a,vector<vector<int> >&c)
{
    init(m,n,c);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            c[j][i]=a[i][j];
    return;
}

//矩阵的迹
template<typename type>
inline int mattrace(type n,vector<vector<int> >&a)
{
    int res(0);
    for(int i=1;i<=n;i++) res+=a[i][i];
    return res;
}

signed main()
{
    //矩阵加(减)法(c=a+b)
    cin>>n>>m;
    matin(n,m,a);
    matin(n,m,b);
    matadd(n,m,a,b,c);
    matout(n,m,c);
    
    //矩阵数乘(c=k*a)
    cin>>n>>m>>k;
    matin(n,m,a);
    matscamul(n,m,k,a,c);
    matout(n,m,c);
    
    //矩阵乘法(c=a*b)
    cin>>n>>m>>k;
    matin(n,m,a);
    matin(m,k,b);
    matmul(n,m,k,a,b,c);
    matout(n,k,c);
    
    //矩阵转置(c=aT)
    cin>>n>>m;
    matin(n,m,a);
    mattrans(n,m,a,c);
    matout(m,n,c);
    
    //矩阵的迹(res=∑i=1,i<=n(a[i][i]))
    cin>>n;
    matin(n,n,a);
    cout<<mattrace(n,a)<<endl;
    
    return 0;
}

类实现

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 110

using namespace std;

template<typename type>
inline void read(type &x)
{
    x=0;bool flag(0);char ch=getchar();
    while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    flag?x=-x:0;
}

template<typename type>
inline void write(type x,bool flag=1)
{
    x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
    do Stack[++top]=x%10,x/=10;while(x);
    while(top) putchar(Stack[top--]|48);
    flag?putchar('\n'):putchar(' ');
}

class matrix
{
    public:
        int n,m,a[maxn][maxn];
        matrix(int x=0,int y=0){n=x,m=y;}
        void clear(){memset(a,0,sizeof(a));}
        void in(){read(n),read(m);for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)read(a[i][j]);}
        void out(){for(int i=1;i<=n;++i){for(int j=1;j<=m;++j)write(a[i][j],0);puts("");}}
        matrix operator +(const matrix &b)const
        {
            matrix res(n,m);
            for(int i=1;i<=n;++i)
                for(int j=1;j<=m;++j)
                    res.a[i][j]=a[i][j]+b.a[i][j];
            return res;
        }
        matrix operator +=(const matrix &b){*this=*this+b;return *this;}
        matrix operator -(const matrix &b)const
        {
            matrix res(n,m);
            for(int i=1;i<=n;++i)
                for(int j=1;j<=m;++j)
                    res.a[i][j]=a[i][j]-b.a[i][j];
            return res;
        }
        matrix operator -=(const matrix &b){*this=*this-b;return *this;}
        matrix operator *(const matrix &b)const
        {
            matrix res(n,b.m);
            res.clear();
            for(int i=1;i<=n;++i)
                for(int j=1;j<=b.m;++j)
                    for(int k=1;k<=m;++k)
                        res.a[i][j]+=a[i][k]*b.a[k][j];
            return res;
        }
        matrix operator *=(const matrix &b){*this=*this*b;return *this;}
}A,B;

signed main()
{
    A.in(),B.in();
    (A+B).out(),(A-B).out(),(A*B).out();
    return 0;
}
posted @ 2021-09-08 20:07  凌云_void  阅读(87)  评论(2编辑  收藏  举报