Arquivos Mex: como retornar um array matlab já alocado

Eu encontrei um problema muito complicado, que não consigo consertar facilmente. Em suma, gostaria de retornar de um arquivo mex uma matriz, que foi passada como entrada da função mex. Você poderia trivialmente fazer isso:

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

Mas isso não é o que eu preciso. Eu gostaria de obter o ponteiro bruto depargin[0], processe-o internamente e retorne um array mex criado recentemente definindo o ponteiro de dados correspondente. Curtiu isso:

#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;
}

Não funciona Eu recebo um segfault, se não imediatamente, depois de algumas chamadas. Eu acredito que nada é dito sobre tal cenáriona documentação. O único requisito é o chapéudata ponteiro foi alocado usandomxCalloc, o que obviamente tem. Portanto, eu diria que esse código é legal.

Eu preciso fazer isso, porque estou analisando uma estrutura complicada do MATLAB em minhas estruturas de dados C internas. Eu processo os dados, alguns dos dados são realocados, outros não. Eu gostaria de retornar de forma transparente a estrutura de saída, sem pensar quando eu tenho que simplesmente copiar umamxArray (primeiro trecho de código), e quando eu realmente tenho que criá-lo.

Por favor ajude!

EDITAR

Depois de olhar e discutir com o Amro, parece que até mesmo meu primeiro trecho de código não é suportado e pode causar falhas do MATLAB em certas situações, por exemplo, ao passar campos de estrutura ou elementos de célula para essa função do 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

Parece que vou ter que descer a estrada do 'MATLAB não documentado' e usarmxCreateSharedDataCopy emxUnshareArray.

questionAnswers(2)

yourAnswerToTheQuestion