Convolve

2つのベクトルの離散線形畳み込みを返します

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

パラメータ

v

[out] 2番目のベクトル

mode

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

戻り値

2つのベクトルの離散線形畳み込み。

次は、MQL5で2つのベクトルの畳み込みを計算するための単純なアルゴリズムです。

vector VectorConvolutionFull(const vector& a,const vector& b)
 {
  if(a.Size()<b.Size())
    return(VectorConvolutionFull(b,a));
 
  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[i]*a[i_-i];
 
  return(c);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
vector VectorConvolutionSame(const vector& a,const vector& b)
 {
  if(a.Size()<b.Size())
    return(VectorConvolutionSame(b,a));
 
  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[i]*a[i_-i];
       }
    }
 
  return(c);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
vector VectorConvolutionValid(const vector& a,const vector& b)
 {
  if(a.Size()<b.Size())
    return(VectorConvolutionValid(b,a));
 
  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[i]*a[i_-i];
       }
    }
 
  return(c);
 }

 

MQL5の例

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

 

Pythonの例

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