2014年7月13日日曜日

苦戦中につきネタなし

今週はガウス基底に苦戦しておりました。

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 件のコメント:

コメントを投稿

コメントありがとうございます。

すぐに返信できないことが多いかもしれませんが、よろしくお願いいたします。