table & matrix

研究をやっていてもそうですが,表のような形になっているログファイルを読み込んで何か処理をしたい場合が良くあります(ここ最近では,gnuplot形式のログファイルを触ったり).また,最近は徐々に減ってきていますが csv形式のファイルを扱う機会も良くめぐってきます.なので,今日はそういったファイルを扱う際の助けになるものを作成しようと思います.

作成したものは,tableクラスとmatrixクラス.どちらも働きはほぼ同じなのですが,string型で保持するかdouble型で保持するかで2つに分けました.これらのクラスは,csvのようなファイルを読み込んで,i行j列目の要素をa[i][j]といった形でアクセスできるようになります.何はともあれ,まずは例を挙げてみようと思います.

次のようなファイルがあったとします(ファイル名はtest.dat).思いつきで作ったので,意味はないのですが・・・最初の項目が出席番号で残りが5教科のテストの点・・・とかかな.

1 100  60  70  80  80
2  89  85  82  90  75
3  75  60  65  60  80
4  80  90  80  80  80
5  90  85  83  50  75

次に,次のようなプログラムを書きます.

#include "clx/matrix.h"

int main(int argc, char* argv[])
{
    clx::matrix mtx;
    
    mtx.read(argv[1]);
    //これ以降に,行いたい処理を書く.
    
    return 0;
}

そして,このプログラムを実行する際にtest.datを引数として与えると,mtx.read()メソッドで,ファイルを読み込んで解析し,メモリ上に格納します.これ以降は,mtx[i][j]といった形でそれぞれの要素へアクセスできるようになります(例えば,mtx[0][0]は1.0,mtx[4][2]は85.0).ちょっとしたログ解析プログラムを作るときなどに重宝しています.

matrixでは,面倒なのでatof()を使って最終的には全てdouble型になるようにしていますが,たとえばboostのlexical_castなんかを使うともう少し汎用性があがりそうです.