Mex-Dateien: Rückgabe eines bereits zugewiesenen Matlab-Arrays

Ich habe ein wirklich kniffliges Problem gefunden, das ich scheinbar nicht so einfach beheben kann. Kurz gesagt, ich möchte aus einer mex-Datei ein Array zurückgeben, das als mex-Funktionseingabe übergeben wurde. Sie könnten dies trivial tun:

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

Aber das brauche ich nicht. Ich möchte den rohen Zeiger von erhaltenpargin[0]Verarbeiten Sie es intern und geben Sie ein neu erstelltes mex-Array zurück, indem Sie den entsprechenden Datenzeiger setzen. So wie das:

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

Es funktioniert nicht Ich bekomme einen Segfehler, wenn nicht sofort, dann nach ein paar Anrufen. Ich glaube, über ein solches Szenario wird nichts gesagtin der Dokumentation. Die einzige Voraussetzung ist, dassdata Zeiger wurde zugewiesen mitmxCalloc, was es offensichtlich hat. Daher würde ich annehmen, dass dieser Code legal ist.

Ich muss dies tun, weil ich eine komplizierte MATLAB-Struktur in meine internen C-Datenstrukturen einarbeite. Ich verarbeite die Daten, einige werden neu zugewiesen, andere nicht. Ich möchte die Ausgabestruktur transparent zurückgeben, ohne zu überlegen, wann ich einfach eine kopieren mussmxArray (erstes Code-Snippet), und wenn ich es tatsächlich erstellen muss.

Bitte helfen Sie!

BEARBEITEN

Nachdem ich mit Amro weiter nachgesehen und diskutiert habe, scheint es, dass sogar mein erstes Code-Snippet nicht unterstützt wird und in bestimmten Situationen Abstürze von MATLAB verursachen kann, z. B. wenn Strukturfelder oder Zellenelemente an eine solche mex-Funktion übergeben werden:

>> 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

Es sieht so aus, als müsste ich den Weg des 'undokumentierten MATLAB' beschreiten und nutzenmxCreateSharedDataCopy undmxUnshareArray.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage