MQL5 中的矩阵和向量 您所在的位置:网站首页 mql5教程 MQL5 中的矩阵和向量

MQL5 中的矩阵和向量

2023-06-19 01:29| 来源: 网络整理| 查看: 265

向量(vector)是一个一维的双精度型(double)数组。 针对向量定义了以下运算:加法和乘法,以及获取向量长度或模(module)的范数(Norm)。 在程序化过程中,向量通常由同质元素的数组来表示,针对这些不能定义非规则向量运算,即数组不能相加或相乘,并且它们没有范数。

在数学中,向量可以表示为行向量,即由一行和 n 列组成的数组,以及字符串向量,即由一列和 n 行组成的矩阵。 在 MQL5 中,“vector(向量)”类型没有行和列子类型,因此程序员必须了解特定运算中所用的是哪种向量类型。

使用以下内置方法创建和初始化向量。

方法NumPy 类比说明void vector.Init( ulong size);创建指定长度的向量,其中的值未定义static vector vector::Ones(ulong size); ones创建指定长度的向量,用一填充static vector vector::Zeros(ulong size); zeros创建指定长度的向量,用零填充static vector vector::Full(ulong size,double value); full创建指定长度的向量,并用指定值填充operator =返回向量的副本void vector.Resize(const vector v);往结尾添加新值来调整向量大小 

矢量创建示例:

void OnStart() { //--- vector initialization examples   vector v;   v.Init(7);   Print("v = ", v);   vector v1=vector::Ones(5);   Print("v1 = ", v1);   vector v2=vector::Zeros(3);   Print("v2 = ", v2);   vector v3=vector::Full(6, 2.5);   Print("v3 = ", v3);   vector v4{1, 2, 3};   Print("v4 = ", v4);     v4.Resize(5);   Print("after Resize(5) v4 = ", v4);        vector v5=v4;   Print("v5 = ", v5);     v4.Fill(7);   Print("v4 = ", v4, "   v5 =",v5);       } /* Execution result v = [4,5,6,8,10,12,12] v1 = [1,1,1,1,1] v2 = [0,0,0] v3 = [2.5,2.5,2.5,2.5,2.5,2.5] v4 = [1,2,3] after Resize(5) v4 = [1,2,3,7,7] v5 = [1,2,3,7,7] v4 = [7,7,7,7,7]   v5 =[1,2,3,7,7] */

Init() 方法不仅可用于为向量分配内存,还可依据函数值来初始化向量元素。 在这种情况下,向量大小作为第一个参数传递给 Init,函数名作为第二个参数。 如果函数包含参数,则应在函数名后立即指定这些参数,并用逗号分隔。

函数本身必须包含向量的引用,且作为第一个参数传入。 在 Init 调用期间不应传递向量。 我们以 Arange 函数为例来查看方法的运算。 此函数模仿 numpy.arange。

void OnStart()   { //---    vector v;    v.Init(7,Arange,10,0,0.5); // 3 parameters are passed with Arange call    Print("v = ", v);    Print("v.size = ",v.Size());   } //+------------------------------------------------------------------+ //|  Values are generated within the half-open interval [start, stop)| //+------------------------------------------------------------------+ void Arange(vector& v, double stop, double start = 0, double step = 1) // the function has 4 parameters   {    if(start >= stop)      {       PrintFormat("%s wrong parameters! start=%G  stop=%G", __FILE__,start, stop);       return;      } //---    int size = (int)((stop - start) / step);    v.Resize(size);    double value = start;    for(ulong i = 0; i < v.Size(); i++)      {       v[i] = value;       value += step;      }   }    /* Execution result v = [0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8,8.5,9,9.5] v.size = 20 */

Arange 函数有两个可选参数,“start” 和 “stop”。 因此,Init(7,Arange,10) 的另一个可能调用和相关结果如下:

//+------------------------------------------------------------------+ //| Script program start function                                    | //+------------------------------------------------------------------+ void OnStart()   { //---    vector v;    v.Init(7,Arange,10);    Print("v = ", v);    Print("v.size = ",v.Size());   } ... /* v = [0,1,2,3,4,5,6,7,8,9] v.size = 10 */

向量运算

通常可以在向量上执行使用标量的加、减、乘、除运算。

//+------------------------------------------------------------------+ //|                                              vector2_article.mq5 | //|                                  Copyright 2021, MetaQuotes Ltd. | //|                                             https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link      "https://www.mql5.com" #property version   "1.00" //+------------------------------------------------------------------+ //| Script program start function                                    | //+------------------------------------------------------------------+ void OnStart() { //---   vector v= {1, 2, 3, 4, 5};   Print("Examples without saving vector changes");   Print("v = ", v);   Print("v+5 = ", v+5);   Print("v-Pi= ", v-M_PI);   Print("v*2.0= ", v*2);   Print("v/3.0= ", v/3.0);   Print("Save all vector changes");   Print("v = ", v);   Print("v+5 = ", v=v+5);   Print("v-Pi= ", v=v-M_PI);   Print("v*2.0= ", v= v*2);   Print("v/3.0= ", v= v/3.0); } /* Execution result    Examples without saving vector changes v = [1,2,3,4,5] v+5 = [6,7,8,9,10] v-Pi= [-2.141592653589793,-1.141592653589793,-0.1415926535897931,0.8584073464102069,1.858407346410207] v*2.0= [2,4,6,8,10] v/3.0= [0.3333333333333333,0.6666666666666666,1,1.333333333333333,1.666666666666667] Save all vector changes v = [1,2,3,4,5] v+5 = [6,7,8,9,10] v-Pi= [2.858407346410207,3.858407346410207,4.858407346410207,5.858407346410207,6.858407346410207] v*2.0= [5.716814692820414,7.716814692820414,9.716814692820414,11.71681469282041,13.71681469282041] v/3.0= [1.905604897606805,2.572271564273471,3.238938230940138,3.905604897606805,4.572271564273471] */ //+------------------------------------------------------------------+

向量支持两个大小相同向量的元素加法、减法、乘法和除法运算。

void OnStart()   { //---    vector a = {1, 2, 3};    vector b = {2, 4, 6};    Print("a + b = ", a + b);    Print("a - b = ", a - b);    Print("a * b = ", a * b);    Print("b / a = ", b / a);   } /* Execution result a + b = [3,6,9] a - b = [-1,-2,-3] a * b = [2,8,18] b / a = [2,2,2] */

为这些数据类型定义了四种运算。

void OnStart() { //---   vector a={1, 2, 3};   vector b={4, 5, 6};   Print("a = ", a);   Print("b = ", b);   Print("1) a.Dot(b) = ", a.Dot(b));   Print("2) a.MatMul(b) = ", a.MatMul(b));   Print("3) a.Kron(b) = ", a.Kron(b));   Print("4) a.Outer(b) = \n", a.Outer(b)); } /* Execution result a = [1,2,3] b = [4,5,6] 1) a.Dot(b) = 32.0 2) a.MatMul(b) = 32.0 3) a.Kron(b) = [[4,5,6,8,10,12,12,15,18]] 4) a.Outer(b) = [[4,5,6] [8,10,12] [12,15,18]] */

如您从示例中所见,Outer 方法返回一个矩阵,其中行数和列数对应于相乘向量的大小。 Dot 和 MatMul 的操作方式相同。

向量范数

向量和矩阵范数表示向量长度(量级)和绝对值。 计算向量范数的三种可能方法已罗列在 ENUM_VECTOR_NORM 枚举之中。

void OnStart() { //---   struct str_vector_norm    {     ENUM_VECTOR_NORM  norm;     int               value;    };   str_vector_norm vector_norm[]=    {      {VECTOR_NORM_INF,       0},      {VECTOR_NORM_MINUS_INF, 0},      {VECTOR_NORM_P,         0},      {VECTOR_NORM_P,         1},      {VECTOR_NORM_P,         2},      {VECTOR_NORM_P,         3},      {VECTOR_NORM_P,         4},      {VECTOR_NORM_P,         5},      {VECTOR_NORM_P,         6},      {VECTOR_NORM_P,         7},      {VECTOR_NORM_P,        -1},      {VECTOR_NORM_P,        -2},      {VECTOR_NORM_P,        -3},      {VECTOR_NORM_P,        -4},      {VECTOR_NORM_P,        -5},      {VECTOR_NORM_P,        -6},      {VECTOR_NORM_P,        -7}    };   vector v{1, 2, 3, 4, 5, 6, 7};   double norm;   Print("v = ", v); //---   for(int i=0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有