Возвращает двойной сложный массив в файле MEX (Matlab)

#c #c #matlab #mex

Вопрос:

У меня проблема с файлами MEX в кодировке C/C . Мне нужно вернуть двойной сложный массив в Matlab, но я не могу этого сделать и не нахожу информации об этом. Я показываю свой код с некоторыми попытками:

 double complex output[nSymb];
nlhs = 1;
plhs[0] = mxCreateDoubleMatrix(nSymb,(mwSize)nlhs,mxCOMPLEX);

// 1º option
plhs[0] = output;
// 2º option
memcpy(plhs, output, nSymb * sizeof(double complex));
// 3º option
plhs = output;
 

Заранее благодарю вас.

Комментарии:

1. Я не знаю MEX, но в C я бы ожидал std::complex<double> , что будет использоваться этот тип. Кроме того, memcpy сначала имеет аргумент назначения, а затем-источник . Название output говорит о том, что вы поменяли их местами. Кроме того, plhs[0] получает назначение дважды в вашем коде. Почему? Наконец, plhs = output; после memcpy того, как ? Это выглядит действительно запутанным.


Ответ №1:

Вы упомянули C , поэтому я показал пример копирования a std::vector<double> в MxArray объект, то же самое можно применить к массивам в стиле C:

 mxArray* CreateDoubleArray(const std::vector<double>amp; d)
{
    mxArray* m = mxCreateDoubleMatrix(d.size(), 1, mxComplexity::mxReal); // mxComplexity::mxCOMPLEX 
    double* pm = mxGetDoubles (m); // mxGetComplexDoubles
    
    for (size_t i=0; i<d.size(); i  )
    {
        pm[i] = d[i];
    }
    
    return m;
}

// ...
// Return value for the Mex:
plhs[0] = CreateDoubleArray(stdVecObj);

 

Вы можете изменить value_type вектор на std::complex и применить изменения , предложенные в комментариях, для обработки сложного типа вместо двойного. mxGetComplexDoubles возвращает MxDOUBLE_CLASS* задокументированный здесь (это просто структура с реальным и воображаемым компонентом типа mxDouble).