MATLABは無線系では強力なツールです。 ソフトウェア無線を扱っているときにMATLABのファイル形式MAT FileをC言語やC++で扱いたい時があると思います。 そんな時に使えるのがmatio (MAT FILE I/O Library)です。 インストール †cygwin上でのインストール方法です。 ./configureしてmake; make installするだけです。 $ ./configure $ make $ make install インストールが成功するとcygwinだと /usr/local/lib/libmatio.a /usr/local/lib/libmatio.la /usr/local/lib/pkgconfig /usr/local/lib/pkgconfig/matio.pc /usr/local/include/matio.h /usr/local/include/matio_pubconf.h が生成されます。 matioを使ったファイルのコンパイル方法 †ライブラリのディレクトリに/usr/local/libを追加しつつmatio、zlib、hdf5をリンクするだけです。場合によってはm (math library)が必要です。例えばopen_example.cppをコンパイルする場合は g++ open_example.cpp -L/usr/local/lib -lmatio -lz -lhdf5 でコンパイルできます。 ファイルを開いて閉じるサンプルコード †ソースコード †#include <stdlib.h> #include <stdio.h> #include <matio.h> int main() { mat_t *matfp; matfp = Mat_Open("141216001.mat", MAT_ACC_RDONLY); if(matfp == NULL){ perror("Mat_Open"); exit(-1); } Mat_Close(matfp); } 141216001.matという名前のMATファイルを読み込み専用で開いて閉じるというソースコードです。 出力結果 †何も出力されません。 記録されている変数の名前を出力するプログラム †ソースコード †#include <stdlib.h> #include <stdio.h> #include <matio.h> int main() { mat_t *matfp; matvar_t *matvar; matfp = Mat_Open("141216001.mat", MAT_ACC_RDONLY); while((matvar = Mat_VarReadNextInfo(matfp)) != NULL){ printf("%s\n", matvar->name); Mat_VarFree(matvar); matvar = NULL; } Mat_Close(matfp); } 出力結果 †例えばch1という変数と、ch2という変数の2つが記録されていた場合、 $ ./a ch1 ch2 が出力されます。 変数をMATIOで出力してみる †ソースコード †#include <stdlib.h> #include <stdio.h> #include <matio.h> int main() { mat_t *matfp; matvar_t *matvar; matfp = Mat_Open("141216001.mat", MAT_ACC_RDONLY); matvar = Mat_VarRead(matfp,"ch1"); Mat_VarPrint(matvar, 1); Mat_VarFree(matvar); Mat_Close(matfp); } 出力結果 †$ ./a Name: ch1 Rank: 2 Dimensions: 1 x 1000000 Class Type: Double Precision Array Data Type: IEEE 754 double-precision { -0.0128 0.0104 0.004 -0.024 -0.0128 0.0152 0.0176 0.0096 0.0032 -0.0072 -0.016 -0.0048 0.0096 0.0072 -0.0024 ... } MATファイルの配列をC言語もしくはC++の配列として扱う †ソースコード †#include <stdlib.h> #include <stdio.h> #include <matio.h> int main() { mat_t *matfp; matvar_t *matvar; matfp = Mat_Open("141216001.mat", MAT_ACC_RDONLY); matvar = Mat_VarRead(matfp,"ch1"); printf("0: %d\n", matvar->dims[0]); printf("1: %d\n", matvar->dims[1]); double *pd = (double*) matvar->data; for(int i = 0; i < matvar->dims[1]; i++){ printf("%f\n", pd[i]); } Mat_VarFree(matvar); Mat_Close(matfp); } 出力結果 †0: 1 1: 1000000 -0.012800 0.010400 0.004000 -0.024000 -0.012800 0.015200 0.017600 0.009600 matvarのclass_typeが「Class Type: Double Precision Array」(ダブル型の配列)なのでそのままmatvar->dataをダブル型の配列にキャストして入れるだけで触れます。 |