-
加減法#
非常簡單,只要對應位置相加就行了(余老師:這不是今天的重點!!!
-
數乘#
嗯,把所有元素同時乘以那個數就行了
-
矩陣乘矩陣#
比較複雜,
A*B 首先要 A 的列數 = B 的行數
然後看圖意會一下,A 橫著過,B 豎著過,
C[i][j]=A[i][k]*A[k][j]相加,1<=k<=A的列數(或B的行數)
(漢字表示結果的第 i 行,數字表示結果的第 j 列。
稍微寫了一個代碼
#include<iostream> using namespace std; const int MAXN=1e4+5; int a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN]; int main(){ int h1,l1,h2,l2; cin>>h1>>l1>>h2>>l2; if(l1!=h2){ cout<<"算不了\n"; return 0; } for(int i=1;i<=h1;++i){ for(int j=1;j<=l1;++j){ cin>>a[i][j]; } } for(int i=1;i<=h2;++i){ for(int j=1;j<=l2;++j){ cin>>b[i][j]; } } for(int i=1;i<=h1;++i){ for(int j=1;j<=l2;++j){ int s=0; for(int k=1;k<=l1;++k){ s=s+a[i][k]*b[k][j]; } c[i][j]=s; } } for(int i=1;i<=h1;++i){ for(int j=1;j<=l2;++j){ cout<<c[i][j]<<" "; } cout<<'\n'; } return 0; }
-
轉置#
把行變成列,列變成行
然後有一些性質
-
求遞推#
把遞推式寫成只有一行的矩陣。
比如費波拉契,
f[i]=f[i-1]+f[i-2]
寫成
[f[i],f[i-1]
那麼
[f[i-1],f[i-2]]
乘上一個特定的 n*n(元素個數) 的矩陣 A 就可以成為[f[i],f[i-1]]
這裡可以求出這個 A 是
1 1 1 0
那麼第 i 項就是
[1,0]*A^(i-1)
-
快速冪#
原理跟整數的差不多,代碼如下(需自行重載 * 運算符)
juzhen pow(int k){ juzhen res=*this; juzhen ret(h,l); ret.cleanForPow(); while(k){ if(k&1){ ret=ret*res; } res=res*res; k>>=1; } return ret; }