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をダブル型の配列にキャストして入れるだけで触れます。


  添付編集
Last-modified: 2015-06-29 (月) 23:30:40 (726d)