MATMUL(MATRIX_A, MATRIX_B, MINDIM)
目的
マトリックス乗算を実行します。
クラス
変換関数
引数型および属性
- MATRIX_A
- ランク 1 または 2 の NUMERIC または LOGICAL 配列。
- MATRIX_B
- ランク 1 または 2 の NUMERIC または LOGICAL 配列。 MATRIX_A と異なる NUMERIC 型であっても構いませんが、1 つの NUMERIC マトリックスと 1 つの LOGICAL マトリックスという使い方はできません。
MINDIM (オプション)- マトリックス乗算に Strassen アルゴリズムの Winograd バリエーション (大きいマトリックスの場合は高速) を使用するかどうかを決定する整数。このアルゴリズムは、オペランドのマトリックスを、
ほぼ同じ大きさの 4 つの部分に、いずれかのサブマトリックスの範囲が MINDIM より
小さくなるまで再帰的に分割します。注: 入力マトリックスの行または列の スケーリングによっては、Strassen 方式は安定的ではありません。従って、MATRIX_A と MATRIX_B に、 発散する指数値が含まれる場合は、Strassen 方式では不正確な結果に なることがあります。MINDIM の値の意味は、次のとおりです。
- <=0
- Strassen アルゴリズムを使用しません。これはデフォルトです。
- 1
- 将来の使用のために予約されています。
- >1
- 引数の配列のすべての次元の最小の範囲がこの値以上である限り、 再帰的に Strassen アルゴリズムを適用します。最適のパフォーマンスを得るには、 MINDIM の値を変えて試してみる必要があります。最適な値は、マシン構成、使用可能メモリー、および、 配列のサイズ、型、kind 型パラメーターに依存するためです。
デフォルトでは、MATMUL はマトリックス乗算の標準的な O(N**3) 方式を 採用します。
libpthreads.a ライブラリーがリンクされている場合は、 以下の条件下で、O(N**2.81) Strassen 方式の Winograd バリエーションが 採用されます。- MATRIX_A と MATRIX_B の両方が、整数、実数、または複素数であり、kind が同じである。
- プログラムは、範囲 N の正方マトリックス用の約 (2/3)*(N**2) エレメントを保持するのに十分な、 必要な一時ストレージを割り振ることができる。
- MINDIM 引数は、MATRIX_A および MATRIX_B のすべての範囲の最小より小さいか等しい。

引数のうち少なくとも 1 つは、階数が 2 でなければなりません。MATRIX_B の最初または唯一の次元は、 MATRIX_A の最後または唯一の次元と等しくなければなりません。
結果値
結果は、1 つの配列です。いずれか 1 つの引数の階数が 1 である場合、結果の 階数は 1 です。両方の引数とも階数が 2 である場合、結果の階数は 2 です。
結果のデータ型は、表 1 および 表 1 に記述された規則に従って、 引数のデータ型に基づいて決まります。
MATRIX_A と MATRIX_B が数値データ型の場合、 結果の配列エレメントは、次のようになります。
エレメント (i,j) の値 = SUM( (MATRIX_A の行 i) * (MATRIX_B の列 j) )
MATRIX_A と MATRIX_B が論理型の場合、 結果の配列エレメントは、次のようになります。
エレメント (i,j) の値 = ANY( (MATRIX_A の行 i) .AND. (MATRIX_B の列 j) )
例
! A is the array | 1 2 3 |, B is the array | 7 10 |
! | 4 5 6 | | 8 11 |
! | 9 12 |
RES = MATMUL(A, B)
! The result is | 50 68 |
! | 122 167 |

! HUGE_ARRAY and GIGANTIC_ARRAY in this example are
! large arrays of real or complex type, so the operation
! might be faster with the Strassen algorithm.
RES = MATMUL(HUGE_ARRAY, GIGANTIC_ARRAY, MINDIM=196)

関連情報
Strassen 方式でのマトリックス乗算の数値的安定度については、以下の資料に説明があります。
Exploiting Fast Matrix Multiplication Within the Level 3 BLAS
, Nicholas J. Higham, ACM Transactions on Mathematical Software, Vol. 16, No. 4, December 1990.GEMMW: A portable level 3 BLAS Winograd variant of Strassen's matrix-matrix multiply algorithm
, Douglas, C. C., Heroux, M., Slishman, G., and Smith, R. M., Journal of Computational Physics, Vol. 110, No. 1, January 1994, pages 1-10