web-dev-qa-db-ja.com

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

誰かが直感的な方法で行列乗算のためのシュトラッセンのアルゴリズムを説明できますか?私は本とウィキの説明を通り抜けました(まあ、通り抜けようとしました)が、それは二階をクリックしていません。正式な表記法などではなく、多くの英語を使用するWeb上のリンクも役立ちます。このアルゴリズムを暗記せずに最初から構築するのに役立つ可能性のある類似点はありますか?

30

次のように、2つの2x2行列を乗算することを検討してください。

A B * E F = AE+BG AF+BH
C D   G H   CE+DG CF+DH

右側を計算する明白な方法は、8つの乗算と4つの加算を行うことです。しかし、乗算は加算よりもはるかに高価であると想像してください。したがって、可能な限り乗算の数を減らしたいと考えています。 Strassenはトリックを使用して、乗算を1つ減らし、加算(および減算)を増やして右側を計算します。

これが7つの乗算です:

M1 = (A + D) * (E + H) = AE + AH + DE + DH
M2 = (A + B) * H = AH + BH
M3 = (C + D) * E = CE + DE
M4 = A * (F - H) = AF - AH
M5 = D * (G - E) = DG - DE
M6 = (C - A) * (E + F) = CE + CF - AE - AF
M7 = (B - D) * (G + H) = BG + BH - DG - DH

したがって、AE + BGを計算するには、M1 + M7(AEとBGの項を取得します)から始めて、AE + BGがすべて残るまで、他のMのいくつかを加算/減算します。奇跡的に、MはM1 + M7-M2 + M5が機能するように選択されています。必要な他の3つの結果と同じです。

ここで、これが2x2行列だけでなく、A..Hが部分行列である任意の(偶数)サイズの行列に対して機能することを理解してください。

41
Keith Randall

私の意見では、あなたが得る必要がある3つのアイデアがあります:

  1. 行列をブロックに分割し、数値の行列の場合と同じように、結果のブロックの行列を操作できます。特に、このような2つのブロック行列を乗算して(もちろん、一方のブロック行の数が他方のブロック列の数と一致する限り)、元の数値行列を乗算する場合と同じ結果を得ることができます。

  2. 2x2ブロック行列乗算の結果を表すために必要なブロックには、元の式が示すよりも少ない乗算でそれらを計算できるようにするのに十分な共通因子があります。これは トニーの答え で説明されているトリックです。

  3. 再帰。

Strassenアルゴリズムは、上記の単なるアプリケーションです。その複雑さの分析を理解するには、Ronald Graham、Donald Knuth、およびOrenPatashnikまたは同様の本による " Concrete Mathematics "を読む必要があります。

29
Rafał Dowgird

ウィキペディアをざっと見てみると、このアルゴリズムは方程式を並べ替えることで必要な乗算の数をわずかに減らしているように見えます。

これがアナロジーです。 x*x + 5*x + 6の乗算はいくつですか?二、そうですか? (x+2)(x+3)の乗算はいくつですか?一つでしょ?しかし、それらは同じ表現です!

これがアルゴリズムの深い理解を提供することを期待していないことに注意してください。アルゴリズムが計算の複雑さの改善につながる可能性がある方法を理解できる直感的な方法にすぎません。

26