Main Content

mxMakeArrayReal (C)

実数データを保持したまま、複素数 mxArray を実数に変換する

C 構文

#include "matrix.h"
int mxMakeArrayReal(mxArray *pa);

説明

mxMakeArrayReal を使用して複素数 mxArray を実数 mxArray に変換します。この配列には、元の配列の実数部からのデータが含まれます。元の mxArray が実数の場合、関数は何も行いません。

入力引数

すべて展開する

数値 mxArray 配列へのポインター

出力引数

すべて展開する

関数のステータス。int として返されます。成功した場合、関数は 1 を返します。

失敗した場合、0 を返します。paNULL、非数値、または読み取り専用の場合、関数は失敗します。

アプリケーションで、実数のみが意味のある結果であると判断されたとします。データ内のノイズにより複素数の結果が発生すると、小さい虚数部が省略されます。ただし、虚数部がしきい値を超えると、エラーがスローされます。

次の例の dropComplexIfUnderThreshold.c では、しきい値の制限が .2 に設定されています。

#include "mex.h"

/* dropComplexIfUnderThreshold converts input to a real double scalar 
 * with eihter no imaginary data or imaginary data less than
 * the value of LIMIT.
 *
 * Use this function for data with imaginary values less than some LIMIT 
 * that can be dropped, and then revert the results to a real array. 
 *
 * Usage: B = dropComplexIfUnderThreshold(A); 
 * Where:
 *    A is a mxDOUBLE_CLASS scalar complex or real.
 *    B is a real scalar which is a copy of the real value of A.
 *
 * Errors if:
 *    nlhs != 1
 *    nrhs != 1
 *    prhs[0] is not a mxDOUBLE_CLASS scalar
 *    imaginary data value is equal or greater than LIMIT
 *
 * Build:
 *   mex -R2018a dropComplexIfUnderThreshold.c     - interleaved complex API
 *   mex [-R2017b] dropComplexIfUnderThreshold.c   - separate complex API
 *
 * Run:
 * >> dropComplexIfUnderThreshold(3)           
 * ans = 3
 *
 * >> dropComplexIfUnderThreshold(complex(3,.1)) 
 * ans = 3
 *
 * >> dropComplexIfUnderThreshold(complex(1,.2)) 
 * Error using dropComplexIfUnderThreshold
 * Data error.
 * >>
 */
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[] )
{
#define LIMIT .2
    
    /* check for the proper number of arguments */
    if(nrhs != 1) {
        mexErrMsgIdAndTxt("MATLAB:dropComplexIfUnderThreshold:checkrhs","1 input required.");
    }

    if(nlhs > 1) {
        mexErrMsgIdAndTxt("MATLAB:dropComplexIfUnderThreshold:checklhs","Too many output arguments.");
    }

    if( !(mxIsDouble(prhs[0]) && mxIsScalar(prhs[0])) ) {
        mexErrMsgIdAndTxt("MATLAB:dropComplexIfUnderThreshold:checkdouble","rhs[0] must be double scalar.");
    }
    
    plhs[0] = mxDuplicateArray(prhs[0]);
    
    if(mxIsComplex(prhs[0])) {
#if MX_HAS_INTERLEAVED_COMPLEX
        mxComplexDouble *dt = mxGetComplexDoubles(prhs[0]);

        /* test imaginary data for significance */
        if( dt[0].imag < LIMIT) {
            mxMakeArrayReal(plhs[0]);
        }
        else {
            mexErrMsgIdAndTxt("MATLAB:dropComplexIfUnderThreshold:outOfBounds","Data error.");
        }
#else
        mxDouble *dt = mxGetPi(plhs[0]);

        /* test imaginary data for significance */
        if (dt[0] < LIMIT) {
            mxFree(mxGetPi(plhs[0]));
            mxSetPi(plhs[0], 0);
        } else {
            mexErrMsgIdAndTxt("MATLAB:dropComplexIfUnderThreshold:outOfBounds","Data error.");
        }
#endif
    }
}

MEX ファイルをビルドするには、以下を入力します。

mex -R2018a dropComplexIfUnderThreshold.c

関数をテストするには、以下を入力します。

dropComplexIfUnderThreshold(3)
ans = 3
dropComplexIfUnderThreshold(complex(3,.1))
ans = 3
dropComplexIfUnderThreshold(complex(1,.2))
Error using dropComplexIfUnderThreshold
Data error.

バージョン履歴

R2018a で導入