函数+模板实现
#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;
}