Main Content

配列の受け渡し例

関数 print2darray

shrlibsample ライブラリの関数 print2darray は、2 次元配列の値を 3 つの列と可変数の行で表示します。my2d パラメーターは double の 2 次元配列です。len パラメーターは行数です。

EXPORTED_FUNCTION void print2darray(double my2d[][3],int len)
{
    int indxi,indxj;
    for(indxi=0;indxi<len;++indxi) 
    {
        for(indxj=0;indxj<3;++indxj)
        {
            mexPrintf("%10g",my2d[indxi][indxj]);
        }
        mexPrintf("\n");
    }
}

MATLAB 配列の C スタイルの次元への変換

この例では、MATLAB® 配列に列単位で保存されたデータを、「行 x 列」の形式を想定する C 関数に渡す方法を説明します。

関数 print2darray を含むライブラリを読み込みます。

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

4 行 3 列の MATLAB 配列を作成します。

m = reshape(1:12,4,3)
m = 4×3

     1     5     9
     2     6    10
     3     7    11
     4     8    12

値を表示します。最初の列は [1 2 3 4] ではなく、[1 4 7 10] になっています。

calllib('shrlibsample','print2darray',m,4)
         1         2         3
         4         5         6
         7         8         9
        10        11        12

目的の結果を得るために、m を転置します。

calllib('shrlibsample','print2darray',m',4)
         1         5         9
         2         6        10
         3         7        11
         4         8        12

関数 multDoubleArray

shrlibsample ライブラリの関数 multDoubleArray は、配列の各要素に 3 を乗算します。この関数では、単独の添字 (線形インデックス付け) を使用して入力配列内を移動します。

EXPORTED_FUNCTION void multDoubleArray(double *x,int size)
{
    /* Multiple each element of the array by 3 */
    int i;
    for (i=0;i<size;i++)
    *x++ *= 3;
}

MATLAB® 関数シグネチャは次のとおりです。

戻り値の型名前引数
doublePtrmultDoubleArray(doublePtr,
int32)

3 次元 MATLAB 配列の保持

この例では、C 関数が MATLAB® 配列の次元を変化させるやり方と、その形状を復元する方法を説明します。

ライブラリを読み込みます。

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

2×5×2 の入力配列を作成し、その次元を表示します。

vin = reshape(1:20,2,5,2);
vs = size(vin)
vs = 1×3

     2     5     2

multDoubleArray を呼び出して各要素を乗算します。出力の次元を表示します。

vout = calllib('shrlibsample','multDoubleArray',vin,20);
size(vout)
ans = 1×2

     2    10

元の形状を復元します。

vout = reshape(vout,vs);
size(vout)
ans = 1×3

     2     5     2