外部インタフェース/API | ![]() ![]() |
8ビット、16ビット、32ビットデータの操作
MEX-ファイル内で符号付きと符号なしの8ビット、16ビット、32ビットデータを作成し、操作できます。MATLAB APIは、これらのデータタイプをサポートする関数を提供しています。API関数mxCreateNumericArray
は、指定したデータサイズをもつN次の数値配列を作成します。MATLAB APIがこれらのデータタイプをどのように表わすかについての説明は、オンラインリファレンスページのmxClassID
を参照してください。
指定したデータタイプのMATLAB配列を作成すると、mxGetData
とmxGetImagData
を使ってデータにアクセスできます。これらの2つの関数は、実部と虚部のデータのポインタを出力します。MEX-ファイル内の8ビット、16ビット、32ビット精度のデータの数値演算が可能で、MATLABに結果を出力し、MATLABは正しいデータのクラスを認識します。MATLABの内部からでは8ビット、16ビット、32ビット精度の数値演算や、これらのデータ操作を行うMATLAB関数を呼び出せきませんが、MATLABプロンプトにデータを表示してMAT-ファイルに保存することはできます。
つぎの例は、符号なしの16ビット整数からなる2行2列の行列を作り、各要素を2倍し、両方の行列をMATLABに出力します。
#include <string.h> /* Needed for memcpy() */ #include "mex.h" /* * doubleelement.c - Example found in API Guide * * Constructs a 2-by-2 matrix with unsigned 16-bit integers, * doubles each element, and returns the matrix. * * This is a MEX-file for MATLAB. * Copyright (c) 1984-2000 The MathWorks, Inc. */ /* $ Revision: 1.8 $ */ #define NDIMS 2 #define TOTAL_ELEMENTS 4 /* The computational subroutine */ void dbl_elem(unsigned short *x) { unsigned short scalar=2; int i,j; for(i=0;i<2;i++) { for(j=0;j<2;j++) { *(x+i+j) = scalar * *(x+i+j); } } } /* The gataway function */ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { const int dims[]={2,2}; unsigned char *start_of_pr; unsigned short data[]={1,2,3,4}; int bytes_to_copy; /* Call the computational subroutine. */ dbl_elem(data); /* Create a 2-by-2 array of unsigned 16-bit integers. */ plhs[0] = mxCreateNumericArray(NDIMS,dims, mxUINT16_CLASS,mxREAL); /* Populate the real part of the created array. */ start_of_pr = (unsigned char *)mxGetPr(plhs[0]); bytes_to_copy = TOTAL_ELEMENTS * mxGetElementSize(plhs[0]); memcpy(start_of_pr,data,bytes_to_copy); }
doubleelement
ans = 2 6 8 4
この関数の出力は、符号なし16ビット整数からなる2行2列の行列です。この行列の内容をMATLABで見ることができますが、データを操作できる方法はありません。
![]() | 複素データの操作 | 多次元数値配列の操作 | ![]() |