矩陣入門


什么是矩陣

在數學中,矩陣(Matrix)是一個按照長方陣列排列的復數實數集合 ,最早來自於方程組系數常數所構成的方陣(摘自某百科)

\(n\)\(m\) 列的矩陣大概長這個樣子 :

\[A = \left[\begin{array}{c} a_{1,1}&a_{1,2}&\cdots&a_{1,m}\\ a_{2,1}&a_{2,2}&\cdots&a_{2,m}\\ a_{3,1}& a_{3,2}&\cdots&a_{3,m}\\ \cdots&\cdots& &\cdots\\ a_{n,1}& a_{n,2}&\cdots&a_{n,m} \end{array}\right] \]

\(n \times m\) 個數稱為矩陣 \(A\) 的元素,簡稱為元

\(a_{i,j}\) 位於矩陣的第 \(i\) 行第 \(j\)

定義一個矩陣類 :

struct matrix {
	int r, c; // 矩陣的行與列
	int a[N][M];
	inline matrix(int _r = 0, int _c = 0) {
		r = _r, c = _c;
		memset(a, 0, sizeof a);
	}
}

矩陣的基本運算


加法

注意 : 只有相同大小的矩陣才可以相加

\[\left[\begin{array}{c} 1&4\\ 3&2 \end{array}\right] + \left[\begin{array}{c} 4&2\\ 5&7 \end{array}\right] = \left[\begin{array}{c} 5&6\\ 8&9 \end{array}\right] \]

代碼實現 :

matrix add(matrix A, matrix B) {
	matrix C(A.r, A.c);
	for(int i = 0; i < C.r; ++i) // 枚舉矩陣 C 的行
	  for(int j = 0; j < C.c; ++j) // 枚舉矩陣 C 的列
	  	C.a[i][j] = A.a[i][j] + B.a[i][j];
	return C;
}

矩陣的加法滿足交換律結合律

即 :

\(A + B = B + A\)

\((A + B) + C = A + (B + C)\)


減法

與加法類似, 只有相同大小的矩陣才可以相減


數乘

\(\lambda\) 為常數,矩陣數乘即把矩陣每一個數乘上一個 \(\lambda\)

\[2 \times \left[\begin{array}{c} 1&4\\ 3&2 \end{array}\right] = \left[\begin{array}{c} 2&8\\ 6&4 \end{array}\right] \]

矩陣數乘滿足結合律分配率

即 :

\(\lambda(\mu A) = \mu(\lambda A)\)

\(\lambda (\mu A) = (\lambda \mu)A\)

\((\lambda + \mu)A = \lambda A + \mu A\)

\(\lambda (A + B) = \lambda A + \lambda B\)


矩陣的加減法和矩陣的數乘合稱矩陣的線性運算

其實感覺矩陣加減法只是做了 n * m 次普通的加減法


乘法

重點,很有用

兩個矩陣的乘法當且僅當第一個矩陣 \(A\) 的列數,和另一個矩陣 \(B\) 的行數相等時才能定義

\(A\)\(n \times m\) 的矩陣,\(B\)\(m \times p\) 的矩陣,它們的乘積 \(C\) 是一個 \(n \times p\) 的矩陣

它的一個元素 :

\[c_{i, j} \ \sum_{k = 1}^{m}a_{i, k} b_{k, j} \]

代碼實現 :

matrix mul(matrix A, matrix B) {
	matrix C(A.r, B.c);
	for(int i = 0; i < C.r; ++i) // 枚舉矩陣 C 的行
	  for(int j = 0; j < C.c; ++j) // 枚舉矩陣 C 的列
		for(int k = 0; k < A.c; ++k) // 上面式子中 k = A.c
		  C.a[i][j] += A.a[i][k] * B.a[k][j];
	return C;
}

注意 : 矩陣的乘法不滿足交換率,但滿足結合率分配率

即 :

\(A B \neq B A\)

\((A B) C = A (B C)\)

\((A + B)C = AC + BC\)

\(C(A + B) = CA + CB\)


快速冪

由於矩陣乘法具有結合率,當我要計算一個矩陣的 \(n\) 次方時,可以運用到快速冪的思想

\[A^n = \left\{\begin{array}{l}A^{\lfloor\frac n 2\rfloor} \cdot A^{\lfloor\frac n 2\rfloor} & k是偶數 \\A^{\lfloor \frac n 2\rfloor} \cdot A^{\lfloor\frac n 2\rfloor} \cdot A & k是奇數\end{array}\right. \]

原來乘法求 \(A^n\) 的復雜度是 \(O(s^3n)\) // \(s\) 為矩陣大小

現在只要 \(O(s^3logn)\) 就可以求 \(A^n\)

代碼實現 :

matrix mat_fpm(matrix bs, int mi) {
	matrix res = e; // e 為單位矩陣 (主對角線全 1)
	while(mi) {
		if(mi & 1) res = mul(res, bs);
		bs = mul(bs, bs), mi >>= 1;
	}
	return res;
}

模板 : 洛谷P3390



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM