【MQL5】MatMul関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. MatMul関数の働き・役割
    1. 補足:スカラー積(内積)とは
      1. ベクトルとは
      2. 成分とは
      3. スカラー積の計算式
  2. MatMul関数の引数について
    1. 行列同士を乗算する場合
    2. ベクトルと行列を乗算する場合
    3. 行列とベクトルを乗算する場合
    4. ベクトル同士のスカラー積(内積)を計算する場合
  3. MatMul関数の戻り値について
    1. 行列同士を乗算した場合
    2. ベクトルと行列を乗算した場合
    3. 行列とベクトルを乗算した場合
    4. ベクトル同士のスカラー積(内積)を計算した場合
  4. 行列同士を乗算する場合のサンプルコード
    1. サンプルコードの解説
      1. 1. 行列 a と b の作成
      2. 2. MatMul メソッドを使った行列の乗算
      3. 3. a と b の掛け算の計算過程
      4. 4. b と a の掛け算の計算
      5. 5. 結果を出力
  5. ベクトルと行列を乗算した場合のサンプルコード
    1. サンプルコードの解説
      1. 1. 行列 m35 の作成と初期化
      2. 2. ベクトル v3 の作成
      3. 3. ベクトルと行列の掛け算
      4. 4. 結果の出力
  6. 行列とベクトルを乗算した場合のサンプルコード
    1. サンプルコードの解説
      1. 1. 行列 m35 の作成と初期化
      2. 2. 垂直ベクトル v5 の作成
      3. 3. 行列とベクトルの掛け算
      4. 4. 結果の出力
      5. 5. Arange 関数の説明
  7. ベクトル同士のスカラー積(内積)を計算する場合のサンプルコード
    1. コードの解説
      1. 1. 水平ベクトルと垂直ベクトルの作成
      2. 2. ベクトルの内容を出力
      3. 3. MatMul メソッドを使用したスカラー積の計算
      4. 4. Dot メソッドを使用したスカラー積の計算
      5. 5. 結果の出力

MatMul関数の働き・役割

MatMul関数は、行列ベクトルの乗算を効率的に行うためのMQL5で提供されるメソッドです。

メソッドとは、特定のオブジェクト(データや機能をまとめたもの)に関連付けられた関数のことです。一般的な関数が独立して使用されるのに対して、メソッドは特定のオブジェクトに対して操作を行います。例えば、MatMul関数行列ベクトルといったオブジェクトに結びつけられ、それらのデータに対して行列ベクトルの乗算を行う役割を持つメソッドです。使い方の詳細はサンプルコードをご覧ください。

この関数を使うことで、以下のようなさまざまな数学的な計算を簡潔に実装できます。

  1. 行列行列の乗算
    例えば、2つの行列を掛け合わせて新しい行列を作る場合に使用します。
  2. ベクトル行列の乗算
    水平方向のベクトル行列、または垂直方向のベクトル行列を掛けて、ベクトルの結果を得る場合に使います。
  3. スカラー積(内積)の計算
    水平方向と垂直方向のベクトルを掛けて、1つのスカラー値(単なる数値)を計算する場合に利用します。

例えば、物理や統計の分野では、行列ベクトルの計算がよく必要になります。MatMul関数を活用すると、手計算では複雑なこれらの操作をプログラムで実現できます。

行列ベクトルの乗算では、次のルールに従います。

  • 行列行列を掛ける場合、最初の行列の列数と2番目の行列の行数が一致している必要があります。
  • ベクトル行列と掛ける場合、ベクトルの長さは行列の列数または行数と一致している必要があります。
  • 行列の乗算の順序を変えると結果が異なる場合があるため、注意が必要です。

MatMul関数を使えば、これらのルールを守りながら、必要な計算をスムーズに行うことができます。

補足:スカラー積(内積)とは

スカラー積(内積)は、2つのベクトルを使って1つの数値(スカラー)を計算する方法です。この計算は、ベクトルの「向き」と「大きさ」に関連しています。

ベクトルとは

ベクトルとは、複数の数字をまとめた「矢印のようなもの」で、大きさと向きを持っています。例えば、[1, 2, 3] というベクトルは、「x方向に1、y方向に2、z方向に3動く」という情報を表しています。

成分とは

ここでいう成分とは、ベクトルを構成する個々の数字のことを指します。たとえば、[1, 2, 3]成分1、2、3 です。

スカラー積の計算式

スカラー積は、以下のように計算します。

a ・ b = (a₁ * b₁) + (a₂ * b₂) + (a₃ * b₃) + …

ここで、

例えば、以下の2つのベクトルがあるとします。

この2つのベクトルスカラー積を計算します。

  1. まず、それぞれの成分を掛け合わせます。
    a₁ * b₁ = 1 * 4 = 4
    a₂ * b₂ = 2 * 5 = 10
    a₃ * b₃ = 3 * 6 = 18
  2. 次に、掛けた結果を全て足します。
    4 + 10 + 18 = 32

したがって、a ・ b = 32 となります。

スカラー積は、ベクトル同士の「重なり具合」を表す値とも言えます。この値が大きいほど、2つのベクトルが似た方向を向いていることを意味します。一方で、値が小さい(または0)の場合は、ベクトルが互いに直角に近いことを示します。

スカラー積を理解しておくと、物理の力の計算やデータ解析で役立ちます。

MatMul関数の引数について

MatMul関数引数は、どの形式で使用するかによって異なります。ここでは、主な形式ごとに引数を説明します。

行列同士を乗算する場合

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

行列同士を掛ける場合、引数には掛ける対象となる2番目の行列を指定します。
この引数は、計算対象となる「行列データ」を提供します。掛けられる行列の列数と、指定する行列の行数が一致している必要があります。

ベクトルと行列を乗算する場合

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

ベクトル行列を掛ける場合、引数には行列を指定します。このとき、ベクトルの長さが行列の列数と一致している必要があります。

行列とベクトルを乗算する場合

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

行列ベクトルを掛ける場合、引数にはベクトルを指定します。このとき、行列の列数とベクトルの長さが一致している必要があります。

ベクトル同士のスカラー積(内積)を計算する場合

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

スカラー積を計算する場合、引数には2番目のベクトルを指定します。2つのベクトルは同じ長さである必要があります。

いずれの形式においても、引数は計算対象となる行列またはベクトルのデータを提供する役割を果たします。このデータを基に、MatMul関数は乗算の結果を計算します。

MatMul関数の戻り値について

MatMul関数戻り値は、使用する形式に応じて異なります。ここでは、それぞれの形式で得られる戻り値を説明します。

行列同士を乗算した場合

行列行列を乗算した場合の戻り値は、新しく生成された行列です。この行列の行数は最初の行列の行数と一致し、列数は2番目の行列の列数と一致します。これにより、行列の積として得られる結果が戻り値となります。

ベクトルと行列を乗算した場合

ベクトル行列を掛けた場合、戻り値は計算結果のベクトルとなります。例えば、水平方向のベクトル行列を掛けると、水平方向のベクトル戻り値になります。同様に、垂直方向のベクトル行列を掛けると、垂直方向のベクトルが返されます。

行列とベクトルを乗算した場合

行列ベクトルを掛けた場合、戻り値は計算結果のベクトルです。このベクトルの長さは、最初の行列の行数と一致します。

ベクトル同士のスカラー積(内積)を計算した場合

ベクトル同士のスカラー積を計算した場合、戻り値は1つのスカラー値(単なる数値)となります。この値は、ベクトル同士の「重なり具合」を示す値として利用できます。

どの形式でも、MatMul関数戻り値は、計算された乗算の結果に対応しています。戻り値の型(行列ベクトル、またはスカラー)は、操作の種類によって自動的に決まります。これにより、関数を柔軟に使用できます。

行列同士を乗算する場合のサンプルコード

以下は、行列同士を乗算する場合のサンプルコードです。このコードでは、2つの行列を定義して MatMul メソッドを使用し、乗算結果を取得します。

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                       |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- 行列 a を定義(2x3の単位行列の一部を模した行列)
   //    この行列は2行3列で、以下の値を持ちます:
   //    1行目: [1, 0, 0]
   //    2行目: [0, 1, 0]
   matrix a = {
      {1, 0, 0},
      {0, 1, 0}
   };

   //--- 行列 b を定義(3x2の任意の値を持つ行列)
   //    この行列は3行2列で、以下の値を持ちます:
   //    1行目: [4, 1]
   //    2行目: [2, 2]
   //    3行目: [1, 3]
   matrix b = {
      {4, 1},
      {2, 2},
      {1, 3}
   };

   //--- 行列 a と b の乗算を行い、新しい行列 c1 に結果を格納
   //    ここで、a の行数と b の列数が結果行列 c1 のサイズを決定します。
   //    c1 のサイズは a の行数 (2) と b の列数 (2) になります。
   matrix c1 = a.MatMul(b);

   //--- 行列 b と a の順序を逆にして乗算を行い、新しい行列 c2 に結果を格納
   //    この場合、b の行数 (3) と a の列数 (3) が結果行列 c2 のサイズを決定します。
   //    c2 のサイズは b の行数 (3) と a の列数 (3) になります。
   matrix c2 = b.MatMul(a);

   //--- 乗算結果をエキスパートログに出力(結果行列 c1 と c2 を表示)
   //    c1 の結果: [[4,1], [2,2]]
   //    c2 の結果: [[4,1,0], [2,2,0], [1,3,0]]
   Print("c1 = \n", c1);
   Print("c2 = \n", c2);
}
//+------------------------------------------------------------------+

サンプルコードの解説

このコードでは、matrix 型を使った行列の乗算を例に、MatMul メソッドの使い方を説明しています。


1. 行列 a と b の作成

まず、2つの行列を作成しています。

  • matrix a は、以下のような2行3列の行列です。
 1 0 0 0 1 0

  • 行列a の役割は、別の行列の特定の値をそのまま通したり、一部を無効化するような形で使われます。
  • matrix b は、以下のような3行2列の行列です。

 4 1 2 2 1 3

  • この行列は任意の値で構成されています。

2. MatMul メソッドを使った行列の乗算

次に、a と b を掛け算しています。ここで重要なのは、行列掛け算には以下のルールがあることです。

  • 1つ目の行列の「列数」と2つ目の行列の「行数」が同じでなければならない。
  • 結果の行列の「行数」は1つ目の行列の「行数」、結果の「列数」は2つ目の行列の「列数」になります。

この場合、a は2行3列、b は3行2列なので、掛け算が可能です。結果の行列c1 のサイズは「2行2列」になります。


3. a と b の掛け算の計算過程

行列掛け算では、1つ目の行列の「行」と2つ目の行列の「列」をスカラー積で計算します。

結果の行列c1 の各要素を計算してみましょう。

  • 1行1列目: (1×4) + (0×2) + (0×1) = 4
  • 1行2列目: (1×1) + (0×2) + (0×3) = 1
  • 2行1列目: (0×4) + (1×2) + (0×1) = 2
  • 2行2列目: (0×1) + (1×2) + (0×3) = 2

結果として、以下の行列c1 が得られます。

4  1
2  2

4. b と a の掛け算の計算

次に、順序を逆にして行列掛け算を行います。この場合、行列b は3行2列、行列a は2行3列なので、掛け算が可能です。結果の行列 c2 のサイズは「3行3列」になります。

計算過程を見てみましょう。

  • 1行1列目: (4×1) + (1×0) + (0×0) = 4
  • 1行2列目: (4×0) + (1×1) + (0×0) = 1
  • 1行3列目: (4×0) + (1×0) + (0×0) = 0
  • 2行1列目: (2×1) + (2×0) + (0×0) = 2
  • 2行2列目: (2×0) + (2×1) + (0×0) = 2
  • 2行3列目: (2×0) + (2×0) + (0×0) = 0
  • 3行1列目: (1×1) + (3×0) + (0×0) = 1
  • 3行2列目: (1×0) + (3×1) + (0×0) = 3
  • 3行3列目: (1×0) + (3×0) + (0×0) = 0

結果として、以下の行列c2 が得られます。

4  1  0
2  2  0
1  3  0

5. 結果を出力

最後に、Print関数を使って、行列c1 と c2 の内容をエキスパートログに出力します。


ベクトルと行列を乗算した場合のサンプルコード

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- 3行5列の行列を作成
   // matrix型の変数m35を宣言
   matrix m35;

   // 行列m35を初期化。サイズは3行5列で、値は関数Arangeによって埋められる
   // Arange関数は、行列を増加する値で埋める関数
   m35.Init(3, 5, Arange);

   //--- 水平ベクトルv3を作成
   // vector型の変数v3を宣言し、初期値として{1, 2, 3}を設定
   // これは3つの要素を持つ水平ベクトル(1行のベクトル)を表している
   vector v3 = {1, 2, 3};

   //--- 計算の概要をエキスパートログに出力
   // 水平ベクトルv3と行列m35の掛け算を説明する文を出力
   Print("Product of horizontal vector v and matrix m[3,5]");

   // 左側にあるベクトルv3の内容をエキスパートログに出力
   Print("On the left, vector v3 = ", v3);

   // 右側にある行列m35の内容をエキスパートログに出力
   Print("On the right, matrix m35 = \n", m35);

   //--- ベクトルv3と行列m35の掛け算を実行
   // MatMulメソッドを使用して、ベクトルv3を行列m35に掛け算
   // 結果は、5つの要素を持つ新しい水平ベクトルになる
   Print("v3.MatMul(m35) = horizontal vector v[5] \n", v3.MatMul(m35));

   /* 結果
      以下のような出力がエキスパートログに表示される:
      
      Product of horizontal vector v3 and matrix m[3,5]
      On the left, vector v3 = [1,2,3]
      On the right, matrix m35 =
      [[0,1,2,3,4]
       [5,6,7,8,9]
       [10,11,12,13,14]]
      v3.MatMul(m35) = horizontal vector v[5]
      [40,46,52,58,64]
      
      ベクトルv3が行列m35に掛けられ、結果として5要素のベクトル[40,46,52,58,64]が得られる。
   */
}

//+------------------------------------------------------------------+
//|  増加する値で行列を埋める                                              |
//+------------------------------------------------------------------+
void Arange(matrix & m, double start = 0, double step = 1)
{
   //--- 行列の列数を取得し、cols変数に格納
   ulong cols = m.Cols();

   //--- 行列の行数を取得し、rows変数に格納
   ulong rows = m.Rows();

   //--- 値の初期値を設定。start引数のデフォルト値は0
   double value = start;

   //--- 行列を埋めるための2重ループ
   for(ulong r = 0; r < rows; r++) // 行を順番に処理
   {
      for(ulong c = 0; c < cols; c++) // 各行の列を順番に処理
      {
         // 行列の指定位置に値を設定
         m[r][c] = value;

         // step分だけ値を増加
         value += step;
      }
   }
   //--- これにより、行列mは指定された増加量で値が埋められる
}

サンプルコードの解説

このサンプルコードでは、ベクトル行列掛け算を行い、結果を新しいベクトルとして得る方法を示しています。コードは、水平方向のベクトルと3行5列の行列掛け算する例です。


1. 行列 m35 の作成と初期化

最初に、matrix型の変数 m35 を宣言しています。これは3行5列の行列を表しています。次に、Init メソッドを使って、行列m35 を初期化します。このとき、Arange関数を指定して、行列に値を埋め込んでいます。

Arange関数は、行列の各要素に増加する値を順番に割り当てます。たとえば、以下のように値が設定されます。

  • 行列のサイズは3行5列です。
  • start の初期値は0、step は1(デフォルト値)なので、値が1ずつ増加します。
  • 行番号を r、列番号を c とすると、次のように値が設定されます。
r=0, c=0 のとき、m[0][0] = 0
r=0, c=1 のとき、m[0][1] = 1
r=0, c=2 のとき、m[0][2] = 2
r=0, c=3 のとき、m[0][3] = 3
r=0, c=4 のとき、m[0][4] = 4
r=1, c=0 のとき、m[1][0] = 5
r=1, c=1 のとき、m[1][1] = 6
r=1, c=2 のとき、m[1][2] = 7
r=1, c=3 のとき、m[1][3] = 8
r=1, c=4 のとき、m[1][4] = 9
r=2, c=0 のとき、m[2][0] = 10
r=2, c=1 のとき、m[2][1] = 11
r=2, c=2 のとき、m[2][2] = 12
r=2, c=3 のとき、m[2][3] = 13
r=2, c=4 のとき、m[2][4] = 14

結果、行列m35 は以下のようになります。

[[0,  1,  2,  3,  4 ],
 [5,  6,  7,  8,  9 ],
 [10, 11, 12, 13, 14]]

2. ベクトル v3 の作成

次に、vector型の変数v3 を宣言しています。このベクトルは、水平ベクトル(1行のデータ)を表しており、以下の値が設定されています。

v3 = [1, 2, 3]

ベクトルv3 には3つの成分があり、それぞれが行列の対応する行と掛け算されます。


3. ベクトルと行列の掛け算

MatMul メソッドを使って、ベクトルv3 と行列 m35 を掛け算します。この掛け算では、以下のように計算されます。

具体的な計算を以下に示します。

  1. 結果の1列目: (1×0) + (2×5) + (3×10) = 0 + 10 + 30 = 40
  2. 結果の2列目: (1×1) + (2×6) + (3×11) = 1 + 12 + 33 = 46
  3. 結果の3列目: (1×2) + (2×7) + (3×12) = 2 + 14 + 36 = 52
  4. 結果の4列目: (1×3) + (2×8) + (3×13) = 3 + 16 + 39 = 58
  5. 結果の5列目: (1×4) + (2×9) + (3×14) = 4 + 18 + 42 = 64

結果として、新しい水平ベクトルが得られます。

[40, 46, 52, 58, 64]

4. 結果の出力

最後に、Print関数を使って以下の内容をエキスパートログに出力します。

行列とベクトルを乗算した場合のサンプルコード

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- 行列 m35 を作成
   // matrix 型の変数 m35 を宣言します。この変数は3行5列の行列を表します。
   matrix m35;

   // Init メソッドを使用して、行列 m35 を初期化します。
   // サイズは3行5列で、Arange 関数を使用して値を埋めます。
   m35.Init(3, 5, Arange);

   //--- 垂直ベクトル v5 を作成
   // vector 型の変数 v5 を宣言し、初期値として {1, 2, 3, 4, 5} を設定します。
   // これは5つの要素を持つ垂直方向のベクトルを表します。
   vector v5 = {1, 2, 3, 4, 5};

   //--- 行列 m35 とベクトル v5 の乗算についてエキスパートログに出力
   // 計算の説明をエキスパートログに出力します。
   Print("Product of matrix m[3,5] and vertical vector v[5]");

   // 行列 m35 の内容をエキスパートログに出力します。
   Print("On the left, m35 = \n", m35);

   // 垂直ベクトル v5 の内容をエキスパートログに出力します。
   Print("On the right v5 = ", v5);

   //--- 行列とベクトルの掛け算を実行
   // m35.MatMul(v5) を使用して、行列 m35 に垂直ベクトル v5 を掛けます。
   // 結果は新しい垂直ベクトルとなり、その内容をエキスパートログに出力します。
   Print("m35.MatMul(v5) = vertical vector v[3] \n", m35.MatMul(v5));

   /* 結果
      Product of matrix m[3,5] and vertical vector v[5]
      On the left, m35 =
      [[0,1,2,3,4]
       [5,6,7,8,9]
       [10,11,12,13,14]]
      On the right, v5 = [1,2,3,4,5]
      m35.MatMul(v5) = vertical vector v[3]
      [40,115,190]

      行列 m35 とベクトル v5 の掛け算によって、新しい垂直ベクトル [40, 115, 190] が得られる。
   */
}

//+------------------------------------------------------------------+
//| 行列を増加する値で埋める関数                                           |
//+------------------------------------------------------------------+
void Arange(matrix & m, double start = 0, double step = 1)
{
   //--- 行列の列数を取得
   // 行列 m の列数を取得し、cols に格納します。
   ulong cols = m.Cols();

   //--- 行列の行数を取得
   // 行列 m の行数を取得し、rows に格納します。
   ulong rows = m.Rows();

   //--- 初期値を設定
   // 埋め込む値の初期値を start(デフォルトは0)に設定します。
   double value = start;

   //--- 行列を埋めるための二重ループ
   // 行を順番に処理する外側のループ
   for (ulong r = 0; r < rows; r++)
   {
      // 列を順番に処理する内側のループ
      for (ulong c = 0; c < cols; c++)
      {
         // 行列の各要素に値を設定
         m[r][c] = value;

         // 値を step(デフォルトは1)だけ増加
         value += step;
      }
   }
   //--- 結果として、行列 m は指定された増加量で埋められる。
}

サンプルコードの解説

このコードは、行列と垂直ベクトル(縦方向のデータ)を掛け算して新しいベクトルを得る例です。


1. 行列 m35 の作成と初期化

コードの冒頭では、matrix型の変数m35 を宣言しています。この変数は3行5列の行列を表しています。次に、Init メソッドを使って、行列m35 を初期化します。このとき、Arange関数を指定して、行列の中身を順番に値で埋めています。

Arange関数は、行列の各要素に増加する値を割り当てる役割を果たします。具体的にどうやって埋めているのかは、後述します。

この行列m35 は、以下のようなデータを持つように初期化されます。

[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14]]

2. 垂直ベクトル v5 の作成

次に、vector型の変数v5 を宣言し、初期値として {1, 2, 3, 4, 5} を設定しています。このベクトルは5つの成分を持つ垂直方向のデータです。このようなベクトルは、行列の「列」と掛け算するために使用されます。


3. 行列とベクトルの掛け算

ここで、MatMul メソッドを使用して、行列m35 とベクトルv5 を掛け算しています。この掛け算では、行列の各行とベクトルv5 のスカラー積を計算し、新しい垂直ベクトルを作成します。

計算の仕組みを具体的に説明します。

  1. 行列m35 の1行目 [0, 1, 2, 3, 4] とベクトルv5 を掛け算します。
    • 計算式: (0×1) + (1×2) + (2×3) + (3×4) + (4×5)
    • 結果: 0 + 2 + 6 + 12 + 20 = 40
  2. 行列m35 の2行目 [5, 6, 7, 8, 9] とベクトルv5 を掛け算します。
    • 計算式: (5×1) + (6×2) + (7×3) + (8×4) + (9×5)
    • 結果: 5 + 12 + 21 + 32 + 45 = 115
  3. 行列m35 の3行目 [10, 11, 12, 13, 14] とベクトルv5 を掛け算します。
    • 計算式: (10×1) + (11×2) + (12×3) + (13×4) + (14×5)
    • 結果: 10 + 22 + 36 + 52 + 70 = 190

これらをまとめると、計算結果は新しい垂直ベクトル[40, 115, 190] となります。


4. 結果の出力

計算結果は、Print関数を使用してエキスパートログに出力されます。出力される内容は以下の通りです。


5. Arange 関数の説明

Arange関数は、行列を初期化するために使用されます。この関数引数は以下の通りです。

  • matrix &m
    初期化対象の行列参照渡しで受け取ります。この引数によって、実際の行列データが操作されます。
  • double start = 0
    初期値を指定します。デフォルト値は0です。
  • double step = 1
    増加量を指定します。デフォルト値は1です。

この関数は二重ループを使って行列の各要素を順番に値で埋めます。具体的には次のような処理を行います。

  1. 行のループ(外側)で、行番号 r を順に進めます。
  2. 列のループ(内側)で、列番号 c を順に進めます。
  3. 行番号 r と列番号 c の位置に、現在の値を設定します。
  4. 設定後、値を step 分だけ増加させます。

たとえば、3行5列の行列に start=0、step=1 を指定した場合、以下のように埋められます。

r=0, c=0 のとき m[0][0] = 0
r=0, c=1 のとき m[0][1] = 1
r=0, c=2 のとき m[0][2] = 2
...
r=2, c=3 のとき m[2][3] = 13
r=2, c=4 のとき m[2][4] = 14

結果として、行列m35 が以下のようになります。

[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14]]

ベクトル同士のスカラー積(内積)を計算する場合のサンプルコード

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- 水平ベクトル a を作成
   // vector 型の変数 a を宣言し、初期値として {1, 2, 3} を設定します。
   // このベクトルは、水平方向(横向き)のベクトルを表しています。
   vector a = {1, 2, 3};

   //--- 垂直ベクトル b を作成
   // vector 型の変数 b を宣言し、初期値として {4, 5, 6} を設定します。
   // このベクトルは、垂直方向(縦向き)のベクトルを表しています。
   vector b = {4, 5, 6};

   //--- ベクトル a の内容をエキスパートログに出力
   // Print 関数を使用して、水平ベクトル a の内容を出力します。
   Print("a = ", a);

   //--- ベクトル b の内容をエキスパートログに出力
   // Print 関数を使用して、垂直ベクトル b の内容を出力します。
   Print("b = ", b);

   //--- スカラー積(内積)を計算して出力
   // MatMul メソッドを使用して、ベクトル a と b のスカラー積を計算します。
   // 計算結果をエキスパートログに出力します。
   // スカラー積の計算では、対応する成分を掛け合わせて合計します。
   Print("1) a.MatMul(b) = ", a.MatMul(b));

   //--- Dot メソッドを使って同じ計算を確認
   // Dot メソッドは、スカラー積を計算する別の方法です。
   // MatMul メソッドと同じ結果を生成することを確認するために使用します。
   Print("2) a.Dot(b) = ", a.Dot(b));

   /* 結果
      a = [1,2,3]
      b = [4,5,6]
      1) a.MatMul(b) = 32.0
      2) a.Dot(b) = 32.0

      ベクトル a と b のスカラー積は 32.0 です。
      これは、以下の計算によって得られます:
      (1×4) + (2×5) + (3×6) = 4 + 10 + 18 = 32
      MatMul メソッドと Dot メソッドは同じ結果を返します。
   */
}

コードの解説

このコードは、2つのベクトルを使ってスカラー積(内積)を計算し、その結果を出力する例です。


1. 水平ベクトルと垂直ベクトルの作成

最初に、ベクトルを表す vector型の変数を2つ作成しています。

これらのベクトルは、それぞれ3つの成分を持っています。スカラー積を計算するためには、2つのベクトルが同じ長さを持つ必要があります。


2. ベクトルの内容を出力

Print関数を使用して、変数a と変数b の内容をエキスパートログに出力しています。

  • 最初に、水平ベクトルa の内容を出力します。この出力によって、計算に使用されるデータが正しいことを確認できます。
  • 次に、垂直ベクトルb の内容を出力します。

これにより、コードの実行前にどのようなデータが使われるかを把握できます。


3. MatMul メソッドを使用したスカラー積の計算

MatMul メソッドを使って、水平ベクトルa と垂直ベクトルb のスカラー積を計算します。スカラー積は、次のように計算されます。

  1. ベクトルa の1番目の成分(1)とベクトルb の1番目の成分(4)を掛けます。結果は4です。
  2. ベクトルa の2番目の成分(2)とベクトルb の2番目の成分(5)を掛けます。結果は10です。
  3. ベクトルa の3番目の成分(3)とベクトルb の3番目の成分(6)を掛けます。結果は18です。
  4. これらの値を合計します。計算式は、4 + 10 + 18 となり、結果は32です。

この結果がMatMul メソッド戻り値として得られます。


4. Dot メソッドを使用したスカラー積の計算

次に、Dot メソッドを使って同じスカラー積を計算します。Dotメソッドは、MatMulメソッドと同様にスカラー積を計算しますが、主にベクトル専用のスカラー積計算として提供されています。

このコードでは、MatMul メソッドの結果と Dot メソッドの結果を比較して、両方が同じ計算結果を返すことを確認しています。


5. 結果の出力

Print関数を使用して、MatMul メソッドと Dot メソッドで計算されたスカラー積をそれぞれエキスパートログに出力します。

出力結果は次のようになります。

1) a.MatMul(b) = 32.0
2) a.Dot(b) = 32.0

これにより、水平ベクトルa と垂直ベクトルb のスカラー積が32であることが確認できます。

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