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 :

Fichier générique pour différentes classes


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut Fichier générique pour différentes classes
    Bonjour à tous,

    Après avoir écrit un mex-files qui fait la simple copie d'un tableau de double, je souhaiterai le rendre générique. C'est à dire quel que soit le type en entrée de mon tableau (uint16, int16,...) mon programme fonctionne et me retourne un résultat.
    Pouvez-vous m'aider svp ?

    voici mon mex-file :
    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
    #include "mex.h"
    #include <stdio.h>
    #include <stdlib.h>
     
    #define res(i1,j1) res[(i1)+row*(j1)]
    #define x(i1, j1) x[(i1)+row*(j1)]
     
     
        /*#######################************ Programme C hysteresis***********************####################*/
    void copie(double *x,double *res, int row, int col)
    {  
            int i1,j1;
     
           for(i1=0;i1<row;i1++)
           {
             for(j1=0;j1<col;j1++)
             {
             res(i1,j1)=x(i1,j1);
             }
           }
     
    }
     
     
    /* nrhs nombre de parametre d'entre
      nlhs nombre de parametre de sortie
      prhs tableau de pointeur d'un element en entre
      plhs tableau de pointeur de sortie
    */
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    {
     
       double *a,*c; /* a  est le tableau en entre et c le tableau en sortie Matlab*/
        int row,col;
     
     
     
            /* Get inputs */ 
        row = mxGetM(prhs[0]); 
        col = mxGetN(prhs[0]);
     
       a = mxGetPr(prhs[0]); /* retourne la matrice pointée par prhs[0]*/
     
      /* Create a matrix for the return argument. */
      plhs[0] = mxCreateDoubleMatrix(row, col, mxREAL);
      c = mxGetPr(plhs[0]);
     
        /* main computation */
         copie(a,c,row,col);
     
    }

  2. #2
    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 : 53 165
    Points
    53 165
    Par défaut
    Le plus simple consiste à tester la classe du tableau d'entrée avec mxIsClass et à écrire une sous-fonction "copie#class#" par classe supportée.

    Tu utiliseras mxCreateNumericArray pour créer le tableau de sortie de la classe voulue.
    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)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Ah ok en fait j'avais l'idée de faire une seul fonction et de faire un cast du tableau en entrée est ce possible (si le tableau par exemple n'est pas de type double) ?

  4. #4
    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 : 53 165
    Points
    53 165
    Par défaut
    C'est certainement possible, mais je commencerais quand même par la méthode que je préconise.
    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)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut
    Citation Envoyé par takout Voir le message
    Ah ok en fait j'avais l'idée de faire une seul fonction et de faire un cast du tableau en entrée est ce possible (si le tableau par exemple n'est pas de type double) ?
    j'ai pas bien compris ce que tu veux faire,
    si on te donne un t'ableau d'entier par exemple tu veux ressortir un tableau d'entier ? ou un tableau de double?

    en utilisant a = mxGetPr(prhs[0]); tu retournera forcement un tableau de double
    pour retouner un t'ableau d'un autre type tu doit passer par la fonction mxSetData

    ensuite pour passer d'un type a un autre tu peux utiliser : reinterpret_cast < new_type > ( expression )

    une fasson simple sans te casser la tete serai de caster toute ton entré en double de faire tes opération sur des double et a la fin de faire le cast dans l'autre sens
    ça nécéssiterai un petit switch en entré pour savoir quel cast faire en sortie

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Ben en fait ce que je voulais faire c'est la dernière idée que tu as eu.
    Écrire une fonction qui prend en entrée des doubles. Si lors de l'utilisation de cette fonction le tableau en entrée est un int par exemple j'opère un cast.

  7. #7
    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 : 53 165
    Points
    53 165
    Par défaut
    Cette solution a pour principal désavantage de consommer et d'avoir à gérer inutilement de la mémoire.
    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)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Oui c'est vrai Dut à raison.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut
    Dut je parlais d'une solution simple à mettre en place pas optimale ^^

    sinon je viens de me souvenir d'un truc
    si tu veux juste faire une copie de la matrice donnée par ton .m pourquoi tu ne duplique pas l'entré avec mxDuplicateArray?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "mex.h"
     
     
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    {
     
     
      plhs[0] = mxDuplicateArray(prhs[0]);
     
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Je ne l'ai pas utilisé car c'étais juste un exemple pour illustrer mon problème.

Discussions similaires

  1. [Débutant] importation générique pour plusieurs classes
    Par hervane56 dans le forum C#
    Réponses: 2
    Dernier message: 03/05/2013, 13h05
  2. Objet unique pour différentes classes
    Par titibete dans le forum C++
    Réponses: 3
    Dernier message: 08/12/2010, 15h43
  3. [XML] Classe générique pour analyser toute forme de fichier XML
    Par stomerfull dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 14/01/2010, 08h26
  4. Classe générique pour simplifier l'utilisation des fichiers
    Par Oprichnik dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 10
    Dernier message: 09/08/2007, 23h15
  5. Réponses: 8
    Dernier message: 02/11/2005, 20h21

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