LIBSVMのMATLAB用ソースをoctaveで使う

Learning the Discriminative Power-Invariance Trade-Off
http://research.microsoft.com/en-us/um/people/manik/projects/trade-off/trade-off.html
MATLAB用のコードがとりあえずcygwin上でoctaveで動いた。
手順を忘れないようにメモ。


<準備>
1.コードの取得
http://research.microsoft.com/en-us/um/people/manik/code/GMKL/libsvm-2.84.tgz
からダウンロード。


2.octave(version 3.2.4)のインストール
cygwinのstart.exeから
Math/octave, Math/octave-devel, Math/octave-doc, Math/octave-forge
をインストール。


3.fftw3のインストール
コードのコンパイルの際に必要になった。
cygwinのstart.exeからMath/libfftw3-develをインストール。



コンパイル
MEXファイルを作り, octaveからコードの関数を呼び出せるようにする。
MatlabOctaveのファイルの位置関係が分からなかったのでMakefileの内容
を頼りに行った。


webで以下のような記述も見つけたが対応したLIBSVMMakefileoctaveのターゲットは見つからなかった。
http://www.google.co.jp/url?q=http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html%23f805&usg=AFQjCNGhpHLyyhhH6Sr0GGgT8wAE9g6gtg&sa=X&ei=Io4QTNHIFc_IcaG9lfwH&ved=0CBwQygQ


1.cygwinでA−1のCode/libsvm-2.84-1のディレクトリに移動


2.ソースの変更
以下をコメントアウトした。
read_sparse.c://typedef int mwIndex;
svm_model_matlab.c://typedef int mwIndex;
svmpredict.c://typedef int mwIndex;
svmtrain.c://typedef int mwIndex;


3.svm_model_matlab.oの作成
$gcc -I/usr/include/octave-3.2.4/octave -c svm_model_matlab.c


4.octaveの起動
$ octave --braindead


5.svmpredict.mex, svmtrain.mex, read_sparse.mexの作成
>> mex --mex svmpredict.c svm.o svm_model_matlab.o
>> mex --mex svmtrain.c svm.o svm_model_matlab.o
>> mex --mex read_sparse.c



<動作確認>
1.コードに付属しているREADMEのExamplesの一部を実行
>> load heart_scale.mat
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 2');
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 99.2593% (268/270) (classification)