矩陣乘法是一種高效的算法可以把一些一維遞推優化到log( n ),還可以求路徑方案等,所以更是是一種應用性極強的算法。矩陣,是線性代數中的基本概念之一。一個m×n的矩陣就是m×n個數排成m行n列的一個數陣。由於它把許多數據緊湊的集中到了一起,所以有時候可以簡便地表示一些復雜的模型。矩陣乘法看起來很奇怪,但實際上非常有用,應用也十分廣泛。
只有當矩陣A的列數與矩陣B的行數相等時A×B才有意義。一個m×n的矩陣a(m,n)左乘一個n×p的矩陣b(n,p),會得到一個m×p的矩陣c(m,p),滿足矩陣乘法滿足結合律,但不滿足交換律 一般的矩乘要結合快速冪才有效果。(基本上所有矩陣乘法都要用到快速冪的) 在計算機中,一個矩陣實際上就是一個二維數組。一個n行m列的矩陣與一個m行p列的矩陣可以相乘,得到的結果是一個n行p列的矩陣,其中的第i行第j列位置上的數為第一個矩陣第i行上的m個數與第二個矩陣第j列上的m個數對應相乘后所得的m個乘積之和。比如,下面的算式表示一個2行2列的矩陣乘以2行3列的矩陣,其結果是一個2行3列的矩陣。
其中,結果矩陣的那個4(結果矩陣中第二(i)行第二(j)列)
=
2(第一個矩陣第二(i)行第一列)*2(第二個矩陣中第一行第二(j)列) + 0(第一個矩陣第二(i)行第二列)*1(第二個矩陣中第二行第二(j)列)
static void Main(string[] args) { //定義三個數組,分別存儲矩陣A,B,C float[,] a = new float[100,100]; float[,] b = new float[100,100]; float[,] c = new float[100,100]; int n, m, mB, p; float[,] s = new float[100,100]; //矩陣A行數m1,列數n1 n = 2; m = 3; //矩陣B行數m2,列數n2 mB = 3; p = 2; if (m != mB) { //判斷是否可以相乘 Console.WriteLine("不可以相乘!!!"); return; } a[1, 1] = 1; a[1, 2] = 2; a[1, 3] = 4; a[2, 1] = 7; a[2, 2] = 9; a[2, 3] = 6; b[1, 1] = 1; b[1, 2] = 7; b[2, 1] = 2; b[2, 2] = 9; b[3, 1] = 4; b[3, 2] = 6; Console.WriteLine("矩陣A:\n"); for (var i = 1; i <= n; i++) { for (var j = 1; j <= m; j++) { Console.Write("{0}-", a[i, j]); if (j == m)Console.Write("\n"); } } Console.WriteLine("矩陣B:\n"); for (var i = 1; i <= m; i++) { for (var j = 1; j <= p; j++) { Console.Write("{0}-",b[i, j]); if (j == p)Console.Write("\n"); } } Console.WriteLine("矩陣C=A*B:\n"); for (var i = 1; i <= n; i++) { for (var j = 1; j <= p; j++) { for (var k = 1; k <= m; k++) { s[i,j] = s[i,j] + a[i,k]*b[k,j]; } c[i,j] = s[i,j]; Console.Write("{0}-",c[i,j]); if (j == p) Console.Write("\n"); } } Console.Read(); }