liboctaveで行列演算するための準備

octaveの資料は結構あるけど、liboctaveをC++で使う資料はちょっと見た限り少なかったので、今後抵抗なく使ってくための準備を使用かなと思っていたら・・・すばらしいサイトを見つけてしまった。

特に

は、使っていくために必要なことがかかれてる。ほかにも

をソース付きで扱っていた。
擬似逆行列やSVDを今日やろうと思ってたのに、用途も書いて解説してくれていた。

いや、ほんとやることがなくなってしまった。ここが検索トップに来るようにリンク張りまくっておこw


まぁやることなくなったけどとりあえずこれだけ書いとこう。
2*3の行列Aを処理するとき
input.txt

2 3
1 2 3
4 5 6

と入力を作って
matrix.cpp

#include <iostream>
#include <octave/config.h>
#include <octave/Matrix.h>
using namespace std;
int main() {
  int m, n; cin >> m >> n;
  Matrix a(m,n); cin >> a;
  cout << "a:\n" << a << endl;
  // 処理 //
  return 0;
}

ってな感じにソースを作って

$ mkoctfile --link-stand-alone matrix.cpp
$ ./a < input.txt
a:
 1 2 3
 4 5 6

実行すれば幸せになれることがわかった。

liboctaveをCygwinで使う。

とりあえず、liboctaveを使って

// octave_test.cpp
#include <iostream>
#include <octave/config.h>
#include <octave/Matrix.h>
using namespace std;
int main() {
  Matrix a(2, 2, 1.0);
  cout << a << endl;
  return 0;
}

のコードをコンパイルすることを目標にする。
ちなみにg++でコンパイルするにはいろいろとLIB,FLAGなどの設定がいるらしいが、

$ mkoctfile --link-stand-alone -o octtest octave_test.cpp

とすることで簡単にコンパイルできるらしい。

Cygwinはもともと入っていたので、追加で必要なものをインストールしてみた。
追加したのはMathカテゴリの中の

  • octave から始まる4項目
  • gnuplot (ついでに必要そうだったから)

の2種類。

これで先ほどのmkoctfileでコンパイルしてみると、
"cannot find -lhdf5"というメッセージが出たので、
さらに、Archiveカテゴリにあった

  • hdf5
  • libhdf5から始まる2項目

を追加でインストール。

これでもう一回さっきのコンパイル命令をしたら、

$ mkoctfile --link-stand-alone -o octtest octave_test.cpp
g++: unrecognized option `-rdynamic'

と-rdynamicオプションがないとかでたけど、まぁ目的の実行ファイルはできたのでよし。
g++のバージョンが古いのかな???


結局liboctaveは使いやすかった。とりあえずこのまま使い続けようと思う。

機械学習アルゴリズム実装用行列計算ライブラリ

いま大学の研究室で機械学習アルゴリズムを勉強がてら、実装してみよう企画がある。基本的には実用的な高速なのを作るというよりも、コードがシンプルなものを作るのが目的。
で、使う言語はC++で固まりそうなのだが、困っているのが行列演算とかの数学系のライブラリを何使うか。


http://www.kmonos.net/alang/cpp/lib.htmlには

  • Blitz++
  • MTL
  • tvmet

の3つが行列計算用と書いてあったので見比べてみた。

MTLは高速なのかもしれないが、ただの足し算もaddなどでやらないといけないようだったので、ちょっとコードのわかりやすさとか、今回の観点からはずれている気がした。そういう意味で、tvmetは小規模で最低限やりたいことはできるし、ドキュメントも見やすいのでいい。ただ、Blitz++のポピュラーさによる安心感は捨てがたいものがあった。

そんなこんなで、Blitz++とtvmetで迷っていたのだが、SVDとかしたいと思った時にできるのかなと思って調べてみると、この3つともできないことが判明!


そこでSVDのできるライブラリを探すとOctaveというのが見つかった。
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/numerical/

基本的に、パターン認識と機械学習とか書いている人はMATLAB使いが多いというので、MATLABクローンだったら幸せにプログラミングできそうな気がする。リンクがめんどくさいとか言うの欠点があるらしいが、ここにコンパイルオプション書いといてといてくれてるから、大丈夫そうだし。


ただ、これ使うなら、そもそもMATLAB使えばって話になりそうだし、もっと言っちゃえば、これ使って組んで機械学習アルゴリズムの勉強になるのかな??


うーん、悩む・・・。

Quantativeテスト

とりあえず満点だったからよし。でも、結構時間ぎりぎりだったし、大事なのは次回以降なので、そのためにコツを書いとく。
結構引っ掛けが多いし、時間をかけて考えたほうがいい問題も結構あってそれが最後のほうに多くなってくるので、最初のほうの簡単めな問題はあんまり気にせずにちゃちゃっと解いちゃったほうがいい。


後は、今回久しぶりに紙で筆算とかやったから、自分の暗算力の低下に衝撃を覚えた。たまには軽い計算したほうがいいかも。

Verbalテスト

とりあえず、ひどかった。確信もって答えれたのが一個もなかったしT_T。しかも時間足りなくなっちゃったし。
結果としては、予想通りで、多分パー船タイル的には10数%ぐらいのところにいる、典型的な日本人のひどい点数を取ってしまった。

最初新たに8000語必要とかいわれ、無理だーと思って3500語の単語リスト覚えようとしたけど、これも無理だーと思って800語のを買い、さらにこれを30個しか覚えていかなかったから、当然の結果なんだけども・・・。


てことで反省。
結論としては単語を覚えまくるしかない・・・てことがわかっただけなんだけれども。

まず、アナロジーテストと空欄補充で空欄が2つあるところの負荷が予想以上に高い。もし出題された部分の単語や文脈がわかっても、選択肢に単語が全部で10個あるわけだから、わかんない単語が4個ぐらいあって、もうどうでもよくなってくる。
さらにそんな状態で、正解を選ぼうとすると1分ぐらい平気でたっちゃうから、わからなかったら潔くあきらめることも大切かも。
見たことあるけど、文脈とかまったくないから思い出せないって単語も結構多くていらいらが募った。

基本的にはReadingはがんばればできるはずだけど、時間がかかるから他の問題に時間とられないことが大切っぽい。

ただ、正答率によって問題が変わるらしいから最初のほうで適当にやりすぎると後でがんばっても取り返しが付かないらしいんだけれども。


結局、単語を覚えまくって、時間のほとんどをReadingにまわせるようにするしかないね。

GRE初受験

アメリカの大学院センター試験みたいなGREを受けてきた。
いやー疲れた。


とりあえず、結果。
Quantitative(算数のテスト)800点、Verbal(語彙力テスト)330点だった。Analytical(ライティング)はまだ点数出てない。
ちなみに満点はそれぞれ800点で一応1200点以上(つまりVerbalで400点以上)とるのが目標。Quantitativeは日本人なら満点取れて当たり前って聞いてたから、本当に満点取れて安心した。
あと、ダミーテストがAnalyticalだったんだけどどうしたんだろうね。3つも文章書いちゃったよ。


何か1ヶ月に1回しか受けられないことを9月20日に知り、必死に9月最後のテストを申し込んで受けてきた。もう、どんなテストかもあんまりわからない状態だったから、一回受けて覚えよう的な。終わってるw