Преобразовать вещественное mxArray к сложным, сохраняющим реальные данные
#include "matrix.h" int mxMakeArrayComplex(mxArray *pa);
Использовать mxMakeArrayComplex для преобразования вещественного mxArray к комплексу mxArray. Реальная часть обновленного массива содержит реальные данные из исходного массива.
Если pa пуст, затем функция возвращает сложный пуст mxArray.
Если pa является сложным, то функция ничего не делает.
Предположим, что приложение обрабатывает сложные данные и создает сложные mxArrays для обработки данных. Если в функцию MATLAB ® передается сложный массив, содержащий только реальные данные, то возвращаемое значение является реальным массивом. Например, вызовите MATLAB.sqrt со следующим входом.
a = complex([2,4])
a = 2.0000 + 0.0000i 4.0000 + 0.0000i
Несмотря на то, что входной аргумент является сложным, данные являются действительными, и вывод функции больше не является сложным.
a1 = sqrt(a)
a1 =
1.4142 2.0000Для поддержания сложности данных используйте mxMakeArrayComplex функция для обтекания результата. Построение файла MEX 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
}