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 :

probleme dans un programme sur les vecteurs


Sujet :

MATLAB

  1. #21
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    ça va être dur à battre quand même
    mais bon, je ne m'avoue pas vaincu

  2. #22
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >> clear all
    >> V = [1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9];
    >>         DR2 = Dutmex(V);
            DR2 = DR2(:,any(DR2));
    >> DR2
     
    DR2 =
     
         1     9
         1     0
    J'ai du mal compiler ta fonction mais je n'arrive pas à la faire fonctionner.
    Peux-tu essayer ton script avec ma fonction ?

    J'ai compilé avec LCC/matlab 6.1 R12
    Fichiers attachés Fichiers attachés

  3. #23
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par mr_langelot Voir le message
    J'ai du mal compiler ta fonction mais je n'arrive pas à la faire fonctionner.
    Bizarre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V = [1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9];
     
    DR2 = Dutmex(V);
    DR2 = DR2(:,any(DR2))
    me retourne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DR2 =
     
         1     0     1     0     1     2     3     0     4     1     5     6     7     8     2     9
         1     1     2     1     1     2     1     5     1     2     2     2     1     1     2     1
    Citation Envoyé par mr_langelot Voir le message
    J'ai compilé avec LCC/matlab 6.1 R12
    Y-a-t-il des warning à la compilation ?

    Vu ta version de MATLAB, tu peux essayer aussi avec le compilateur gratuit Borland C++ Compiler 5.5 ?

    Citation Envoyé par mr_langelot Voir le message
    Peux-tu essayer ton script avec ma fonction ?
    Arf... il me faut le fichier C car je suis sous Linux et même si j'étais sous Windows, les fichiers MEX compilés ont changé depuis ta version (dll => mexw32)

  4. #24
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    OK, voilà, j'ai honteusement pompé une partie de ton code

    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
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
    {
        double *V, *R;
        short k;
        int m ;
        int n, u;
     
        V = mxGetPr(prhs[0]);
     
        m = mxGetNumberOfElements(prhs[0]);
     
        plhs[0] = mxCreateDoubleMatrix(2,m, mxREAL);
        R = mxGetPr(plhs[0]);
     
        R[0] = V[0];
        n=1;
        u=0;
        while (n<m)
        {
            k = 1;
            while ((V[n]==V[n-1]) && (n<m))
            {
                ++k;
                ++n;
            }
     
            R[2*u+1] = (double)k;
            R[2*(u+1)] = V[n];
     
            ++n;
            ++u;
        }
     
        R[2*u+1] = (double)k;
     
    };

  5. #25
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Un petit soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vi = [1 0 1 1 0 1 1 9];
    MR2 = langelotmex(Vi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MR2 =
    
         1     0     1     0     1     9     0     0
         1     1     2     1     2     2     0     0
    alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vi = [1 0 1 1 0 1 1 9];
    DR2 = Dutmex(Vi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DR2 =
    
         1     0     1     0     1     9     0     0
         1     1     2     1     2     1     0     0

  6. #26
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    ah oui ^^

    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
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
    {
        double *V, *R;
        short k;
        int m ;
        int n, u;
     
        V = mxGetPr(prhs[0]);
     
        m = mxGetNumberOfElements(prhs[0]);
     
        plhs[0] = mxCreateDoubleMatrix(2,m, mxREAL);
        R = mxGetPr(plhs[0]);
     
    	R[0] = V[0];
    	n=1;
    	u=0;
    	k = 1;
    	while (n<m)
    	{
    		while ((V[n]==V[n-1]) && (n<m))
    		{
    				++k;
    				++n;
    		}
     
    		R[2*u+1] = (double)k;
            R[2*(u+1)] = V[n];
     
    		++n;
            ++u;
    		k = 1;
        }
    	R[2*u+1] = (double)k;
    };

    Je compile avec Visual C++ et ta fonction marche correctement maintenant.

  7. #27
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    A ce niveau, les différences sont infimes... il est même parfois difficile de dire lequel est vraiment le plus rapide

    A moins de tester sur une machine moins performante que la mienne
    Images attachées Images attachées  

  8. #28
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    @ mr_langelot : encore un petit problème avec ton code

    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
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
    {
        double *V, *R;
        short k;
        int m ;
        int n, u;
     
        V = mxGetPr(prhs[0]);
     
        m = mxGetNumberOfElements(prhs[0]);
     
        plhs[0] = mxCreateDoubleMatrix(2,m, mxREAL);
        R = mxGetPr(plhs[0]);
     
        R[0] = V[0];
        n=1;
        u=0;
        k = 1;
        while (n<m)
        {
            while ((V[n]==V[n-1]) && (n<m))
            {
                ++k;
                ++n;
            }
     
            R[2*u+1] = (double)k;
            R[2*(u+1)] = V[n];
     
            ++n;
            ++u;
            k = 1;
        }
        R[2*u+1] = (double)k;
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vi = [1 0 1 1 0 1 2 9 9 9];
    MR2 = langelotmex(Vi);
    MR2 = MR2(:,any(MR2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MR2 =
    
         1     0     1     0     1     2     9     0
         1     1     2     1     1     1     3     1

  9. #29
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Et comme on arrête pas le progrès

    Je vous présente Dutmex2.c

    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
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
        double *V, *R;
        int k;
        mwSize m ;
        mwIndex n, u;
     
        V = mxGetPr(prhs[0]);
     
        m = mxGetNumberOfElements(prhs[0]);
     
        k = 1;
     
        for (n=1;n<m;n++)
            if (V[n]!=V[n-1])
                k = k++;
     
        plhs[0] = mxCreateDoubleMatrix(2,k, mxREAL);
        R = mxGetPr(plhs[0]);
     
        R[0] = V[0];
        k = 1;
        u = 0;
     
        for (n=1;n<m;n++)
        {
     
            if (V[n]==V[n-1])
                k = k++;
            else
            {
                R[2*u+1] = (double)k;
                R[2*(u+1)] = V[n];
                u = u++;
                k = 1;
     
            }
     
        }
     
        R[2*u+1] = (double)k;
     
    }

    Plus besoin de supprimer certaines colonnes de R à la sortie du MEX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    V = [1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9 9 9];
    R = Dutmex2(V)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    R =
     
         1     0     1     0     1     2     3     0     4     1     5     6     7     8     2     9
         1     1     2     1     1     2     1     5     1     2     2     2     1     1     2     3
    Les différents temps de comparaison entre les codes :

    Code : 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
     
        0.1090    0.0627    0.0588    0.0451
        0.1470    0.0943    0.0864    0.0555
        0.1164    0.0805    0.0771    0.0442
        0.1410    0.1031    0.1001    0.0524
        0.1667    0.1223    0.1206    0.0608
        0.1870    0.1443    0.1400    0.0695
        0.2122    0.1626    0.1625    0.0768
        0.2379    0.1842    0.1822    0.0867
        0.2618    0.2091    0.2027    0.0869
        0.2837    0.2267    0.2256    0.1040
        0.3083    0.2487    0.2513    0.1089
        0.3335    0.2694    0.2657    0.1122
        0.3574    0.2926    0.2862    0.1251
        0.3793    0.3114    0.3117    0.1382
        0.4020    0.3319    0.3313    0.1464
    Images attachées Images attachées  

  10. #30
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Mais où s'arrêteront-ils ?

    Dutmex3.c :
    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
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
        double *V, *R;
        int k;
        mwSize m ;
        mwIndex n, u;
     
        V = mxGetPr(prhs[0]);
     
        m = mxGetNumberOfElements(prhs[0]);
     
        k = 1;
     
        for (n=1;n<m;n++)
            if (V[n]!=V[n-1])
                k = k++;
     
        plhs[0] = mxCreateDoubleMatrix(2,k, mxREAL);
        R = mxGetPr(plhs[0]);
     
        R[0] = V[0];
        k = 0;
        u = 0;
     
        for (n=1;n<m;n++)
        {
            k = k++;
            if (V[n]!=V[n-1])
            {
                R[2*u+1] = (double)k;
                R[2*(u+1)] = V[n];
                u = u++;
                k = 0;            
            }        
     
        }
     
        R[2*u+1] = (double)k+1;
     
    }

    La condition est allégée dans la seconde boucle FOR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    V = [1 1 1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9 9 9];
    R = Dutmex3(V)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    R =
     
         1     0     1     0     1     2     3     0     4     1     5     6     7     8     2     9
         3     1     2     1     1     2     1     5     1     2     2     2     1     1     2     3
    => c'est encore plus rapide
    Images attachées Images attachées  

  11. #31
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    Bon, j'ai essayé d'optimiser tout ce que j'ai pu mais je crois que là...

    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
    #include "mex.h"
    #include "string.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
        double *V, *res;
        register unsigned int k;
        mwSize m ;
        mwIndex n, u;
     
        V = mxGetPr(prhs[0]);
        m = mxGetNumberOfElements(prhs[0]);
     
        res = malloc(2*m*sizeof(double));
     
        /*up = 2 * (m-u) - 1;*/
        u = 2 * m;
        for (n=m;n--;)
        {
            k = 1;
            while ((V[n]==V[n-1]) &&  n)
            {
                ++k;
                --n;
            }
     
            res[--u] = (double)k;
            res[--u] = V[n];
        }
     
        plhs[0] = mxCreateDoubleMatrix(2,(2*m-u)/2, mxREAL);
     
        memcpy(mxGetPr(plhs[0]), &res[u], ((2*m-u))*sizeof(double));
        free(res);
     
    }


  12. #32
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    J'ai dû ajouter la ligne suivante au début de ton code :


    Pour les résultats... je crois qu'on a atteint nos limites...
    Images attachées Images attachées  

  13. #33
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    Bizarre pour le header à ajouter mais OK,

    et effectivement, je crois qu'on a épuisé le sujet

  14. #34
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par mr_langelot Voir le message
    Bizarre pour le header à ajouter mais OK,
    ça vient probablement de mon compilateur : gcc 4.2.4 (Linux)


    Maintenant, reste plus qu'à savoir à quoi ce code peut bien servir...
    Je vois mal dans quel domaine cela peut être utile (en traitement du signal ?)

  15. #35
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    c'est quand même surprenant les différences entre les compilateurs C.
    Avec LCC de matlab, je ne pouvais pas utiliser parce que ça faisait n'importe quoi!

    Pour l'utilité, ça fera sûrement le bonheur d'étudiant de passage qui ne savent pas comment faire leur TP d'informatique ^^

Discussions similaires

  1. algorithme sur les vecteurs
    Par alouha dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 21/04/2008, 19h41
  2. Probleme dans un programme
    Par Sniperwolf38 dans le forum Débuter
    Réponses: 4
    Dernier message: 22/02/2008, 20h34
  3. Réponses: 9
    Dernier message: 15/10/2006, 21h37
  4. probleme dans mon programme
    Par phpaide dans le forum Langage
    Réponses: 8
    Dernier message: 05/06/2006, 13h57
  5. Réponses: 2
    Dernier message: 29/07/2005, 11h14

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