mxSetFieldByNumber (C および Fortran)
インデックスおよびフィールド番号を指定して、構造体配列にフィールド値を設定
C 構文
#include "matrix.h" void mxSetFieldByNumber(mxArray *pm, mwIndex index, int fieldnumber, mxArray *pvalue);
Fortran 構文
#include "fintrf.h" subroutine mxSetFieldByNumber(pm, index, fieldnumber, pvalue) mwPointer pm, pvalue mwIndex index integer*4 fieldnumber
引数
pm構造体
mxArrayへのポインター。mxIsStructを呼び出して、pmが構造体mxArrayを指しているかどうかを判断します。index目的の要素のインデックス。
C では、
mxArrayの最初の要素は0のindexをもっています。最後の要素のindexはN-1です。ここで、Nは配列内の要素の数です。Fortran では、mxArrayの最初の要素のindexは1です。最後の要素のindexはNです。ここで、Nは配列内の要素の数です。インデックスの計算の詳細については、
mxCalcSingleSubscriptを参照してください。fieldnumber構造体内のフィールドの位置。フィールドが構造体内に存在しなければなりません。
C では、各要素内の最初のフィールドは
0のfieldnumberをもっています。最後のフィールドのfieldnumberはN-1です。ここで、Nはフィールドの数です。Fortran では、各要素内の最初のフィールドは
1のfieldnumberをもっています。最後のフィールドのfieldnumberはNです。ここで、Nはフィールドの数です。pvalue割り当てるデータを含む
mxArrayへのポインター。
説明
mxSetFieldByNumber を使用して、pvalue の内容を要素 fieldnumber の index で指定されたフィールドに割り当てます。mxSetFieldByNumber は mxSetField と似ていますが、この関数は、名前ではなく位置番号によってフィールドを識別します。
fieldnumber の内容を置換する場合は、まず既存のデータのメモリを解放します。関数 mxGetFieldByNumber を使用してフィールドへのポインターを取得し、ポインターにある mxDestroyArray を呼び出した後、mxSetFieldByNumber を呼び出して新しい値を割り当てます。
構造体内の複数のフィールドや、mxArray 内の複数の要素に pvalue を割り当てることはできません。pvalue の内容を複数のフィールドに割り当てる場合は、関数 mxDuplicateArray を使用してデータをコピーしてから、各コピーに対して mxSetFieldByNumber を呼び出します。
この関数を使用して作成した構造体のメモリを解放するには、構造体配列のみに対して mxDestroyArray を呼び出します。pvalue が指している配列に対しては mxDestroyArray を呼び出さないでください。これを行うと、MATLAB® が同じメモリを 2 回解放しようとするため、メモリが破損する可能性があります。
メモ
MEX ファイルへの入力値は、読み取り専用の定数 mxArray です。入力値を変更しないでください。関数 mxSetCell* または関数 mxSetField* を使用して MATLAB 引数のセルまたはフィールドを変更すると、予期しない結果が生じます。
代替方法
C 言語
C では、以下を呼び出すことは、
mxSetField(pa, index, "field_name", new_value_pa);
以下を呼び出すことと等価です。
field_num = mxGetFieldNumber(pa, "field_name"); mxSetFieldByNumber(pa, index, field_num, new_value_pa);
Fortran 言語
Fortan では、以下を呼び出すことは、
mxSetField(pm, index, 'fieldname', newvalue)
以下を呼び出すことと等価です。
fieldnum = mxGetFieldNumber(pm, 'fieldname') mxSetFieldByNumber(pm, index, fieldnum, newvalue)
例
例を開くには、次のように入力します。
edit([fullfile(matlabroot,"extern","examples","mx","filename")]);
ここで filename は、次のようになります。
参考
mxCreateStructArray, mxCreateStructMatrix, mxGetFieldByNumber, mxGetFieldNameByNumber, mxGetFieldNumber, mxGetNumberOfFields, mxIsStruct, mxSetField, mxDestroyArray, mxCalcSingleSubscript
バージョン履歴
R2006a より前に導入