MatMul

Matrislerin ve vektörlerin çarpımını sağlayan MatMul metodu birkaç aşırı yüke sahiptir.

Bir matrisi bir matrisle çarpma: matrix[M][K] * matrix[K][N] = matrix[M][N]

matrix  matrix::MatMul(
  const matrix&  b      // ikinci matris
   );

Bir vektörü bir matrisle çarpma: horizontal vector[K] * matrix[K][N] = horizontal vector[N]

vector  vector::MatMul(
  const matrix&  b      // matris
   );

Bir matrisi bir vektörle çarpma: matrix[M][K] * vertical vector[K] = vertical vector[M]

vector  matrix::MatMul(
  const vector&  b      // vektör
   );

Skaler vektör çarpımı: horizontal vector * vertical vector = dot value

scalar  vector::MatMul(
  const vector&  b      // ikinci vektör
   );

Parametreler

b

[in]  Matris veya vektör.

Geri dönüş değeri

Kullanılan metoda bağlı olarak matris, vektör veya skaler.

Not

Matrisler çarpma işlemi için uyumlu olmalıdır, yani birinci matristeki sütun sayısı, ikinci matristeki satır sayısına eşit olmalıdır. Matris çarpımı değişmeli değildir: genel olarak, birinci matrisin ikinci matrisle çarpımının sonucu, ikinci matrisin birinci matrisle çarpımının sonucuna eşit değildir.

Matris çarpımı, birinci matrisin satır vektörlerinin ve ikinci matrisin sütun vektörlerinin skaler çarpımlarının tüm olası kombinasyonlarından oluşur.

Skaler çarpımda vektörler aynı uzunlukta olmalıdır.

Bir vektör ile bir matris çarpılırken, vektörün uzunluğu matrisin sütun sayısıyla tam olarak eşleşmelidir.

 

MQL5'te saf matris çarpımı algoritması:

matrix MatrixProduct(const matrixmatrix_aconst matrixmatrix_b)
  {
   matrix matrix_c;
 
   if(matrix_a.Cols()!=matrix_b.Rows())
      return(matrix_c);
      
   ulong M=matrix_a.Rows();
   ulong K=matrix_a.Cols();
   ulong N=matrix_b.Cols();
   matrix_c=matrix::Zeros(M,N);
 
   for(ulong m=0m<Mm++)
      for(ulong k=0k<Kk++)
         for(ulong n=0n<Nn++)
            matrix_c[m][n]+=matrix_a[m][k]*matrix_b[k][n];
 
   return(matrix_c);
  }

 

Matris çarpımı örneği:

   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]]
*/

 

Bir yatay vektörü bir matrisle çarpma örneği:

//+------------------------------------------------------------------+
//| Komut dosyası başlatma fonksiyonu                                |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 3x5 matris oluştur
   matrix m35;
   m35.Init(35Arange);
//---
   vector v3 = {123};
   Print("Product of horizontal vector v and matrix m[3,5]");
   Print("On the left, vector v3 = "v3);
   Print("On the right, matrix m35 = \n"m35);
   Print("v3.MatMul(m35) = horizontal vector v[5] \n"v3.MatMul(m35));
 
  /* Sonuç
    Product of horizontal vector v3 and matrix m[3,5]
    On the left, vector v3 = [1,2,3]
    On the right, matrix m35 =
    [[0,1,2,3,4]
     [5,6,7,8,9]
     [10,11,12,13,14]]
    v3.MatMul(m35) = horizontal vector v[5]
    [40,46,52,58,64]
   */
  }
//+------------------------------------------------------------------+
//|  Matrisi artan değerlerle doldur                                 |
//+------------------------------------------------------------------+
void Arange(matrix & mdouble start = 0double step = 1)
  {
//---
   ulong cols = m.Cols();
   ulong rows = m.Rows();
   double value = start;
   for(ulong r = 0r < rowsr++)
     {
      for(ulong c = 0c < colsc++)
        {
         m[r][c] = value;
         value += step;
        }
     }
//---
  }

 

Bir matrisi bir dikey vektörle çarpma örneği:

//+------------------------------------------------------------------+
//| Komut dosyası başlatma fonksiyonu                                |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 3x5 matris oluştur
   matrix m35;
   m35.Init(35Arange);
//---
   Print("Product of matrix m[3,5] and vertical vector v[5]");
   vector v5 = {1,2,3,4,5};
   Print("On the left, m35 = \n",m35);
   Print("On the right v5 = ",v5);
   Print("m35.MatMul(v5) = vertical vector v[3] \n",m35.MatMul(v5));
 
  /* Sonuç
   Product of matrix m[3,5] and vertical vector v[5]
   On the left, m35 = 
   [[0,1,2,3,4]
    [5,6,7,8,9]
    [10,11,12,13,14]]
   On the right, v5 = [1,2,3,4,5]
   m35.MatMul(v5) = vertical vector v[3
   [40,115,190]
   */
  }
//+------------------------------------------------------------------+
//|  Matrisi artan değerlerle doldur                                 |
//+------------------------------------------------------------------+
void Arange(matrix & mdouble start = 0double step = 1)
  {
//---
   ulong cols = m.Cols();
   ulong rows = m.Rows();
   double value = start;
   for(ulong r = 0r < rowsr++)
     {
      for(ulong c = 0c < colsc++)
        {
         m[r][c] = value;
         value += step;
        }
     }
//---
  }

 

Vektörlerin skaler (nokta) çarpımına bir örnek:

void OnStart()
  {
//--- bir yatay vektör ile bir dikey vektörün skaler çarpımı
   vector a= {123};  // yatay vektör
   vector b= {456};  // dikey vektör
   Print("a = "a);
   Print("b = "b);
   Print("1) a.MatMul(b) = "a.MatMul(b));
   //--- Dot metodunun da aynı sonucu ürettiğini göster
   Print("2) a.Dot(b) = "a.Dot(b));
 
  /* Sonuç
   a = [1,2,3]
   b = [4,5,6]
   1a.MatMul(b) = 32.0
   2a.Dot(b) = 32.0
    */
  }

 

Ayrıca bakınız

Dot, GeMM