【MQL5】Kron関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

Kron関数の働き・役割

Kron関数は、行列同士、行列ベクトルベクトル同士などの「クロネッカー積」と呼ばれる計算を行い、新しい行列を作成するために使用されます。この関数は、MQL5での数値計算やデータの構造化に役立ちます。

クロネッカー積とは

クロネッカー積は、数学で使われる特殊な行列の計算方法の一つです。具体的には、2つの行列またはベクトルを使って、新しい大きな行列を作り出す方法です。
イメージとしては、元の行列ベクトルの各要素を取り出し、それにもう一方の行列ベクトル全体を掛け合わせて作られる「ブロック行列」のようなものです。

例えば、次の2つの小さな行列があるとします。

行列A:

[1 2]
[3 4]

行列B:

[0 5]
[6 7]

クロネッカー積を計算すると、次のような新しい行列ができます。

[1×B 2×B]
[3×B 4×B]

= 
[0 5 0 10]
[6 7 12 14]
[0 15 0 20]
[18 21 24 28]

それぞれの計算過程を具体的に見ていきましょう。

ステップ1: 行列A の左上要素 1 に行列 B を掛ける

1 * [0 5] = [0 5]
    [6 7]   [6 7]

ステップ2: 行列A の右上要素2 に行列 B を掛ける

3 * [0 5] = [0 15]
    [6 7]   [18 21]

ステップ3: 行列A の左下要素3 に行列B を掛ける

3 * [0 5] = [0 15]
    [6 7]   [18 21]

ステップ4: 行列A の右下要素4 に行列B を掛ける

4 * [0 5] = [0 20]
    [6 7]   [24 28]

最終結果:

[0  5  0 10]
[6  7 12 14]
[0 15  0 20]
[18 21 24 28]

これがクロネッカー積の結果です。このように、行列A の各要素行列B を掛け、その結果を順に並べていく形で新しい行列を作ります。

Kron関数の引数について

Kron関数は、呼び出し元の行列ベクトルを基に、指定された行列ベクトルとのクロネッカー積を計算します。

行列同士のクロネッカー積

matrix matrix::Kron(
  const matrix&  b      // 2番目の行列
  );

行列同士のクロネッカー積を計算する場合、呼び出し元の行列からKron関数を呼び出し、もう一つの行列を引数として指定します。

呼び出し元の行列の各要素と、引数で指定した行列全体を掛け合わせて、新しい行列を生成します。

例えば、行列AからKron関数を呼び出し、引数として行列Bを渡すとします。この場合、Aの各要素を用いて行列Bとのクロネッカー積が計算されます。

行列とベクトルのクロネッカー積

matrix matrix::Kron(
  const vector&  b      // ベクトル
  );

行列ベクトルクロネッカー積を計算する場合、呼び出し元の行列からKron関数を呼び出し、引数としてベクトルを指定します。

行列の各要素ベクトルの各要素を掛け合わせて、新しい行列を生成します。例えば、行列AからKron関数を呼び出し、引数ベクトルVを指定すると、Aの各要素にVが掛け合わされて結果が作られます。

ベクトルと行列のクロネッカー積

matrix vector::Kron(
  const matrix&  b      // 行列
  );

ベクトル行列クロネッカー積を計算する場合、呼び出し元のベクトルからKron関数を呼び出し、引数として行列を指定します。

ベクトルの各要素行列の各要素を掛け合わせ、新しい行列を生成します。例えば、ベクトルVからKron関数を呼び出し、引数として行列Bを指定すると、Vの各要素にBが掛け合わされて結果が作られます。

ベクトル同士のクロネッカー積

matrix vector::Kron(
  const vector&  b      // 2番目のベクトル
  );

ベクトル同士のクロネッカー積を計算する場合、呼び出し元のベクトルからKron関数を呼び出し、引数としてもう一つのベクトルを指定します。

呼び出し元のベクトルの各要素と、引数で指定したベクトルの各要素を掛け合わせて、結果を新しい行列として生成します。例えば、ベクトルV1からKron関数を呼び出し、引数ベクトルV2を指定すると、V1とV2の要素を組み合わせた行列が作られます。

共通の特徴

いずれの形式でも、Kron関数は呼び出し元の行列ベクトルのデータを基に、指定された引数とのクロネッカー積を計算します。
結果として、計算に応じた新しい行列が戻されます。
計算の対象となる行列ベクトルの次元によって、結果の行列のサイズが異なる点に注意が必要です。

Kron関数の戻り値について

Kron関数戻り値は、呼び出し元の行列またはベクトルと、引数で指定された行列またはベクトルとのクロネッカー積を計算して得られる新しい行列です。

戻り値の特徴

  1. 戻り値は常に行列型で表現されます。呼び出し元のデータ型が行列でもベクトルでも、結果として生成されるのは行列です。
  2. 戻り値行列のサイズは、呼び出し元の行列ベクトルのサイズと、引数で指定した行列ベクトルのサイズに依存します。

例えば、

具体例

  1. 行列同士の場合 呼び出し元の行列A のサイズが 2×3引数行列B のサイズが 2×2 の場合、結果の行列のサイズは (2×2) × (3×2) となり、4×6行列が生成されます。
  2. 行列ベクトルの場合 呼び出し元の行列A のサイズが 2×3引数ベクトルv がサイズ 2 の場合、結果の行列のサイズは (2×2) × 3 となり、4×3行列が生成されます。
  3. ベクトル同士の場合 呼び出し元のベクトルv1 がサイズ 3引数ベクトルv2 がサイズ 2 の場合、結果の行列3×2行列になります。

注意点

戻り値は、計算結果を反映した新しい行列として生成されるため、元の行列ベクトルのデータが変更されることはありません。
また、呼び出し元や引数の次元が非常に大きい場合、結果の行列も大きくなるため、メモリ消費に注意する必要があります。

戻り値行列は、その後の計算や処理に利用可能であり、結果の再利用や表示、さらに複雑な計算への入力として活用できます。

Kron関数を使ったサンプルコード

//+------------------------------------------------------------------+
//| スクリプトのエントリーポイント                                 |
//+------------------------------------------------------------------+
void OnStart()
{
   // クロネッカー積のデモを行います。
   // まず、行列aと行列b、ベクトルvを定義します。
   
   // 行列aを定義します(2行3列の行列)
   matrix a = {{1, 2, 3}, {4, 5, 6}};
   // 行列bを定義します。これは2行2列の単位行列(対角成分が1)です。
   matrix b = matrix::Identity(2, 2);
   // ベクトルvを定義します(要素が1と2のベクトル)
   vector v = {1, 2};

   // 行列aと行列bのクロネッカー積を計算し、その結果をエキスパートログに出力します。
   // a.Kron(b)は、行列aの各要素と行列b全体を掛け合わせた結果の行列を生成します。
   Print("行列aと行列bのクロネッカー積の結果:");
   Print(a.Kron(b));
   // 結果:
   // [[1,0,2,0,3,0]
   //  [0,1,0,2,0,3]
   //  [4,0,5,0,6,0]
   //  [0,4,0,5,0,6]]

   // 行列aとベクトルvのクロネッカー積を計算し、その結果をエキスパートログに出力します。
   // a.Kron(v)は、行列aの各要素とベクトルvの各要素を掛け合わせた結果の行列を生成します。
   Print("行列aとベクトルvのクロネッカー積の結果:");
   Print(a.Kron(v));
   // 結果:
   // [[1,2,2,4,3,6]
   //  [4,8,5,10,6,12]]
   
   // クロネッカー積の計算が完了しました。
}

サンプルコード解説

このコードは、MQL5行列ベクトルクロネッカー積を計算し、その結果をエキスパートログに出力するスクリプトです。


1. スクリプトのエントリーポイント: OnStart関数

コードはOnStart関数から始まります。この関数は、スクリプトが実行されると最初に呼び出される特別な関数です。

スクリプト全体の目的は、以下を行うことです。


2. 行列a、行列b、ベクトルvの定義

コードの冒頭で、次の変数が定義されています。

(1) 行列aの定義

matrix型の変数a は、2行3列の行列として定義されています。

  • 1行目の要素は [1, 2, 3]。
  • 2行目の要素は [4, 5, 6]。
    このように、2次元のデータを扱う行列を定義できます。

(2) 行列bの定義

matrix型の変数b は、Identity関数を使って定義されています。
Identity関数は、指定したサイズ(ここでは2×2)の単位行列を作成する関数です。単位行列とは、対角線上の要素がすべて1で、それ以外の要素がすべて0の行列のことです。
この場合、行列b は次のようになります。 [1 0] [0 1]

(3) ベクトルvの定義

vector型の変数v は、要素数が2のベクトルとして定義されています。
要素は [1, 2] です。


3. 行列aと行列bのクロネッカー積の計算

コード内の次の部分で、Kron関数を使って行列a と行列b のクロネッカー積を計算しています。

a.Kron(b) の処理

この場合、a.Kron(b) は次のようなクロネッカー積を計算します。

  1. 行列a の各要素に、行列b を掛け合わせます。
  2. それぞれの結果を並べて、新しい行列を作ります。

計算結果は次のようになります。

[[1,0,2,0,3,0], [0,1,0,2,0,3], [4,0,5,0,6,0], [0,4,0,5,0,6]]

Print関数の役割

Print関数は、計算結果をエキスパートログに出力します。このログは、MQL5のターミナル内で確認できます。


4. 行列aとベクトルvのクロネッカー積の計算

次の部分で、Kron関数を使って行列a とベクトルv のクロネッカー積を計算しています。

a.Kron(v) の処理

この場合、a.Kron(v) は次のようなクロネッカー積を計算します。

  1. 行列a の各要素に、ベクトルv の各要素を掛け合わせます。
  2. 各計算結果を並べて、新しい行列を作ります。

計算結果は次のようになります。

[[1,2,2,4,3,6], [4,8,5,10,6,12]]


5. まとめ


クロネッカー積の活用例

クロネッカー積は、以下のような場面で利用できます。

  1. 信号処理での行列の拡張。
  2. シミュレーションや物理計算におけるデータの構造化。
  3. 金融計算におけるデータ変換。

このスクリプトは、これらの応用のための基本的な操作を理解するのに役立ちます。

タイトルとURLをコピーしました