mxMakeArrayComplex (C)

Convert real mxArray to complex, preserving real data

C Syntax

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

Description

Use mxMakeArrayComplex to convert a real mxArray to a complex mxArray. The real part of the updated array contains the real data from the original array.

If pa is empty, then the function returns a complex empty mxArray.

If pa is complex, then the function does nothing.

Input Arguments

expand all

Pointer to a numeric mxArray array.

Output Arguments

expand all

Function status, returned as int. If successful, then the function returns 1.

Returns 0 if unsuccessful. The function is unsuccessful if pa is NULL, nonnumeric, or read-only.

Examples

Suppose that your application processes complex data and you create complex mxArrays to handle the data. If you pass a complex array containing only real data to a MATLAB® function, then the returned value is a real array. For example, call the MATLAB sqrt function with the following input.

a = complex([2,4])
a =

   2.0000 + 0.0000i   4.0000 + 0.0000i

Although the input argument is complex, the data is real-only, and the output of the function is no longer complex.

a1 = sqrt(a)
a1 =

    1.4142    2.0000

To maintain the complexity of the data, use the mxMakeArrayComplex function to wrap the result. To build the MEX file complexFnc.c:

mex -R2018a complexFnc.c
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[] )
{
    mxArray *rhs[1], *lhs[1];
    
    /* check for the proper number of arguments */
    if(nrhs != 1) {
        mexErrMsgIdAndTxt("MATLAB:complexFnc:checkrhs","1 input required.");
    }

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

#if MX_HAS_INTERLEAVED_COMPLEX
        
    /* get the square root */
    rhs[0] = mxDuplicateArray(prhs[0]);
    mexCallMATLAB(1, lhs, 1, rhs, "sqrt");
    if(!mxIsComplex(lhs[0])) {
        /* preserve complexity of data */
        mxMakeArrayComplex(lhs[0]);
    }

    plhs[0] = mxDuplicateArray(lhs[0]);
#endif
}

Introduced in R2018a