Design-and-analysis-of-algorithms-strassens-matrix-multiplication

提供:Dev Guides
移動先:案内検索

DAA-Strassenの行列乗算

この章では、まず行列乗算の一般的な方法について説明し、後でStrassenの行列乗算アルゴリズムについて説明します。

問題文

2つの行列 XY を考えてみましょう。 XY を乗算して、結果のマトリックス Z を計算します。

ナイーブ法

最初に、単純な方法とその複雑さについて説明します。 ここでは、 _ Z = X×Y_ を計算しています。 ナイーブ法を使用すると、これらの行列の順序が p×qq×r の場合、2つの行列( XY )を乗算できます。 アルゴリズムは次のとおりです。

Algorithm: Matrix-Multiplication (X, Y, Z)
for i = 1 to p do
   for j = 1 to r do
      Z[i,j] := 0
      for k = 1 to q do
         Z[i,j] := Z[i,j] + X[i,k] × Y[k,j]

複雑

ここでは、整数演算に O(1) 時間かかると想定しています。 このアルゴリズムには3つの for ループがあり、一方はもう一方にネストされています。 したがって、アルゴリズムの実行には O(n ^ 3 ^) 時間かかります。

Strassenの行列乗算アルゴリズム

このコンテキストでは、Strassenの行列乗算アルゴリズムを使用して、時間消費を少し改善できます。

Strassenの行列乗算は、正方行列n は* 2のべき乗*)でのみ実行できます。 両方の行列の次数は n×n です。

以下に示すように、 XY 、および Z を4つの(n/2)×(n/2)行列に分割します−

$ Z = \ begin \ {bmatrix} I&J \\ K&L \ end \ {bmatrix} $ $ X = \ begin \ {bmatrix} A&B \\ C&D \ end \ {bmatrix} $および$ Y = \ begin \ {bmatrix} E&F \\ G&H \ end \ {bmatrix} $

Strassenのアルゴリズムを使用して、以下を計算します-

M _ \ {1} \:\ colon =(A + C)\ times(E + F)

M _ \ {2} \:\ colon =(B + D)\ times(G + H)

M _ \ {3} \:\ colon =(A-D)\ times(E + H)

M _ \ {4} \:\ colon = A \ times(F-H)

M _ \ {5} \:\ colon =(C + D)\ times(E)

M _ \ {6} \:\ colon =(A + B)\ times(H)

M _ \ {7} \:\ colon = D \ times(G-E)

その後、

I \:\ colon = M _ \ {2} + M _ \ {3}-M _ \ {6}-M _ \ {7}

J \:\ colon = M _ \ {4} + M _ \ {6}

K \:\ colon = M _ \ {5} + M _ \ {7}

L \:\ colon = M _ \ {1}-M _ \ {3}-M _ \ {4}-M _ \ {5}

分析

$ T(n)= \ begin \ {cases} c&if \:n = 1 \\ 7 \:x \:T(\ frac \ {n} \ {2})+ d \:x \:n ^ 2およびそれ以外の場合\ end \ {cases} $ここで、_c_および_d_は定数です

この再帰関係を使用して、$ T(n)= O(n ^ \ {log7})$を取得します

したがって、Strassenの行列乗算アルゴリズムの複雑さは$ O(n ^ \ {log7})$です。