Преобразуйте реальные mxArray к комплексным, сохраняющим реальные данные
#include "matrix.h" int mxMakeArrayComplex(mxArray *pa);
Использовать mxMakeArrayComplex для преобразования реального mxArray в сложный mxArray. Действительная часть обновленного массива содержит действительные данные из исходного массива.
Если pa пуст, тогда функция возвращает сложное пустое mxArray.
Если pa комплексная, тогда функция ничего не делает.
Предположим, что ваше приложение обрабатывает комплексные данные, и вы создаете сложные mxArrays для обработки данных. Если вы передаете комплексный массив, содержащий только вещественные данные, в MATLAB® function, тогда возвращенное значение является вещественным массивом. Для примера вызовите 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
}