行列とベクトルによる数学演算

足し算、引き算、掛け算、割り算などの数学演算は、行列とベクトルに対して要素単位で実行できます。

数学関数は、もともとスカラー値に対して関連する操作を実行するために設計されました。ほとんどの関数は、行列とベクトルに適用できます。これには、MathAbs、MathArccos、MathArcsin、MathArctan、MathCeil、MathCos、MathExp、MathFloor、MathLog、MathLog10、MathMod、MathPow、MathRound、MathSin、MathSqrt、MathTan、MathExpm1、MathLog1p、MathArccosh、MathArcsinh、MathArctanh、MathCosh、MathSinh、MathTanhが含まれます。このような操作は、行列とベクトルの要素単位の処理を意味します。例

//---
matrix a= {{1, 4}, {9, 16}};
Print("matrix a=\n",a);
a=MathSqrt(a);
Print("MatrSqrt(a)=\n",a);
 /*
  matrix a=
  [[1,4]
   [9,16]]
  MatrSqrt(a)=
  [[1,2]
   [3,4]]
 */

MathModMathPowの場合、2番目の要素は適切なサイズのスカラーまたは行列/ベクトルのいずれかです。

次の例は、数学関数をベクトルに適用して標準偏差を計算する方法を示しています。

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
{
//--- ベクトルを埋めるために初期化関数を使用する
vector r(10, ArrayRandom); // 0〜1の乱数の配列
//--- 平均値を計算する
double avr=r.Mean();       // 配列の平均値
vector d=r-avr;           // 平均からの偏差の配列を計算する
Print("avr(r)=", avr);
Print("r=", r);
Print("d=", d);
vector s2=MathPow(d, 2);   // 二乗偏差の配列
double sum=s2.Sum();       // 二乗偏差の総和
//--- 2つの異なる方法で標準偏差を計算する
double std=MathSqrt(sum/r.Size());
Print(" std(r)=", std);
Print("r.Std()=", r.Std());  
}
/*
avr(r)=0.5300302133243813
r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
  std(r)=0.2838269732183663
r.Std()=0.2838269732183663
*/
//+------------------------------------------------------------------+
//| ベクトルにランダムな値を書き込む                                           |
//+------------------------------------------------------------------+
void ArrayRandom(vector& v)
{
for(ulong i=0; i<v.Size(); i++)
  v[i]=double(MathRand())/32767.;
}