Преобразуйте реальные 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 }