天天看點

初學矩陣乘法

矩乘是一個$n*m$的矩陣乘上一個$m*k$的矩陣,得到一個$n*k$的矩陣。

前言

何謂矩陣乘法?就是矩陣之間的乘法。

矩陣乘法并不是簡單地将兩個矩陣中對應位置上對應元素相乘,而是更為複雜。

矩陣乘法應用廣泛,典例就是優化遞推。

矩陣乘法

首先我們要知道,矩乘是一個\(n*m\)的矩陣乘上一個\(m*k\)的矩陣,得到一個\(n*k\)的矩陣。

由此容易發現,矩乘是不滿足交換律的。

其中,第一個矩陣第\(x\)行的元素,與第二個矩陣第\(y\)列的元素,逐一對應相乘之後再取得的和,就是答案矩陣中第\(x\)和第\(y\)列的值。

用式子表示,就是:

\[res_{x,y}=\sum_{i=1}^mA_{x,i}\cdot B_{i,y}

\]

用代碼表示,就是:(注意,字母表示有點出入)

inline Mat operator * (const Mat& A,const Mat& B)
{
	Mat res(A.n,B.m);register int i,j,k;
	for(k=1;k<=A.m;++k) for(i=1;i<=A.n;++i)
		for(j=1;j<=B.m;++j) res.v[i][j]+=A.v[i][k]*B,v[k][j];
	return res;
}
           

矩陣快速幂

矩陣快速幂與普通的快速幂類似,主要是要注意答案初始化的問題,一般會初始化為左上-右下對角線上都是\(1\),其他位置都是\(0\)。

做矩陣快速幂的矩陣應該是形如\(n*n\)的矩陣。

代碼實作如下:

inline Mat operator ^ (Mat x,int y)
{
	Mat t(x.n,x.n);for(int i=1;i<=t.n;++i) t.v[i][i]=1;
	W(y) y&1&&(t=t*x,0),x=x*x,y>>=1;return t;
}
           

應用

對于一個遞推式,我們可以通過求出其轉移矩陣,然後矩陣快速幂來快速求出答案。

而在一些資料結構中也可以用它來較好地維護資訊。