どうやらOctaveは行列計算が大変強い模様。MATLABとの関係は、良く分からない。どっちが先行してたんだろうか。MaximaとかMacsymaとか、なんだとか、そういうのと同じ感じなんだろうか。あと似たようなのにScilabとかいうのもあるらしいです。マネーがないんでOctave使ってみます。まあ、別にMATLABあるんだけどさ、一々インスコするのが面倒臭いんだよ。Octaveだとaptでサクッと入ったしな。
そういうことで、OctaveはMathematicaと似たように基本的に変数は値としてではなく、配列的なものとして取り扱われてるらしい。配列とポインタって何だかよくわからないですねと。分からなくても使ってしまってるのはどうかと思うんだが、どうでも良い。
要するに、変数がaあったとして、そのaはある値だけを持ってる訳じゃないですよということらしい。つまり、aはベクトル立ったり、行列だったりということもアリアリらしい。
所で、Octaveの中では行列計算をするときにはLAPACKが使われてて、FFTするときはFFTWが使われてるらしいんだけど、aptでインスコしたときはこれといってLAPACKもFFTWも求められなかったんだけど、あれはあれで良いんだろうか。高速でないけど、動くよっていうことで良い?gnuplotはインスコしてないとプロットできなかった。この辺のあれがよくわからない。
まあ使えてるのでそれで良いんだけど。
(「続きを読む」で、その他諸々が見られます。)
変数の扱いから
ということで、基本から。
Octaveだとどうやら変数は行列として扱うことを念頭に置いてる模様。そりゃ行列計算のための言語というか、ツールだからなあ。
例えば、
というような行列を定義したい場合は、
> a = [11, 12, 13; 21, 22, 23; 31, 32, 33];
とするとaにそれらの値が格納されるらしい。
同様に、
の場合は、
> a = [1, 2, 3];
のときは、
> a = [1; 2; 3];
> z = a+ib;
みたいにして使えるらしい。
で、転置を取るときは、`を付けて、対角化行列はdiag()関数、固有値を求める場合はeig()関数を使えば良くて、それぞれ、
> B = A`; ... > C = diag (A); ... > D = eig (A); ...
になるらしい。あと、行列の形になってる変数同士の掛け算は勝手に行列の掛け算としてやってくれる。素晴らしい。C言語で行列使うときみたいにfor文二重とかしなくていいんですね。これは大変便利であるなあと。というか、C言語の一見不便なあれに俺が慣れすぎてるだけなんだけどね。そういうことで、今日はデータ読み込んでスペクトル出す所までいきたいなあと思います。次はファイル操作かね。
あと、今は対話的に実行してますが、そのうちファイルからドバッとやるようにしなければなあ。やることが多くてとっても楽しいです☆
あと、行列の要素の指定は、a(1,1)とかでやるらしい。これはa11に相当するらしい。
Octave的なファイル操作
読み込みがloadで、書き込みがsave。なんて安直な。まあこの手の高級言語は使い易さとかわかりやすさが重要なのですきっと。かといって、とっつきが簡単だと、糞やったらとオプションが多くて、何して良いか分からなくなることもあるので微妙。CとかC++程度の使いにくさの方が使い易いこともあるので微妙。何だか俺が超高級な言語をうまく使いこなせないのもこの辺に原因がある気がする。そのうちPythonとかRubyとかPerl使えるようになりたいものです。CとFortranしか分からんとか言うとお里が知れるってもんです。
loadで、hoge.datというファイルを読み込むと、hogeという変数の中にhoge.datの中身が取り込まれるらしいです。
例えば、hoge.datが、
11 12 13 21 22 23 31 32 33
だったとすると、
> load hoge.dat > hoge > hoge= 11 12 13 21 22 23 31 32 33
とかなります。簡単で良いですね。でも行列形式でないと上手く読み込めないらしい。そりゃ当たり前か。文字列はどうなるんだろうか。まあ別にどうでも良いんだけど。
そして、saveでは、ファイル名と変数名を指定して書き込みます。
> save test.dat hoge
そこで、test.datファイルを覗くと、Octaveの形式っぽい感じで記録されてます。所々コメントが付いてます。
さらに、変数名を指定しないと、今現在使ってる変数全部を書き出してくれます。素晴らしいですね。今現在使ってる変数は、whoという命令で調べられます。とりあえずそのとき目の前にある物はファイルにぶち込んでくれるらしい。なんてお手軽な。というか、便利なんだろうと。
http://www.obihiro.ac.jp/~suzukim/masuda/octave/html/octave_77.html#SEC114
C言語的なファイル操作
まずファイルポインタを指定するのにfopenを使うのは同じ。形式も同じ。
> fp = fopen ("hoge.dat","r");
そんなファイルねーよっていうときはfpには-1が返ってくるのがC言語とはちょっと違うらしい。
そして、その後の読み込みは、fgets関数を使う。と、一行ずつ読み込んでくれる。
> Line1 = fgets (fp); > Line1 Line1 = 11 12 13
更に、fgets(id,lines)とすると、lines行分だけ読んでくれる。素晴らしい。とても便利である。
for (; !feof(fp); ) fscanf (fp, "...", ...); while (!feof(fp)) fscanf (fp, "...", ...);
とかやらなくて良いのが素晴らしい。
でも、fgetsにも若干問題があって、文字列として読み込まれるので、それを数値に変えないといけないらしい。この辺でちょっと分からなくなるが、一回fgetsで読み込んでおいて、変数の中身をssfanfとかfscanfで読み込むらしい。sscanfって何だっけ。俺いつもfscanfばっか使ってるから分かんないや。とかいうのは良くて、sscanfだとデータの区切りごとに読み込んでくれるらしい。この辺はまた明日お勉強です。