矩阵和向量的类型

向量是实数或复数类型的一维数组,而矩阵是实数或复数类型的二维数组。因此,这些对象元素的有效数值类型列表包括 double(视为默认类型)、floatcomplex

从线性代数的角度(不是从编译器的角度!),一个素数也是一个最小向量,而反过来,一个向量可被视为一种特殊情况的矩阵。

根据元素类型,可使用任一 vector(带或不带后缀)关键字描述向量:

  • vector 是一个具有如下类型元素的向量: double
  • vectorf 是一个具有如下类型元素的向量: float
  • vectorc 是一个具有如下类型元素的向量: complex

虽然向量可以分为垂直和水平向量,但是 MQL5 不作此区分。要求的向量朝向由向量在表达式中的位置确定(暗示)。

对向量定义了以下运算:加法和乘法,以及范数(使用相关 norm 方法),范数运算可获取向量长度或模。

你可以将矩阵视为数组,其中第一个索引是行号,第二个索引是列号。然而,行和列的编号方式不同于线性代数,而是像数组一样从零开始。

矩阵

矩阵的两个维度也称为轴,按如下方式编号:0 为横轴(沿行),而 1 为纵轴(沿列)。很多矩阵函数中都会使用轴编号。尤其是当我们谈到将矩阵拆分时,横拆分表示在行之间切割,纵拆分表示在列之间切割。

根据元素类型,可使用任一 matrix(带或不带后缀)关键字描述描述矩阵:

  • matrix 是一个具有以下类型元素的矩阵: double
  • matrixf 是一个具有以下类型元素的矩阵: float
  • matrixc 是一个具有以下类型元素的矩阵: complex

对于模板函数中的应用,可以使用 matrix<double> , matrix<float> , matrix<complex> , vector<double> , vector<float> , vector<complex> 标记法代替对应类型。

vectorf v_f1 = {0123,};
vector<floatv_f2 = v_f1;
matrix m = {{01}, {23}};
 
void OnStart()
{
   Print(v_f2);
   Print(m);
}

当被记录到日志时,矩阵和向量以逗号分隔的数字序列形式输出,并用方括号括起。

[0,1,2,3]
[[0,1]
 [2,3]]

为矩阵定义了以下代数运算:

  • 相同大小矩阵的加法
  • 适配大小矩阵的乘法,即第一矩阵中的列数必须等于第二矩阵中的行数。
  • 根据矩阵乘法规则,矩阵与列向量相乘、行向量与矩阵相乘(向量可视为特殊矩阵)
  • 矩阵乘以数字

此外,matrixvector 类型内置了与 NumPy 库( Python中流行的机器学习库)类似的方法,因此你可以在文档和库示例中获得更多提示。完整方法列表参见 MQL5 帮助的对应章节。

遗憾的是,MQL5 未提供从一种类型的矩阵和向量到另一种类型的强制转换(例如,从 doublefloat)。此外,在需要矩阵的表达式中,编译器不会自动将向量视为矩阵(一列或一行的矩阵)。这意味着尽管在这些结构之间存在明显关系,但是矩阵和向量之间不存在继承概念(OOP 的特性)。