Main Content

スタンドアロン プログラムによる外部データの MAT ファイル形式へのコピー

matimport.c 例の概要

このトピックでは、外部ソースのデータを MAT ファイルにコピーするスタンドアロン プログラム、matimport の作成方法について説明します。データ形式はカスタムです。つまり、MATLAB® でサポートされているファイル形式ではありません。

matimport.c の例:

  • 外部データを読み取る変数を作成します。

  • データを mxArray 変数にコピーします。

  • mxArray に変数名を代入します。これらの変数名は MATLAB ワークスペースで使用します。

  • mxArray 変数および関連する変数の名前を MAT ファイルに書き込みます。

MATLAB 内のデータを使用するには、以下を実行します。

  • スタンドアロン プログラム matimport をビルドします。

  • matimport を実行して、MAT ファイル matimport.mat を作成します。

  • MATLAB を開きます。

  • ワークスペース変数の保存と読み込みに記載されている手法の 1 つを使用します。

以降のトピックではこれらの手順について詳しく説明します。コードを表示するには、MATLAB エディターでファイルを開きます。トピック内の C ステートメントはコード スニペットで、タスクを示しています。トピックのステートメントは、ソース ファイル内で必ずしも連続してはいません。

外部データの変数の宣言

外部データ値には、文字列と double 型の配列の 2 つがあります。次の表は、この例における変数の関係を示しています。

外部データ外部データを読み取る変数mxArray 変数MATLAB 変数名
double 型の配列extDatapVarNuminputArray
文字列extStringpVarChartitleString

次のステートメントは、変数 extStringextData の型とサイズを宣言します。

#define BUFSIZE 256
char extString[BUFSIZE];
double extData[9];

これらの変数を使用して、製品で使用可能なファイルやサブルーチンから値を読み取ります。この例では、初期化を使用して外部データを作成します。

const char *extString = "Data from External Device";
double extData[9] = { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 };

mxArray 変数の作成

MAT ファイル API の関数は、mxArray 型のポインターを使用して MATLAB データを参照します。次のステートメントは、任意のサイズまたは型の配列へのポインターとして pVarNum および pVarChar を宣言します。

/*Pointer to the mxArray to read variable extData */
mxArray *pVarNum;
/*Pointer to the mxArray to read variable extString */
mxArray *pVarChar;

適切なサイズおよび型の変数を作成するには、MX 行列ライブラリから関数 mxCreate* のいずれかを選択します。

extData のサイズは 9 です。この例では、この値が 33 列の行列にコピーされます。関数 mxCreateDoubleMatrix を使用して、0 に初期化される、2 次元、倍精度、浮動小数点の mxArray を作成します。

pVarNum = mxCreateDoubleMatrix(3,3,mxREAL);

関数 mxCreateString を使用して、extString の変数 mxArray を作成します。

pVarChar = mxCreateString(extString);

MATLAB 変数名の作成

matimport.c を使用して、変数名 inputArray および titleStringmxArray データに割り当てます。これらの名前は MATLAB ワークスペースで使用します。詳細については、MAT ファイルの内容の表示を参照してください。

const char *myDouble = "inputArray";
const char *myString = "titleString";

mxArray データへの外部データの読み取り

外部ソースのデータを各 mxArray にコピーします。

関数 C memcpy はメモリ ブロックをコピーします。この関数には、変数 extData および pVarNum へのポインターが必要です。extData へのポインターは (void *)extData です。pVarNum へのポインターを取得するには、行列 API の関数 mxGet* のいずれかを使用します。データには double 型の実数値のみが含まれているので、この例では関数 mxGetPr を使用します。

memcpy((void *)(mxGetPr(pVarNum)), (void *)extData, sizeof(extData));

次のステートメントは、extString の内容を使用して変数 pVarChar を初期化します。

pVarChar = mxCreateString(extString);

これで、変数 pVarNumpVarChar に外部データが含まれました。

MAT ファイルの作成とオープン

関数 matOpen を使用して、MATFile 型のファイルへのハンドルを作成します。次のステートメントでは、ファイル ポインター pmat を作成し、ファイルに matimport.mat という名前を付け、開いて次のように記述します。

	MATFile *pmat;
	const char *myFile = "matimport.mat";
	pmat = matOpen(myFile, "w");

ファイルへの mxArray データの書き込み

関数 matPutVariable を使用して、mxArray と変数名をファイルに書き込みます。

	status = matPutVariable(pmat, myDouble, pVarNum);
	status = matPutVariable(pmat, myString, pVarChar);

クリーン アップ

ファイルを閉じるには、次を実行します。

matClose(pmat);

メモリを解放するには、次を実行します。

mxDestroyArray(pVarNum);
mxDestroyArray(pVarChar);

アプリケーションのビルド

アプリケーションをビルドするには、-client engine オプションを指定して mex 関数を使用します。

copyfile(fullfile(matlabroot,'extern','examples','eng_mat','matimport.c'),'.','f')
mex -v -client engine matimport.c

MAT ファイルの作成

matimport を実行して、ファイル matimport.mat を作成します。システム コマンド プロンプトからプログラムを呼び出すか、または MATLAB コマンド プロンプトで以下を入力します。

!matimport

MATLAB へのデータのインポート

matimport.mat ファイルは、互換性のある MATLAB バージョンで読み取り可能です。MATLAB を起動し、load コマンドを使用して、データをワークスペースにインポートします。

load matimport.mat

変数を表示するには、以下を入力します。

whos
  Name             Size            Bytes  Class

  inputArray       3x3                72  double
  titleString      1x43               86  char  

関連するトピック