Correlate

计算两个向量的互相关。

vector vector::Correlate(

  const vector&          v,        // 向量

  ENUM_VECTOR_CONVOLVE   mode      // 模式

   );

参数

v

[输入]  第二个向量。

mode

[输入]  “mode” 参数判定线性卷积计算模式。 数值来自 ENUM_VECTOR_CONVOLVE 枚举。

返回值

两个向量的互相关。

注意

“mode” 参数判定线性卷积计算模式。

以 MQL5 实现的计算两个向量相关系数的简单算法:

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]