更新日志
20250119:开工。
运算
对于矩阵乘法运算
\[A\times B=C \]你可以认为,\(C\) 中第 \(i\) 行第 \(j\) 列的元素,就是 \(A\) 的第 \(i\) 行依次与 \(B\) 的第 \(j\) 列相乘的乘积之和。
形式化的:
\[C_{i,j}=\sum_{k=1}^n A_{i,k}B_{k,j} \]写成代码就是:
rep(i,1,n)rep(j,1,n)rep(k,1,n)
c[i][j]+=a[i][k]*b[k][j];
至于加法,各位分别相加即可。
模板
template <typename T>
struct matrix{
int n;
vec<vec<T>> x;
matrix(int l,bool k=0){
n=l;
x.resize(n,vec<T>(n,0));
if(k)repl(i,0,n)x[i][i]=1;
}
vec<T>& operator[](int i){return x[i];}
matrix operator+(matrix obj){
matrix c(n);
repl(i,0,n)repl(j,0,n)
c[i][j]=x[i][j]+obj[i][j];
return c;
}
matrix operator*(matrix obj){
matrix c(n);
repl(i,0,n)repl(j,0,n)repl(k,0,n)
c[i][j]+=x[i][k]*obj[k][j];
return c;
}
bool operator==(matrix obj){
if(n!=obj.n)return 0;
repl(i,0,n)repl(j,0,n)
if(x[i][j]!=obj[i][j])return 0;
return 1;
}
};
模板特点
- 首先你可以自由传入类型。当然肯定是 \(\text{int,long long}\) 之类的数。
- 使用了动态数组(实际上是
vector
)可以动态开空间。 - 可以初始化矩阵 \(1\)。第二个参数传入 \(1\) 即可。(第一个参数是大小)
- 重载了
+ * ==
等运算符。没啥好说的。 - 重载了下标,也就是可以直接通过这个矩阵的名字作为数组名(
Matrix[][]
),而不用Matrix.x[][]
。 - 以及留作提醒,初始化矩阵,无需一个一个下标去赋值,可以直接
Matrix.x={}
,也就是直接给vector
赋值即可。这样直接写会方便一些。
差不多就这样。
标签:obj,matrix,矩阵,repl,加法,return,模板,Matrix From: https://www.cnblogs.com/HarlemBlog/p/18680509