今週はガウス基底に苦戦しておりました。
Rで動くプログラムを一生懸命にMT4に移植しておるのですが、自作ライブラリがダメなのか、それとも根本的に間違っているのか。 どうも同じ結果になりません。
MT4からRやPythonを呼び出す方法もあるのですが、勉強の為に試行錯誤しておる次第です。
今週悩んだのは基底関数だけでなくて行列の外積処理でした。
行列の掛け算は内積と外積があり。 恥ずかしながら外積というのはコマンドを知っていても、それをCで作成するとなると、どうすれば良いのか。 と 途方に暮れた次第です。
Rだと外積は outer( a, b, FN) と書きます。 FNはFunctionを指定できます。
aとbがベクトルもしくは一次元配列ならば 行列[row][col] でイメージできるのですが、aとbが二次元配列となると.... 状態です。
outerは3次元グラフの作成に良く出てくるのですが、出力結果が3次元行列になるので、頭の中でX,Y,Zを思いながら ということです。
ネタもないのでもう少しRのことを書きます(R知っている人には面白くないですが)
たとえば
# design matrix
phi <- function(x) sapply(x,function(x)exp(-(x-seq(0,1,length=9))^2/(2*s*s)))
という処理があったとします。
最初の # design matrix はコメント
phi <- は phi =
function(x) は 引数xを取る関数を定義し、呼び出しは phi( 行列A) などで呼び出します。
sapply 引数リスト(ベクトルや行列)を処理し、その結果をベクトルで返す
次の( x, function(x) はsapplyが行う処理を定義
実際の処理は
exp(-(x-seq(0,1,length=9))^2/(2*s*s)) で、さらにseq(0,1,length=9)は0から1を等分した9つのベクトルを返します。 sは定数で別のところで定義されています。
> seq(0,1,length=9)
[1] 0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 1.000
これをC(MT4)で書くと
double matrix[9];
for( int n = 0; n < length; n++){
matrix[n]=( 1/ (length -1)) * n;
}
と3行のプログラムになります。
MT4だと関数の戻り値にポインターが使えないので、seq(0,1,length=9)をいったん配列に出力して、その配列を次の処理に投入。 ということになるので、phi <- function(x) sapply(x,function(x)exp(-(x-seq(0,1,length=9))^2/(2*s*s)))がエラー処理を加えて100行近いプログラムになってしまいます。
処理が100倍早いかと聞かれると、良くわかりませんが、20倍ぐらいは早いのでは?
ぐだくだ書いて締めが見えなくなってきましたので、本日はここまで
来週はドル円が勝負どころでしょうか
0 件のコメント:
コメントを投稿
コメントありがとうございます。
すぐに返信できないことが多いかもしれませんが、よろしくお願いいたします。