2011年5月23日月曜日

octave の toc を修正

Matlab と octave には微妙ないくつか違いがあって、たとえば Matlab では

>> t=tic(); A=rand(3000,3000); toc(t);
Elapsed time is 0.445469 seconds.

のように tic の出力を引数として toc を使うことができる。
最近のマルチコアでは cputime だとすべてのコアの計算が加算されてしまうので、実際の計算時間は tic, toc を用いるようになっており、tic,toc は計算時間の測定に欠かせない。
しかし、octave の場合、

>> t=tic(); A=rand(3000,3000); toc(t);
warning: tic: ignoring extra arguments
Elapsed time is 10.6201 seconds.

となり、引数を認識できない。
認識できないのは octave のソースファイルの中で src/data.cc に認識しないようにプログラムが書かれているためである。(引数を無視するようになっている。)

このような場合には、以下の toc.m を作って、toc 関数を上書きするという手がある。

function elapsed_time = toc(tic_var)
if nargin == 0
error('You need the argument obtained by tic');
end
elapsed_time = double(tic() - tic_var)*(1.0e-6);

これで、
>> t=tic(); A=rand(3000,3000); toc(t);
のように実行できるようになる。
ただし、今度は toc に必ず引数を指定する必要がでてくる。
これは、tic で格納される値は、C++ の static 変数であるため、Matlab のソースからは見ることができないことに起因している。

今回の件は、src/data.cc をみると octave の開発者であれば簡単に修正できることがわかるが、
http://octave.1599824.n4.nabble.com/tic-has-a-extra-behavior-td1667647.html
を見る限り、すでに3年以上前に認識されているバグのようで、そのまま放置されているようである。

今日の作業内容: Octave の tic,toc 2h + 論文探し 3h
今日のランチ:らく 焼き魚定食
明日の予測作業時間:4h

0 件のコメント:

コメントを投稿