IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Utilisation de Mex et Lapack


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut Utilisation de Mex et Lapack
    Bonjour,

    J'ai vu qu'il était possible d'exécuter avec MatLab des fichiers mex utilisant la libraire Lapack. Un exemple est donné dans le fichier "matrixDivide.c" que l'on trouve dans les exemples Mex.
    J'ai donc tenté de reprendre ce fichier, j'ai vérifié qu'il fonctionne bien, il compile et il démarre sans soucis. J'en ai repris une bonne partie, et ai tenté de programmer mon propre programme Mex/Lapack. Et là... rien ne marche. J'ai tout tenté, j'ai fait les programmes les plus simples possibles, tous les programmes essayés ne marchent pas, avec toujours la même erreur en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "forrtl: sever (38): error during write, unit -1, file CONOUT$
    Stack trace terminated abnormally"
    Comme toujours avec Mex, je ne comprends absolument rien à l'erreur. D'après des recherches sur internet, ce serait une histoire d'incompatibilité entre Mex et une certaine fonction write. Mais pourquoi cela n'arrive que sur mes programmes ?

    Peut-être y-a-t-il une erreur grossière dans tous mes programmes, c'est possible, mais je ne vois pas où. Voilà un exemple de code Mex qui donne cet erreur :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    // En-tête de "MatrixDivide"
     
    #if !defined(_WIN32)
    #define dgesv dgesv_
    #endif
     
    #include "mex.h"
    #include "lapack.h"
     
    // Définition de la fonction mex
     
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
    	mwSignedIndex *iPivot;   /* inputs to DGESV */
    	mxArray *Awork, *mxPivot, *Bwork;
    	mwSignedIndex info, dims[2];
    	mxArray * prhsc0, * prhsc1;
    	double *A2, *B2;
    	mwSignedIndex mmw, nmw, pmw;
    	double * matInv, * vecInv, *resCube;
    	int nb_nnul,k,l;
    	prhsc0 = prhs[0];
    	prhsc1 = prhs[1];
     
    // Définition de la taille de la matrice
     
    	nb_nnul = 17;
     
    	mmw = nb_nnul+1;
    	nmw = 1;
    	pmw = nb_nnul+1;    
    	dims[0] = mmw;
    	dims[1] = pmw;
     
    // Allocation de la matrice et du vecteur, pour résoudre l'équation : 
    // matInv*X = vecInv
     
    	matInv = (double *) malloc(mmw*pmw*sizeof(double));
    	vecInv = (double *) malloc(pmw*sizeof(double));
     
    // Remplissage au hasard de la matrice et du vecteur
     
    	for (k=0;k<mmw*pmw;k++)
    		matInv[k] = k+2;
     
    	for (k=0;k<pmw;k++)
    		vecInv[k] = k*k;
     
    // Transformation de ces matrices pour que ça ressemble au fichier "MatrixDivide.c"
     
    	mxPivot = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
    	iPivot = (mwSignedIndex*)mxGetData(mxPivot);					
    	Awork = mxCreateDoubleMatrix(mmw, pmw, mxREAL);
    	A2 = mxGetPr(Awork);
    	Bwork = mxCreateDoubleMatrix(pmw, nmw, mxREAL);
    	B2 = mxGetPr(Bwork);
    	memcpy(A2, matInv, mmw*pmw*mxGetElementSize(prhsc0));
    	memcpy(B2, vecInv, pmw*nmw*mxGetElementSize(prhsc1));
     
    // Calcul de la solution de l'équation. (Et bug...)
     
    	dgesv(&mmw,&nmw,A2,&mmw,iPivot,B2,&pmw,&info);
     
    	return;
    }

    Si quelqu'un a une idée de ce qui cloche...
    Merci beaucoup !

    Gouhouf

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Alors, j'ai un élément supplémentaire !

    Sur l'exemple de MatLab, matrixDivide.c, j'ai découvert que si on le compilait comme indiqué (http://www.mathworks.com/help/techdo...br_2m24-1.html), et qu'on le lançait directement avec des matrices "divisibles", il plantait également. Donc d'une part, l'erreur ne vient peut-être pas de mon code, mais de MatLab.

    D'autre part, si on le compile, qu'on fait bugger une fois le code en déclenchant une erreur Mex (par exemple, la taille des matrices fait qu'elles ne sont pas divisibles), puis qu'on le relançait cette fois avec des matrices de la bonne taille, ça marche... Il faut donc faire tourner une fois le programme "à vide" pour que l'erreur ne se déclenche pas.

    Je ne comprends pas du tout à quoi cela peut être dû. Est-ce que quelqu'un a déjà vu une erreur de ce type ?

    Pour info, je suis sur un Windows Seven 64 bits et je tourne sous une version de MatLab 64 bits. Est-ce que le 64 bits est particulièrement instable sur MatLab ?

    Merci !

    Gouhouf

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Quelle est ta version de MATLAB ?
    Quel compilateur utilises-tu ?
    Montre nous la commande mex que tu utilises pour la compilation

    Sinon peux-tu tester le code suivant ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <string.h>
    #include "mex.h"
    #include "lapack.h"
     
    void mexFunction(int nlhs, mxArray *plhs[],
            int nrhs, const mxArray *prhs[]) {
     
        double *A, *B;
        mxArray *iPivot;
        mwSignedIndex N, NRHS, LDA, LDB, dims[2] = {0, 1}, *IPIV, INFO;
     
        A = mxGetPr(prhs[0]);
        B = mxGetPr(prhs[1]);
     
        N = (mwSignedIndex)mxGetM(prhs[0]);
        NRHS = (mwSignedIndex)mxGetN(prhs[1]);
        LDA = N;
        LDB = N;
     
        dims[0] = N;
     
        iPivot = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
        IPIV = (mwSignedIndex*)mxGetData(iPivot);
     
        /* DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) */
        dgesv(&N, &NRHS, A, &LDA, IPIV, B, &LDB, &INFO );
     
        plhs[0] = mxCreateDoubleMatrix(N, 1, mxREAL);
     
        mxSetPr(plhs[0],B);
     
    }

    Je l'ai testé sous Windows XP 32bits avec le compilateur Microsoft Visual C++ 2008 Express et la ligne de commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mex -v test.c -L"C:\MATLAB\R2009a\extern\lib\win32\microsoft" -lmwlapack -lmwblas
    Egalement testé sous Linux 32bits avec le compilateur Gcc et la ligne de commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mex -v test.c -lmwlapack -lmwblas
    Le résultat est similaire à l'opération effectuée sous MATLAB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    clc
    A = rand(5);
    B = rand(5,1);
     
    C{1} = A\B;
     
    C{2} = test(A,B);
     
    [C{1} C{2}]
    renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ans =
     
       -3.4255   -3.4255
        0.1686    0.1686
        1.5837    1.5837
        3.3184    3.3184
        0.5822    0.5822
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Utiliser les MEX sans MATLAB
    Par raillou dans le forum MATLAB
    Réponses: 1
    Dernier message: 27/02/2014, 16h18
  2. Utilisation de mex
    Par nomadstorm dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/05/2011, 12h22
  3. [MEX] Quel gain de temps en utilisant un MEX-file?
    Par Fiabulu dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/03/2010, 17h55
  4. [MEX] Modifier des Mex-Files Matlab 7 pour utilisation sur Matlab 5.3
    Par mathieu2703 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/08/2007, 12h20
  5. [MEX] [Débutant] Utiliser la fonction max dans les mex files
    Par brel380 dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/07/2007, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo