操作矩阵和向量

在处理矩阵和向量时,基础操作可无需任何计算。矩阵专属方法提供在列表开头,而最后四个方法也适用于向量。

  • Transpose:矩阵转置
  • Col, Row, Diag:按编号提取和设置行、列和对角线
  • TriL, TriU:按对角线编号获取上下三角矩阵
  • SwapCols, SwapRows:按编号指示重新排列行和列
  • Flat:按穿透索引设置及获取矩阵元素
  • Reshape:原位调整矩阵形状
  • Split, Hsplit, Vsplit:将矩阵拆分为若干子矩阵
  • resize:原位调整矩阵或向量的大小;
  • Compare, CompareByDigits:以给定实数精度比较两个矩阵或两个向量
  • Sort:原位排序(元素置换)以及通过获取向量或矩阵索引来排序
  • clip:原位限制元素值范围

请注意,未提供向量拆分。

下面是用于矩阵的原型方法。

matrix<T> matrix<T>::Transpose()

vector matrix<T>::Col∫Row(const ulong n)

void matrix<T>::Col∫Row(const vector v, const ulong n)

vector matrix<T>::Diag(const int n = 0)

void matrix<T>::Diag(const vector v, const int n = 0)

matrix<T> matrix<T>::TriL∫TriU(const int n = 0)

bool matrix<T>::SwapCols∫SwapRows(const ulong n1, const ulong n2)

T matrix<T>::Flat(const ulong i)

bool matrix<T>::Flat(const ulong i, const T value)

bool matrix<T>::Resize(const ulong rows, const ulong cols, const ulong reserve = 0)

void matrix<T>::Reshape(const ulong rows, const ulong cols)

ulong matrix<T>::Compare(const matrix<T> &m, const T epsilon)

ulong matrix<T>::CompareByDigits(const matrix &m, const int digits)

bool matrix<T>::Split(const ulong nparts, const int axis, matrix<T> &splitted[])

void matrix<T>::Split(const ulong &parts[], const int axis, matrix<T> &splitted[])

bool matrix<T>::Hsplit∫Vsplit(const ulong nparts, matrix<T> &splitted[])

void matrix<T>::Hsplit∫Vsplit(const ulong &parts[], matrix<T> &splitted[])

void matrix<T>::Sort(func_reference compare = NULL, T context)

void matrix<T>::Sort(const int axis, func_reference compare = NULL, T context)

matrix<T> matrix<T>::Sort(func_reference compare = NULL, T context)

matrix<T> matrix<T>::Sort(const int axis, func_reference compare = NULL, T context)

bool matrix<T>::Clip(const T min, const T max)

对于向量,有更小的方法集。

bool vector<T>::Resize(const ulong size, const ulong reserve = 0)

ulong vector<T>::Compare(const vector<T> &v, const T epsilon)

ulong vector<T>::CompareByDigits(const vector<T> &v, const int digits)

void vector<T>::Sort(func_reference compare = NULL, T context)

vector vector<T>::Sort(func_reference compare = NULL, T context)

bool vector<T>::Clip(const T min, const T max)

矩阵转置示例:

matrix a = {{012}, {345}};
Print("matrix a \n"a);
Print("a.Transpose() \n"a.Transpose());
/*
   matrix a
   [[0,1,2]
    [3,4,5]]
   a.Transpose()
   [[0,3]
    [1,4]
    [2,5]]
*/

使用 Diag 方法设置不同对角线的若干示例:

vector v1 = {123};
matrix m1;
m1.Diag(v1);
Print("m1\n"m1);
/* 
   m1
   [[1,0,0]
    [0,2,0]
    [0,0,3]]
*/
  
matrix m2;
m2.Diag(v1, -1);
Print("m2\n"m2);
/*
   m2
   [[0,0,0]
    [1,0,0]
    [0,2,0]
    [0,0,3]]
*/
  
matrix m3;
m3.Diag(v11);
Print("m3\n"m3);
/*
   m3
   [[0,1,0,0]
    [0,0,2,0]
    [0,0,0,3]]
*/

使用 Reshape 更改矩阵配置:

matrix matrix_a = {{123}, {456}, {789}, {101112}};
Print("matrix_a\n"matrix_a);
/*
   matrix_a
   [[1,2,3]
    [4,5,6]
    [7,8,9]
    [10,11,12]]
*/
  
matrix_a.Reshape(26);
Print("Reshape(2,6)\n"matrix_a);
/*
   Reshape(2,6)
   [[1,2,3,4,5,6]
    [7,8,9,10,11,12]]
*/
  
matrix_a.Reshape(35);
Print("Reshape(3,5)\n"matrix_a);
/*
   Reshape(3,5)
   [[1,2,3,4,5]
    [6,7,8,9,10]
    [11,12,0,3,0]]
*/
  
matrix_a.Reshape(24);
Print("Reshape(2,4)\n"matrix_a);
/*
   Reshape(2,4)
   [[1,2,3,4]
    [5,6,7,8]]
*/

解方程时,我们将在一个示例中应用矩阵拆分为子矩阵。

ColRow 方法不仅允许按其编号获取矩阵的列或行,而且允许原位将它们插入先前定义的矩阵。在此情况下,矩阵的维数或列向量(对于 Col 的情况)或行向量(对于 Row 的情况)以外元素的值均将不变。

如果这两个方法中的任一个应用于一个尚未设置其维数的矩阵,则将创建一个大小为 [N * M] 的空矩阵,其中以不同方式为 ColRow 定义 N 和 M(基于向量的长度以及给定的列或行索引):

  • 对于 Col,N 是列向量的长度,M 比插入列的指定索引大 1
  • 对于 Row,N 比插入行的指定索引大 1,而 M 是行向量的长度

截止本章撰稿时,MQL5 还未提供用于成熟可靠的带后续元素扩展的行和列插入的方法,以及用于排除指定行和列的方法。