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 マトリックスという使い方はできません。
IBM 拡張の始まりMINDIM (オプション)
マトリックス乗算に Strassen アルゴリズムの Winograd バリエーション (大きいマトリックスの場合は高速) を使用するかどうかを決定する整数。このアルゴリズムは、オペランドのマトリックスを、 ほぼ同じ大きさの 4 つの部分に、いずれかのサブマトリックスの範囲が MINDIM より 小さくなるまで再帰的に分割します。
注: 入力マトリックスの行または列の スケーリングによっては、Strassen 方式は安定的ではありません。従って、MATRIX_AMATRIX_B に、 発散する指数値が含まれる場合は、Strassen 方式では不正確な結果に なることがあります。
MINDIM の値の意味は、次のとおりです。
<=0
Strassen アルゴリズムを使用しません。これはデフォルトです。
1
将来の使用のために予約されています。
>1
引数の配列のすべての次元の最小の範囲がこの値以上である限り、 再帰的に Strassen アルゴリズムを適用します。最適のパフォーマンスを得るには、 MINDIM の値を変えて試してみる必要があります。最適な値は、マシン構成、使用可能メモリー、および、 配列のサイズ、型、kind 型パラメーターに依存するためです。

デフォルトでは、MATMUL はマトリックス乗算の標準的な O(N**3) 方式を 採用します。

libpthreads.a ライブラリーがリンクされている場合は、 以下の条件下で、O(N**2.81) Strassen 方式の Winograd バリエーションが 採用されます。
  1. MATRIX_AMATRIX_B の両方が、整数、実数、または複素数であり、kind が同じである。
  2. プログラムは、範囲 N の正方マトリックス用の約 (2/3)*(N**2) エレメントを保持するのに十分な、 必要な一時ストレージを割り振ることができる。
  3. MINDIM 引数は、MATRIX_A および MATRIX_B のすべての範囲の最小より小さいか等しい。IBM 拡張の終わり

引数のうち少なくとも 1 つは、階数が 2 でなければなりません。MATRIX_B の最初または唯一の次元は、 MATRIX_A の最後または唯一の次元と等しくなければなりません。

結果値

結果は、1 つの配列です。いずれか 1 つの引数の階数が 1 である場合、結果の 階数は 1 です。両方の引数とも階数が 2 である場合、結果の階数は 2 です。

結果のデータ型は、表 1 および 表 1 に記述された規則に従って、 引数のデータ型に基づいて決まります。

MATRIX_AMATRIX_B が数値データ型の場合、 結果の配列エレメントは、次のようになります。

エレメント (i,j) の値 = SUM( (MATRIX_A の行 i) * (MATRIX_B の列 j) )

MATRIX_AMATRIX_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 |
IBM 拡張の始まり
! 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)
IBM 拡張の終わり

関連情報

IBM 拡張の始まり
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-10IBM 拡張の終わり