BuringStraw

BuringStraw

行列の基本操作をまとめる

  • 加減法#

    非常に簡単で、対応する位置を足し合わせるだけです(余先生:これは今日の重点ではありません!!!

  • 数乗#

    うん、すべての要素をその数で同時に掛ければいいです。

  • 行列の掛け算#

    比較的複雑です、

    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;
    }
    
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。