Mex-файлы: как вернуть уже выделенный массив matlab
Я нашел действительно сложную проблему, которую, похоже, не могу легко решить. Короче говоря, я хотел бы вернуть из mex-файла массив, который был передан в качестве ввода mex-функции. Вы могли бы тривиально сделать это:
void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
pargout[0] = pargin[0];
}
Но это не то, что мне нужно. Я хотел бы получить необработанный указатель отpargin[0]
обработайте его внутренне и верните только что созданный массив mex, установив соответствующий указатель данных. Как это:
#include
void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
mxArray *outp;
double *data;
int m, n;
/* get input array */
data = mxGetData(pargin[0]);
m = mxGetM(pargin[0]);
n = mxGetN(pargin[0]);
/* copy pointer to output array */
outp = mxCreateNumericMatrix(0,0,mxDOUBLE_CLASS,mxREAL);
mxSetM(outp, m);
mxSetN(outp, n);
mxSetData(outp, data);
/* segfaults with or without the below line */
mexMakeMemoryPersistent(data);
pargout[0] = outp;
}
Это нет работа. Я получаю segfault, если не сразу, то после нескольких звонков. Я полагаю, что ничего не сказано о таком сценариив документации, Единственное требование - этоdata
указатель был выделен с помощьюmxCalloc
, что, очевидно, имеет. Следовательно, я бы предположил, что этот код является законным.
Мне нужно сделать это, потому что я анализирую сложную структуру MATLAB в своих внутренних структурах данных C. Я обрабатываю данные, некоторые данные перераспределяются, некоторые нет. Я хотел бы прозрачно вернуть структуру вывода, не думая, когда мне нужно просто скопироватьmxArray
(первый фрагмент кода), и когда мне действительно нужно его создать.
Пожалуйста помоги!
РЕДАКТИРОВАТЬ
После дальнейшего изучения и обсуждения с Amro кажется, что даже мой первый фрагмент кода не поддерживается и может вызывать сбои MATLAB в определенных ситуациях, например, при передаче структурных полей или элементов ячеек в такую функцию mex:
>> a.field = [1 2 3];
>> b = pargin_to_pargout(a.field); % ok - works and assigns [1 2 3] to b
>> pargin_to_pargout(a.field); % bad - segfault
Кажется, мне придется спуститьсянедокументированный MATLAB ' дорога и использованиеmxCreateSharedDataCopy
а также .mxUnshareArray