#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).