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;
    }
    
  • 轉置#

    把行變成列,列變成行

    然後有一些性質

    矩陣轉置

  • 求遞推#

    把遞推式寫成只有一行的矩陣。

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