Power

正方行列を整数乗します。

matrix matrix::Power(
  const int  power      // 乗
  );

パラメータ

power

[in] 指数は、任意の整数、正、負、またはゼロにすることができます。

戻り値

行列

注意事項

結果の行列は、元の行列と同じサイズになります。0のべき乗では、単位行列が返されます。正のべき乗nは、元の行列がn倍に乗算されることを意味します。負のべき乗-nは、元の行列が最初に反転され、次に反転された行列がn回乗算されることを意味します。

 

次は、MQL5で行列を累乗する単純なアルゴリズムです。

bool MatrixPower(matrix& c, const matrix& a, const int power)
 {
//--- 正方行列が必要
  if(a.Rows()!=a.Cols())
    return(false);
//--- 結果の行列のサイズはまったく同じ
  ulong rows=a.Rows();
  ulong cols=a.Cols();
  matrix result(rows,cols);
//--- ゼロにべき乗された場合は単位行列を返す
  if(power==0)
    result.Identity();
  else
    {
    //--- 負の次数の場合、最初に行列を反転する
    if(power<0)
       {
        matrix inverted=a.Inv();
        result=inverted;
        for(int i=-1; i>power; i--)
          result=result.MatMul(inverted);
       }
    else
       {
        result=a;
        for(int i=1; i<power; i++)
          result=result.MatMul(a);
       }
    }
//---
  c=result;
  return(true);
 }

 

MQL5の例

matrix i= {{0, 1}, {-1, 0}};
Print("i:\n", i);
 
Print("i.Power(3):\n", i.Power(3));
 
Print("i.Power(0):\n", i.Power(0));
 
Print("i.Power(-3):\n", i.Power(-3));
 
 /*
i:
 [[0,1]
  [-1,0]]
 
i.Power(3):
 [[0,-1]
  [1,0]]
 
i.Power(0):
 [[1,0]
  [0,1]]
 
i.Power(-3):
 [[0, -1]
  [1,0]]
 */

 

Pythonの例

import numpy as np
from numpy.linalg import matrix_power
 
# matrix equiv. of the imaginary unit
i = np.array([[0, 1], [-1, 0]])
print("i:\n",i)
 
# should = -i
print("matrix_power(i, 3) :\n",matrix_power(i, 3) )
 
print("matrix_power(i, 0):\n",matrix_power(i, 0))
 
# should = 1/(-i) = i, but w/ f.p. elements
print("matrix_power(i, -3):\n",matrix_power(i, -3))
 
i:
[[ 0 1]
[-1 0]]
 
matrix_power(i, 3) :
[[ 0 -1]
[ 1 0]]
 
matrix_power(i, 0):
[[1 0]
[0 1]]
 
matrix_power(i, -3):
[[ 0. 1.]
[-1. 0.]]