Archivos Mex: cómo devolver una matriz matlab ya asignada

He encontrado un problema realmente difícil, que parece que no puedo solucionar fácilmente. En resumen, me gustaría devolver de un archivo mex una matriz, que se ha pasado como entrada de función mex. Podrías hacer esto trivialmente:

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

Pero esto no es lo que necesito. Me gustaría obtener el puntero crudo depargin[0], procéselo internamente y devuelva una matriz de mex recién creada configurando el puntero de datos correspondiente. Como eso:

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

No funciona Obtengo un error de seguridad, si no inmediatamente, luego de algunas llamadas. Creo que no se dice nada sobre este escenario.en la documentacion. El único requisito es que eldata puntero se ha asignado utilizandomxCalloc, que obviamente tiene. Por lo tanto, asumo que este código es legal.

Necesito hacer esto, porque estoy analizando una estructura MATLAB complicada en mis estructuras internas de datos C. Procesé los datos, algunos de los datos se reasignaron, otros no. Me gustaría devolver de forma transparente la estructura de salida, sin pensar cuando tengo que simplemente copiar unamxArray (primer fragmento de código), y cuando tengo que crearlo.

¡Por favor ayuda!

EDITAR

Después de seguir analizando y discutiendo con Amro, parece que incluso mi primer fragmento de código no es compatible y puede causar fallos en MATLAB en ciertas situaciones, por ejemplo, al pasar campos de estructura o elementos de celda a dicha función 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 tendré que ir por el camino 'MATLAB no documentado' y usarmxCreateSharedDataCopy ymxUnshareArray.

Respuestas a la pregunta(2)

Su respuesta a la pregunta