Mex-файлы: как вернуть уже выделенный массив matlab

Я нашел действительно сложную проблему, которую, похоже, не могу легко решить. Короче говоря, я хотел бы вернуть из mex-файла массив, который был передан в качестве ввода mex-функции. Вы могли бы тривиально сделать это:

void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
   pargout[0] = pargin[0];
}

Но это не то, что мне нужно. Я хотел бы получить необработанный указатель отpargin[0]обработайте его внутренне и верните только что созданный массив mex, установив соответствующий указатель данных. Как это:

#include <mex.h>

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&nbsp;указатель был выделен с помощьюmxCalloc, что, очевидно, имеет. Следовательно, я бы предположил, что этот код является законным.

Мне нужно сделать это, потому что я анализирую сложную структуру MATLAB в своих внутренних структурах данных C. Я обрабатываю данные, некоторые данные перераспределяются, некоторые нет. Я хотел бы прозрачно вернуть структуру вывода, не думая, когда мне нужно просто скопироватьmxArray&nbsp;(первый фрагмент кода), и когда мне действительно нужно его создать.

Пожалуйста помоги!

РЕДАКТИРОВАТЬ

После дальнейшего изучения и обсуждения с 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&nbsp;а такжеmxUnshareArray.