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. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Par défaut probleme dans un programme sur les vecteurs
    bonjour,

    j'ai ce vecteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V=[1 1 1 2 2 3 4 1 1 5 5 6 6 7 8 2 2 9]
    je veux ce résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     R=  1  2  3   4  1   5  6  7  8  2  9 
         3  2  1   1  2   2  2  1  1  2  1
    j'ai fait un programme mais il me donne ce résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    R=    Columns 1 through 9 
     
             1     1     2     2     3     4     1     1     5
             2     3     1     2     1     1     1     2     1
     
            Columns 10 through 18
     
            5     6     6     7     8     2     2     9     9
            2     1     2     1     1     1     2     1     1
    voilà mon programme

    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
    17
    R=[];
    Nv=1;
    E=length(V);
    for i=1:E-1
        if V(i)== V(i+1)
            Uv= V(i+1);
            Nv= Nv+1;
     
        else
            Uv=V(i+1);
            Nv=1;
        end
        P=[Uv;Nv];
        R=[R P];
        i=i+1;
    end
    R=[R P]
    je n'ai pas pu trouver l'erreur veuiller m'aider

    merci

  2. #2
    Membre éprouvé
    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
    Par défaut
    Bonjour,

    pour trouver ton erreur, prend chaque pas et fait le calcul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = 1 => pour V(i)== V(i+1) on a 1==1  => P = [1;2]
    i = 2 => V(i)== V(i+1) on a  1==1  => P = [1;3]
    ce n'est déjà plus ce que tu attends...

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Par défaut
    désolé mais je n'ai pas trouvé la réponse quelqu'un peut m'aider

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.
    Une solution (pas très élégante !):
    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
    clear
    V=[1 1 1 2 2 3 4 1 1 5 5 6 6 7 8 2 2 9];
    k=1;
    R=zeros(2,length(V));
    R(2,1)=V(1); 
    for n=2:length(V);
    if V(n)==V(n-1)
        R(2,k)=R(2,k)+1;
    else
         k=k+1;
        R(2,k)=R(2,k)+1;
    end
    R(1,k)=V(n);
    end
    R=R(:,1:k)

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Citation Envoyé par phryte Voir le message
    Bonjour.
    Une solution (pas très élégante !):
    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
    clear
    V=[1 1 1 2 2 3 4 1 1 5 5 6 6 7 8 2 2 9];
    k=1;
    R=zeros(2,length(V));
    R(2,1)=V(1); 
    for n=2:length(V);
    if V(n)==V(n-1)
        R(2,k)=R(2,k)+1;
    else
         k=k+1;
        R(2,k)=R(2,k)+1;
    end
    R(1,k)=V(n);
    end
    R=R(:,1:k)
    Variante avec M matrice des états :
    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
    clear
    V=[1 1 1 2 2 3 4 1 1 5 5 6 6 7 8 2 2 9];
    k=1;m=1;
    M(1,1)=V(1);%Matrice des états
    for n=2:length(V);
    if V(n)==V(n-1)
         m=m+1;
        M(m,k)=V(n);
    else
         k=k+1;m=1;
         M(m,k)=V(n);
    end
    R(1,k)=V(n);
    R(2,k)=nnz(M(:,k));
    end
    R

  6. #6
    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
    Par défaut
    Citation Envoyé par phryte Voir le message
    Une solution (pas très élégante !):
    Car comme on l'a déjà montré sur ce forum précédemment, la solution la plus efficace passe par UNIQUE et HISTC

  7. #7
    Membre éclairé Avatar de legreg2
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 61
    Par défaut
    Je pense que tu parle de cette discussion là :
    calculer-nombre-repetition-vecteur

    Mais je vois une petite différence:
    Avec unique et histc on peut avoir le nombre de répétitions totales dans tout le vecteur. (nombre de 1 total, nombre de 2 total, etc...)

    Or, d'après ce que je vois, brf1982 veut le décompte au fur et à mesure du nombre de répétition. (nombre de chiffre jusqu'à ce que ce chiffre change : dans un vecteur, on peut avoir plusieurs séries de 1, plusieurs séries de 2...).
    J'espère que vous m'avez compris.

    J'ai essayer de triturer unique et histc dans tout les sens pour avoir le vecteur désirer, mais j'ai pas trouvé pour le moment. Pour moi, on ne peut utiliser unique dans ce cas...

  8. #8
    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
    Par défaut
    Citation Envoyé par legreg2 Voir le message
    Mais je vois une petite différence:
    Maintenant que tu le dis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    V = [1 1 1 2 2 3 4 1 1 5 5 6 6 7 8 2 2 9]
     
    d = [1 diff(V)];
    idx = d~=0;
     
    idx2 = strfind(idx,[0 1])+1;
    idx1 = strfind(idx,[1 0]);
     
    a = double(idx);
    a(idx1) = idx2-idx1;
     
    [V(idx) ; a(idx)]
    il doit certainement exister une solution un peu plus simple... le challenge est ouvert

  9. #9
    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
    Par défaut
    Euh... une version un peu moins buggée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    V = [2 2 3 4 4 4 4 4 4 4 4 1 1 5 5 6 6 7 8 2 2 9 9 9]
     
    d = [V(1) diff(V) V(end)];
    idx = d~=0;
     
    idx2 = strfind(idx,[0 1])+1;
    idx1 = strfind(idx,[1 0]);
     
    idx = idx(1:end-1);
     
    a = double(idx);
    a(idx1) = idx2-idx1;
     
    [V(idx) ; a(idx)]

  10. #10
    Membre éprouvé
    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
    Par défaut
    ça marche aussi!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    V=[ 1 1 1 2 2 3 4 1 1 5 5 6 6 7 8 2 2 9];
     
    Vinf = [Inf V Inf];
    res = find(diff(Vinf)~=0);
     
    R = [ Vinf(res(2:end)) ; diff(res) ]
     
    R =
     
         1     2     3     4     1     5     6     7     8     2     9
         3     2     1     1     2     2     2     1     1     2     1

  11. #11
    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
    Par défaut
    Citation Envoyé par Dut Voir le message
    Euh... une version un peu moins buggée
    Encore une correction... si des 0 sont présents dès le départ dans V :

    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
    V(V==0) = max(V)+1;
    d = [V(1) diff(V) V(end)];
     
    idx = d~=0;
     
    idx2 = strfind(idx,[0 1])+1;
    idx1 = strfind(idx,[1 0]);
     
    idx = idx(1:end-1);
     
    a = double(idx);
    a(idx1) = idx2-idx1;
     
    a = a(idx);
     
    [V(idx) ; a(idx)]

    @phryte : ton code ne fonctionne pas complètement si la première valeur de V est unique et si il y a des 0 dans V

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V = [1 2 0 1 1 1 1 2 2 3 4 1 1 5 5 6 6 7 0 0 0 0 8 2 2 9 9 9 9];
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         1     1     1     4     2     1     1     2     2     2     1     4     1     2     4
         0     1     0     4     2     1     1     2     2     2     1     0     1     2     4
    La première ligne correspond à ma solution, la seconde à la tienne

  12. #12
    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
    Par défaut
    Citation Envoyé par mr_langelot Voir le message
    ça marche aussi!
    Sauf me semble-t-il si il y a des 0 dans V...

    Sinon c'est en effet une solution plus simple

  13. #13
    Membre éclairé Avatar de legreg2
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 61
    Par défaut
    Elle était petite...

    En tout cas belle idée de passer par "diff" et "strfind" !

    (nombre de chiffre jusqu'à ce que ce chiffre change : dans un vecteur)
    J'étais pas loin, mais j'y ai pas du tout pensé.

  14. #14
    Membre éprouvé
    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
    Par défaut
    nan, nan, j'ai comme toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    R =
     
      Columns 1 through 14 
     
         1     2     0     1     2     3     4     1     5     6     7     0     8     2
         1     1     1     4     2     1     1     2     2     2     1     4     1     2
     
      Column 15 
     
         9
         4

  15. #15
    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
    Par défaut
    Citation Envoyé par mr_langelot Voir le message
    nan, nan, j'ai comme toi
    Ouaip... mais en bien mieux

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.

    Effectivement, pour mon premier script on doit initialiser à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    V = [1 2 0 1 1 1 1 2 2 3 4 1 1 5 5 6 6 7 0 0 0 0 8 2 2 9 9 9 9];
    k=1;
    R=zeros(2,length(V));
    R(2,1)=1; 
    R(1,1)=V(1);
    Et bravo pour vos solutions.

  17. #17
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Par défaut
    merci pour vous , ça marche

  18. #18
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.
    Bien que le script de mr_langelot soit imbattable, j'ai essayé la solution récursivité (ou réentrance). Un peu décu par la longueur ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function R=comp(V,R)
    n=1;
    if length(V) > 1
        while V(n) == V(n+1)
            n=n+1;
            if n >= length(V)
                R=[R(:,2:end) [V(n);length(V)]];
                return
            end
        end
        R=comp(V(n+1:end),[R [V(n);n]]);
    else
        R=[R(:,2:end) [V;n]];
    end
    Pour la robustesse essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V=[0]
    V=[9 9 9]
    V=[0 0 9 9 9 0 0 0 0 0 -1 -8];
    V=[]

  19. #19
    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
    Par défaut
    Voici un petit MEX à recopier dans un fichier Dutmex.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
    #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]);
     
        plhs[0] = mxCreateDoubleMatrix(2,m, 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;
     
    }

    A compiler comme ceci :

    et à utiliser comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    R = Dutmex(V);
    R = R(:,any(R));
    J'ai fait un test de rapidité entre celui de mr_langelot et mon MEX avec ce petit code pour comparer tout ça :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    function test
     
    Vi = [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];
     
    kT = 1;
     
    N = 300;
    step = 20;
    for u = 1:step:N
     
        V = repmat(Vi,1,u);
     
        t = zeros(2,10);
     
        for n=1:10
            tic
            MR = mr_langelot(V);
            t(1,n) = toc;
        end
     
        for n=1:10
            tic
            DR2 = Dutmex(V);
            DR2 = DR2(:,any(DR2));
            t(2,n) = toc;
        end
     
        T(kT,:) = mean(t,2);
        kT = kT+1;
     
    end
     
    all(all(MR==DR2))
     
    figure
    p = plot(1:step:N,T*1000);
    set(gca,'xtick',1:step:N,'xticklabel',num2str((1:step:N).'*numel(Vi)))
    xlabel('Taille du vecteur V');
    ylabel('Temps en ms')
    legend(p,{'mr\_langelot' 'Dutmex'})
    Ce qui retourne pour les temps d'exécution (en millisecondes) en fonction de la taille du vecteur V :
    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
    17
    ans =
     
        0.2303    0.1648
        0.0608    0.0388
        0.0856    0.0590
        0.1021    0.0789
        0.1270    0.0992
        0.1504    0.1180
        0.1698    0.1408
        0.1938    0.1573
        0.2252    0.1802
        0.2401    0.1970
        0.2629    0.2155
        0.2841    0.2389
        0.3075    0.2577
        0.3325    0.2764
        0.3566    0.2963
    Première colonne : mr_langelot, seconde colonne mon MEX

    Les résultats contenus dans les deux matrices sont bien identiques :
    (voir aussi le graphique attaché)
    Images attachées Images attachées  

  20. #20
    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
    Par défaut
    Il doit encore être possible d'améliorer le MEX... si des spécialistes passent par la... qu'ils n'hésitent pas à relever le challenge

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, 18h41
  2. Probleme dans un programme
    Par Sniperwolf38 dans le forum Débuter
    Réponses: 4
    Dernier message: 22/02/2008, 19h34
  3. Réponses: 9
    Dernier message: 15/10/2006, 20h37
  4. probleme dans mon programme
    Par phpaide dans le forum Langage
    Réponses: 8
    Dernier message: 05/06/2006, 12h57
  5. Réponses: 2
    Dernier message: 29/07/2005, 10h14

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