目錄
- 一、前置知識:向量(一列或一行的矩陣)、矩陣
- 1. 行向量
- 2. 列向量
- 3. 向量其余基本概念
- 4. 矩陣基本概念
- 5. 關于它們的細節
- 二、運算
- 1. 轉置
- (1)定義
- (2)性質
- 2. 矩陣(向量)與矩陣(向量)的加減法
- 3. 點乘與乘法
- (1)定義:矩陣點乘
- (2)定義:向量點乘
- (3)定義:矩陣(向量)與標量的乘法
- (4)定義:矩陣(向量)與矩陣(向量)的乘法
- (5)性質:矩陣(向量)與矩陣(向量)的乘法
- (6)應用:矩陣快速冪,進行加速
- 三、拓展
- 1. 向量表示里的幾何意義
- 2. 向量加法里的幾何意義
- 3. 向量求反里的幾何意義
- 四、結尾
一、前置知識:向量(一列或一行的矩陣)、矩陣
1. 行向量
例如 [ 1 1 4 ] \begin{bmatrix}1&1&4\end{bmatrix} [1?1?4?],這就是一個行向量, [ 1 1 4 ] \begin{bmatrix}1&1&4\end{bmatrix} [1?1?4?]可以理解為一個 1 1 1行 3 3 3列矩陣。
行向量: [ a 1 … a n ] \begin{bmatrix}a_1&\dots&a_n\end{bmatrix} [a1??…?an??], n n n為任意取值。
2. 列向量
例如 [ 5 1 4 ] \begin{bmatrix}5\\1\\4\end{bmatrix} ?514? ?,這就是一個列向量, [ 5 1 4 ] \begin{bmatrix}5\\1\\4\end{bmatrix} ?514? ?可以理解為一個 3 3 3行 1 1 1列的矩陣。
列向量: [ a 1 ? a n ] \begin{bmatrix}a_1\\\vdots\\a_n\end{bmatrix} ?a1??an?? ?, n n n為任意取值。
3. 向量其余基本概念
向量是一個有方向與大小的量,它的起點可以是任意位置。
維度:
[ a 1 ] \begin{bmatrix}a_1\end{bmatrix} [a1??],這是一個一維向量,它僅有一個數字。而 [ a 1 ? a n ] \begin{bmatrix}a_1\\\vdots\\a_n\end{bmatrix} ?a1??an?? ?與 [ a 1 … a n ] \begin{bmatrix}a_1&\dots&a_n\end{bmatrix} [a1??…?an??],它們都是 n n n維的。
長度:
向量的長度也就是它的大小,我們稱它為模。而模則為向量起點與終點之間的距離。
4. 矩陣基本概念
[ 1 1 4 1 6 1 4 1 5 ] \begin{bmatrix}1&1&4\\1&6&1\\4&1&5\end{bmatrix} ?114?161?415? ?注: 這是一個維度為 3 × 3 3\times3 3×3的矩陣。
一個矩陣的維度表示為 m × n m\times n m×n,即 m m m行 n n n列的矩陣。
5. 關于它們的細節
向量可以視為一種特殊的矩陣,我們通常用大寫字母表示矩陣;小寫字母表示向量,可帶一個小箭頭,例如 v ? \vec{v} v。例如 v i v_i vi?表示向量 v v v的第 i i i項(即第 i i i個元素,行向量從左往右數,列向量從上往下), a i , j a_{i,j} ai,j?或 A i , j A_{i,j} Ai,j?表示矩陣 A A A的第 i i i行第 j j j列的元素。
二、運算
下文由于向量可以視為一種特殊的矩陣,且為了方便所以均用大寫字母表示向量或矩陣。
1. 轉置
(1)定義
A T A^T AT表示對 A A A進行轉置,即 A A A的第 i i i行將變成
A T A^T AT的第 i i i列。若 A = [ 1 1 4 5 1 4 ] A=\begin{bmatrix}1&1&4\\5&1&4\end{bmatrix} A=[15?11?44?],則 A T = [ 1 5 1 1 4 4 ] A^T=\begin{bmatrix}1&5\\1&1\\4&4\end{bmatrix} AT= ?114?514? ?。
(2)性質
- ( A T ) T = A (A^T)^T=A (AT)T=A
- ( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT
2. 矩陣(向量)與矩陣(向量)的加減法
我們設 A ± B = C A\pm B=C A±B=C。
A ± B A\pm B A±B不是隨便的, A A A與 B B B要求維度相同。且 C C C維度仍與 A A A、 B B B相同。
運算方式, C i , j = A i , j ± B i , j C_{i,j}=A_{i,j}\pm B_{i,j} Ci,j?=Ai,j?±Bi,j?。
3. 點乘與乘法
(1)定義:矩陣點乘
我們設 A ° B = C A\circ B=C A°B=C。
矩陣點乘的符號為“ ° \circ °”,其中 A A A、 B B B、 C C C均為矩陣,且維度相同。運算方法也很簡單, C i , j = A i , j × B i , j C_{i,j}=A_{i,j}\times B_{i,j} Ci,j?=Ai,j?×Bi,j?。
(2)定義:向量點乘
我們再設 A ? B = n A\cdot B=n A?B=n。
顯然 A A A、 B B B均為向量,且維度相同,而 n n n又是一個標量。那 n n n為多少? n = ∑ i = 1 m A i , j B i , j n=\sum_{i=1}^mA_{i,j}B_{i,j} n=∑i=1m?Ai,j?Bi,j?( m m m為 A A A、 B B B的維度)。
(3)定義:矩陣(向量)與標量的乘法
我們再設 n A = B nA=B nA=B。
則 A A A、 B B B為矩陣(向量), n n n為標量,顯而易見 B i , j = n A i , j B_{i,j}=nA_{i,j} Bi,j?=nAi,j?。
(4)定義:矩陣(向量)與矩陣(向量)的乘法
我們再再設 A B = C AB=C AB=C,設 A A A維度為 m × n m\times n m×n,而 B B B維度為 n × p n\times p n×p,則 C C C維度為 m × p m\times p m×p。
運算方式大概如此(復雜): C i , j = A i 行 ? B j 列 C_{i,j}=A_{i行}\cdot B_{j列} Ci,j?=Ai行??Bj列?,即 C i , j = ∑ i = 1 n A i , k B k , j C_{i,j}=\sum_{i=1}^nA_{i,k}B_{k,j} Ci,j?=∑i=1n?Ai,k?Bk,j?。
(5)性質:矩陣(向量)與矩陣(向量)的乘法
- 沒有交換律。
- 有結合律和分配率。
(6)應用:矩陣快速冪,進行加速
現在目光轉置P1962,要運用矩陣乘法來解決求斐波那契數列第 n n n項(對 1 0 9 + 7 10^9+7 109+7取模)。
我們構造一個矩陣 A A A與矩陣 B B B, A = [ x y ] A=\begin{bmatrix}x&y\end{bmatrix} A=[x?y?], B = [ 1 1 1 0 ] B=\begin{bmatrix}1&1\\1&0\end{bmatrix} B=[11?10?],而 A B = [ x + y x ] AB=\begin{bmatrix}x+y&x\end{bmatrix} AB=[x+y?x?]。現在設 x x x是斐波那契數列的第 ( i + 1 ) (i+1) (i+1)項(簡記 F i + 1 F_{i+1} Fi+1?), y y y則為第 i i i項(簡記 F i F_i Fi?)。再把目光轉回矩陣, A = [ F i + 1 F i ] A=\begin{bmatrix}F_{i+1}&F_i\end{bmatrix} A=[Fi+1??Fi??],
則 A B = [ F i + 1 + F n F i + 1 ] AB=\begin{bmatrix}F_{i+1}+F_n&F_{i+1}\end{bmatrix} AB=[Fi+1?+Fn??Fi+1??],根據斐波那契數列的規律, F i + 1 + F i = F i + 2 F_{i+1}+F_i=F_{i+2} Fi+1?+Fi?=Fi+2?,so A B = [ F i + 2 F i + 1 ] AB=\begin{bmatrix}F_{i+2}&F_{i+1}\end{bmatrix} AB=[Fi+2??Fi+1??],很容易發現 A B AB AB比 A A A中每項都進了一位,也就是說只要一直乘 B B B直至結果矩陣為 [ F n F n ? 1 ] \begin{bmatrix}F_n&F_{n-1}\end{bmatrix} [Fn??Fn?1??],第一項就是P1962的答案。
但是直接遞推到 F n F_n Fn?是 O ( n ) O(n) O(n)的,乘到 F n F_n Fn?也是 O ( n ) O(n) O(n)的。但是多個相同數相乘是數的冪,多個相同矩陣相乘是矩陣的冪,同樣也可以使用快速冪,現在復雜度大約為 O ( k l o g 2 n ) O(klog_2n) O(klog2?n)(有些小細節沒有提及), k k k為矩陣乘法運算時耗掉的。這時當 n n n的值到達一個程度,時間就會大幅減少。
代碼如下。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll p=1e9+7;
struct mat{ll nr,nc;ll m[15][15];mat(ll NR=0,ll NC=0){nr=NR,nc=NC;memset(m,0,sizeof(m));}mat operator=(mat b){nr=b.nr;nc=b.nc;for(int i=1;i<=nr;i++)for(int j=1;j<=nc;j++)m[i][j]=b.m[i][j];}
};
mat operator*(mat a,mat b){mat c(a.nr,b.nc);for(int i=1;i<=a.nr;i++){for(int j=1;j<=b.nc;j++){for(int k=1;k<=a.nc;k++){c.m[i][j]=(a.m[i][k]*b.m[k][j]%p+c.m[i][j])%p;}}}return c;
}
mat fastpow(mat a,ll b){if(b==1)return a;if(b%2==0)return fastpow(a*a,b/2);else return fastpow(a*a,b/2)*a;
}
int main(){ll n;cin>>n;if(n<=2){cout<<1;return 0;}mat fib(1,2),tmp(2,2),tmp2;fib.m[1][1]=1,fib.m[1][2]=1;tmp.m[1][1]=1,tmp.m[1][2]=1;tmp.m[2][1]=1;tmp2=fib*fastpow(tmp,n-2);cout<<tmp2.m[1][1];
}
三、拓展
1. 向量表示里的幾何意義
例如有一個二維向量, v ? = [ x y ] \vec{v}=\begin{bmatrix}x\\y\end{bmatrix} v=[xy?],它將原點 ( 0 , 0 ) (0,0) (0,0)作為起點時,它的終點就是 ( x , y ) (x,y) (x,y)。
2. 向量加法里的幾何意義
如圖,向量 a a a與向量 b b b頭尾相接最終與向量 c c c到達同一目的地,而恰好 a ? + b ? = c ? \vec{a}+\vec{b}=\vec{c} a+b=c。
3. 向量求反里的幾何意義
a ? \vec{a} a與 ? a ? -\vec{a} ?a的區別在于將 a ? \vec{a} a旋轉 180 ° 180\degree 180°就可以得 ? a ? -\vec{a} ?a,即方向相反。