-
加減法#
非常に簡単で、対応する位置を足し合わせるだけです(余先生:これは今日の重点ではありません!!!
-
数乗#
うん、すべての要素をその数で同時に掛ければいいです。
-
行列の掛け算#
比較的複雑です、
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; }
-
転置#
行を列に、列を行に変えます。
それからいくつかの性質があります。
-
再帰を求める#
再帰式を 1 行の行列に書きます。
例えばフィボナッチ、
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; }