mxMakeArrayReal (C)

Преобразуйте комплексный mxArray в действительные, сохраняющие действительные данные

Синтаксис C

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

Описание

Используйте mxMakeArrayReal, чтобы преобразовать комплексный mxArray в действительный mxArray. Массив содержит данные из действительной части исходного массива. Если исходный mxArray действителен, то функция ничего не делает.

Входные параметры

развернуть все

Указатель на числовой массив mxArray.

Выходные аргументы

развернуть все

Функциональное состояние, возвращенное как int. Если успешный, то функция возвращает 1.

Возвращает 0, если неудачный. Функция неудачна, если pa является NULL, нечисловой, или только для чтения.

Примеры

Предположим, что ваше приложение решает, что вещественные числа являются единственным значимым результатом. Если комплексные результаты происходят из-за шума в данных, то программа пропускает небольшие мнимые части. Однако, если мнимая часть превышает порог, то программа выдает ошибку.

В следующем примере 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