2011-09-11 3 views
4

J'ai un code Matlab qui appelle un MEX généré à partir du code C++. Le code C++ nécessite une allocation de mémoire importante et des calculs lors de l'initialisation. À l'aide d'un pointeur statique, l'initialisation est effectuée uniquement lors du premier appel et le pointeur est lu à partir des appels suivants. Tout a bien fonctionné jusqu'à ce que ce code Matlab ait été compilé avec Matlab Compiler. Maintenant, les appels suivants au MEX (qui se passe maintenant dans le code compilé par matlab) finissent par s'écraser car le pointeur statique fait apparemment référence à une mémoire invalide.Comment éviter l'initialisation en double de .mex (code compilé matlab)?

Que peut-on faire pour éviter l'initialisation en double dans ce cas?

Merci, Leo

+1

Avez-vous déjà trouvé votre problème? Si vous n'avez pas, pouvez-vous sortir un petit exemple de code qui duplique votre problème? – jmlopez

+0

question connexe: [interface MATLAB MEX à un objet de classe avec plusieurs fonctions] (http://stackoverflow.com/questions/1182183/matlab-mex-interface-to-a-class-object-with-multiple-functions) (consultez la réponse acceptée) – Amro

Répondre

1

excellente question. Vous pourriez avoir à décomposer ceci en deux fonctions mex différentes, l'une qui calcule l'initialisation et retourne ses résultats, et l'autre qui fait votre fonction.

[heavyCompResults,otherHeavyResults] = initComputation(initParams); 

Puis:

performComputation(compParams,heavyCompResults,otherHeavyResults); 

Alternativement, vous pouvez écrire des choses dans un fichier au lieu de passer à travers Matlab.

initComputation(initParams,initResultsFname); %writes initResultsFname 

Puis:

performComputation(compParams,initResultsFname); %reads initResultsFname 

Une alternative plus:

Faites votre code dans une DLL et utiliser le loadLibrary function in Matlab. De cette façon, lorsque vous créez le statique, il devrait probablement rester en mémoire entre les appels. Mais je n'ai pas vérifié cela.

0

Je ne sais pas si vous avez déjà résolu votre problème ou non, mais voici quelques informations pertinentes qui m'ont aidé.

Cela semble similaire à un problème que j'avais. Lors de la compilation d'une nouvelle version de la même fonction (où l'on avait des problèmes d'accès à la mémoire), j'ai découvert que l'ancienne version de la fonction mex ne quittait pas réellement la mémoire. J'ai essayé une multitude de choses, y compris (prétendument) effacer la fonction mex de la mémoire matlab en utilisant mex-nom de fichier. Le seul moyen efficace d'empêcher l'accès répété à la même fonction mex défectueuse consistait à redémarrer matlab. Cela a résolu le problème de mémoire à chaque fois. Bien que ce cas et cette solution ne correspondent pas exactement à votre problème, je vous suggère d'essayer de redémarrer matlab. J'espère que cela pourra aider.

Questions connexes