MATMUL(MATRIX_A, MATRIX_B, MINDIM)

目的

マトリックス乗算を実行します。

クラス

変換関数

引き数の型と属性

MATRIX_A
ランクが 1 または 2 で、データ型が数値または論理の配列です。

MATRIX_B
ランクが 1 または 2 で、データ型が数値または論理の配列です。

これは MATRIX_A とは異なる数値型の場合もありますが、 1 つの数値マトリックスに 1 つの論理マトリックスという使い方はできません。

+----------------------------------IBM 拡張----------------------------------+

MINDIM (オプション)
Strassen アルゴリズムの Winograd 変分 (大きなマトリックスに対しては速い場合がある) を使用してマトリックス乗算を実行するかどうかを決定する整数です。 このアルゴリズムは、サブマトリックスのエクステントが MINDIM よりも 小さくなるまで、オペランドのマトリックスを 4 つのほぼ等しい部分に再帰的に分割します。
注:
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_AMATRIX_B のすべてのエクステントの最小よりも小さいか等しくなります。

+------------------------------End of IBM 拡張-------------------------------+

最低でも 1 つの引き数のランクを 2 にしなければなりません。 MATRIX_B の唯一のまたはその最初の 次元は、MATRIX_A の唯一のまたは最後の 次元に等しくなければなりません。

結果の値

結果は配列になります。いずれかの引き数のランクが 1 であれば、 結果のランクは 1 になります。両方の引き数のランクが 2 であれば、 結果のランクは 2 になります。

結果のデータ型は、表 7 および 表 8 に 記載されている規則に従って、引き数のデータ型によって異なります。

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

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

! 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)

+------------------------------End of IBM 拡張-------------------------------+

+----------------------------------IBM 拡張----------------------------------+

関連情報

マトリックス乗算に対する Strassen の方式の数値的安定度については、 以下の資料に記述されています。

+------------------------------End of IBM 拡張-------------------------------+

IBM Copyright 2003