そんな暇でもないのに、Octaveを一日中いじり続けてしまった。
MacBook AirにOctaveをインストールしたけれど、
PowerBookのころに使っていたmファイルが動かないので、
インストールに失敗したのかと思っていた。
それで何時間もインストールが失敗した原因について調べていたのだけど、
結果的にはインストールはOKで、
OctaveもGnuplotもAquaTermも問題なかった。
ただ、以前とバージョンが変わって、
mファイルの名前がOctaveの予約語と重複してしまっただけだった。
で、それが一段落した後で、
手元にあるデータをいじっているうちに自己相関関数を計算したくなってしまって、
そのアルゴリズムについて考えていた。
プログラミングするに当たって、
無限の連続関数でやる分には問題にならないところが
問題になってくる。
有限の離散関数になると扱いが面倒になる。
データが有限の長さしかないので、
無限の区間積分することはできず、
どこからどこまでを積分するかを考えなければいけない。
積分する区間を固定して、
系列を1ステップずつずらしてゆき、
必要な積分区間を確保できなくなったら終了ということにする。
で、積分する区間が偶数か奇数かで場合分けし、
さらに、系列が重なっている部分が偶数か奇数かで場合することで
どこからどこまで積分するかということを
厳密に計算できるのではないかという結論にいたった。
偶数×偶数、奇数×奇数の組み合わせの場合は、
あまりよく考えなくても重なった系列の中心から前と後ろに
固定幅の半分の要素をとってくればよし。
問題は奇数×偶数、偶数×奇数の場合で、
この場合はどうやっても系列の中心から左右対称に
要素をとってくることができない。
なので、この場合は固定幅より1短い長さの要素を
系列の中心から等しくとってきて、
最後にその要素の前後の要素一個ずつをとってきて、
足して2で割って平均し、それを要素として加えればいいのではないか、
という考えにいたった。
外側の要素を2つとってきてそれの平均をとるというのは、
自己相関を計算する上でいいのかどうかわからないが、
そうでもしないかぎり
左右対称に毎回同数の要素数を積分することはできない。
ということでそういうアイディアを思いついたのだけど、
Octaveのスクリプトを書くのはまた今度。