Correlate

2つのベクトルの相互相関を計算します。

vector vector::Correlate(
  const vector&          v,        // ベクトル
  ENUM_VECTOR_CONVOLVE  mode      // モード
  );

パラメータ

v

[in] 2番目のベクトル

mode

[in] modeパラメータは、線形畳み込み計算モードを決定します。ENUM_VECTOR_CONVOLVE列挙体からの値。

戻り値

2つのベクトルの相互相関

注意事項

modeパラメータは、線形畳み込み計算モードを決定します。

次は、MQL5を使用して2つのベクトルの相関係数を計算するための単純なアルゴリズムです。

vector VectorCrossCorrelationFull(const vector& a,const vector& b)
 {
  int   m=(int)a.Size();
  int   n=(int)b.Size();
  int   size=m+n-1;
  vector c=vector::Zeros(size);
 
  for(int i=0; i<n; i++)
    for(int i_=i; i_<i+m; i_++)
        c[i_]+=b[n-i-1]*a[i_-i];
 
  return(c);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
vector VectorCrossCorrelationSame(const vector& a,const vector& b)
 {
  int   m=(int)a.Size();
  int   n=(int)b.Size();
  int   size=MathMax(m,n);
  vector c=vector::Zeros(size);
 
  for(int i=0; i<n; i++)
    {
    for(int i_=i; i_<i+m; i_++)
       {
        int k=i_-size/2+1;
        if(k>=0 && k<size)
          c[k]+=b[n-i-1]*a[i_-i];
       }
    }
 
  return(c);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
vector VectorCrossCorrelationValid(const vector& a,const vector& b)
 {
  int   m=(int)a.Size();
  int   n=(int)b.Size();
  int   size=MathMax(m,n)-MathMin(m,n)+1;
  vector c=vector::Zeros(size);
 
  for(int i=0; i<n; i++)
    {
    for(int i_=i; i_<i+m; i_++)
       {
        int k=i_-n+1;
        if(k>=0 && k<size)
          c[k]+=b[n-i-1]*a[i_-i];
       }
    }
 
  return(c);
 }

 

MQL5の例

  vector a={1,2,3,4,5};
  vector b={0,1,0.5};
 
  Print("full\n",a.Correlate(b,VECTOR_CONVOLVE_FULL));
  Print("same\n",a.Correlate(b,VECTOR_CONVOLVE_SAME));
  Print("valid\n",a.Correlate(b,VECTOR_CONVOLVE_VALID));
  Print("full\n",b.Correlate(a,VECTOR_CONVOLVE_FULL));
 
 /*
  full
  [0.5,2,3.5,5,6.5,5,0]
  same
  [2,3.5,5,6.5,5]
  valid
  [3.5,5,6.5]
  full
  [0,5,6.5,5,3.5,2,0.5]
 */

 

Pythonの例

import numpy as np
a=[1,2,3,4,5]
b=[0,1,0.5]
 
print("full\n",np.correlate(a,b,'full'))
print("same\n",np.correlate(a,b,'same'));
print("valid\n",np.correlate(a,b,'valid'));
print("full\n",np.correlate(b,a,'full'))
 
full
[0.5 2. 3.5 5. 6.5 5. 0. ]
same
[2. 3.5 5. 6.5 5. ]
valid
[3.5 5. 6.5]
full
[0. 5. 6.5 5. 3.5 2. 0.5]