矩阵和向量的乘积

矩阵乘法是各种数值方法中的基础运算之一。例如,在神经网络层中实施前向和后向传播方法时经常用到。

各种卷积也可归因于矩阵乘积的类别。MQL5 中的此类函数组类似于:

  • MatMul:两个矩阵的矩阵乘积
  • Power:将一个方矩阵自乘到指定整数次幂
  • Inner:两个矩阵的内积
  • Outer:两个矩阵或两个向量的外积
  • Kron:两个矩阵、一个矩阵和一个向量、一个向量和一个矩阵或者两个向量的克罗内克积
  • CorrCoef:计算一个矩阵的行之间或列之间,或向量之间的皮尔逊相关性
  • Cov:计算一个矩阵的行或列的或两个向量之间的协方差矩阵
  • Correlate:计算两个向量的互相关性(交叉相关性)
  • Convolve:计算两个向量的离散线性卷积
  • Dot:两个向量的标量积

为给出关于如何管理这些方法的一个总体概念,我们将给出他们的原型(按以下顺序:从矩阵开始,经过混合矩阵-向量,到向量)。

matrix<T> matrix<T>::MatMul(const matrix<T> &m)

matrix<T> matrix<T>::Power(const int power)

matrix<T> matrix<T>::Inner(const matrix<T> &m)

matrix<T> matrix<T>::Outer(const matrix<T> &m)

matrix<T> matrix<T>::Kron(const matrix<T> &m)

matrix<T> matrix<T>::Kron(const vector<T> &v)

matrix<T> matrix<T>::CorrCoef(const bool rows = true)

matrix<T> matrix<T>::Cov(const bool rows = true)

matrix<T> vector<T>::Cov(const vector<T> &v)

T vector<T>::CorrCoef(const vector<T> &v)

vector<T> vector<T>::Correlate(const vector<T> &v, ENUM_VECTOR_CONVOLVE mode)

vector<T> vector<T>::Convolve(const vector<T> &v, ENUM_VECTOR_CONVOLVE mode)

matrix<T> vector<T>::Outer(const vector<T> &v)

matrix<T> vector<T>::Kron(const matrix<T> &m)

matrix<T> vector<T>::Kron(const vector<T> &v)

T vector<T>::Dot(const vector<T> &v)

下面的简单示例演示了如何使用 MatMul 方法计算两个矩阵的矩阵乘积:

matrix a = {{100},
            {010}};
matrix b = {{41},
            {22},
            {13}};
matrix c1 = a.MatMul(b);
matrix c2 = b.MatMul(a);
Print("c1 = \n"c1);
Print("c2 = \n"c2);
/*
   c1 = 
   [[4,1]
    [2,2]]
   c2 = 
   [[4,1,0]
    [2,2,0]
    [1,3,0]]
*/

A[M,N] * B[N,K] = C[M,K] 形式的矩阵可以相乘,即,第一矩阵中的列数必须等于第二矩阵中的行数。如果维数不一致,则结果为空矩阵。

当矩阵和向量相乘时,允许两个选项:

  • 横向量(行)乘以右边的矩阵,向量的长度等于矩阵行数
  • 矩阵乘以右边的纵向量(列),向量的长度等于矩阵的列数

向量也可以彼此相乘。在 MatMul 中,这始终等效于一个行向量乘以一个列向量的点积(Dot 法),并且“当一个列向量乘以一个行向量并得到一个矩阵”这一选择由另一个方法支持:Outer

我们演示向量 v5 乘以向量 v3Outer积,并以相反顺序演示。在两种情况下,列向量指示在左边,行向量指示在右边。

vector v3 = {123};
vector v5 = {12345};
Print("v5 = \n"v5);
Print("v3 = \n"v3);
Print("v5.Outer(v3) = m[5,3] \n"v5.Outer(v3));
Print("v3.Outer(v5) = m[3,5] \n"v3.Outer(v5));
/*
   v5 =
   [1,2,3,4,5]
   v3 =
   [1,2,3]
   v5.Outer(v3) = m[5,3]
   [[1,2,3]
    [2,4,6]
    [3,6,9]
    [4,8,12]
    [5,10,15]]
   v3.Outer(v5) = m[3,5]
   [[1,2,3,4,5]
    [2,4,6,8,10]
    [3,6,9,12,15]]
*/