| 外部インタフェース/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で見ることができますが、データを操作できる方法はありません。
| 複素データの操作 | 多次元数値配列の操作 | ![]() |