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 :

faire le travail de la fonction hist


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut faire le travail de la fonction hist
    Bonjour tous,

    j'ai fais un petit bout de code qui permet de générer des nombres aléatoirement et classer ensuite ces nombres dans 50 classes différentes.

    j'ai utilisé pour ceci la commande "hist" de matlab et ça marche très bien (voir premier graphique).

    le soucis et que j'essai à présent de faire ceci manuellement (car j'ai besoin de réutiliser ensuite certaines choses) mais je ne suis pas arrivé à faire un programme qui fait comme la fonction "hist" de matlab...

    pourtant ma tentative me parait assez cohérente ??

    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
    mu=16.3; sigma=0.315;
    nbDePoints=10000;
    nbDeclasses=50;
    %pour ne pas avoir loi centrée réduite
    X=mu+sigma*randn(nbDePoints,1);
    nb=hist(X,nbDeclasses);
    figure (1)
    subplot(2,1,1); hist(X,nbDeclasses)
    %j'effectue mes différentes classes réparties uniformement
    tailleClasse=(X(end)-X(1))/nbDeclasses;
    classes=zeros(1,nbDeclasses);
    for i=1:1:nbDeclasses
        classes(i)=X(1)+tailleClasse*i;
    end
    %maintenant je voudrais répartir mes 10000 points dans ces "n" classes
    nbAssocieClasses=zeros(1,nbDeclasses);
    for i=1:1:length(X)
        if(X(i)<classes(1))
            nbAssocieClasses(1)=nbAssocieClasses(1)+1;
        else
            for j=2:1:nbDeclasses
                if(X(i)<classes(j) && X(i)>classes(j-1))
                    nbAssocieClasses(j)=nbAssocieClasses(j)+1;
                end
            end
        end
    end
    figure (1)
    subplot(2,1,2); bar(classes,nbAssocieClasses)
    pouvez vous me dire si vous voyez l'erreur dans mon code ? qu'es ce qui fait que je n'obtient pas la même chose qu'avec "hist" ?

    je vous remercie d'avance pour votre aide

    A+

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une partie à revoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tailleClasse=(X(end)-X(1))/nbDeclasses;
    classes=zeros(1,nbDeclasses);
    for i=1:1:nbDeclasses
        classes(i)=X(1)+tailleClasse*i;
    end
    Pour ce qui est de la création de classes : tu as pensé à la fonction linspace ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    salut Jérôme et merci de prendre le temps de m'aider

    je ne comprend pas ce qui cloche dans cette partie de code...

    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tailleClasse=(X(end)-X(1))/nbDeclasses;
    ici je prends la taille totale de mon domaine et je la divise en "n" part. Ainsi, je saurais pour chacune de mes classes la taille qu'elle doivent avoir.

    la première classe va du "X" le plus petit "-> "X(1)" de la distribution à "X(1)+tailleClasse", la deuxieme classe va donc de "X(1)+tailleClasse" à "X(1)+tailleClasse+tailleClasse"

    => en effet, avec linspace j'aurais pu faire quelque chose d'équivalent.

    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    classes=zeros(1,nbDeclasses);
    for i=1:1:nbDeclasses
        classes(i)=X(1)+tailleClasse*i;
    end
    ici je donne à chaque classe sa limite supérieur. La classe

    Citation Envoyé par Winjerome Voir le message
    Pour ce qui est de la création de classes : tu as pensé à la fonction linspace ?
    en effet j'aurais pu faire avec linspace mais sur le coup je ne voyais pas trop comment m'arranger ensuite avec le vecteur obtenu et du coup je l'ai fais à la main

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    je ne comprend pas ce qui cloche dans cette partie de code...
    J'en conclus que tu as bien regardé les valeurs de X(1), X(end) et tailleClasse
    Citation Envoyé par 21did21 Voir le message
    ici je prends la taille totale de mon domaine
    pas vraiment non, que contient X déjà ?
    Citation Envoyé par 21did21 Voir le message
    en effet j'aurais pu faire avec linspace mais sur le coup je ne voyais pas trop comment m'arranger ensuite avec le vecteur obtenu et du coup je l'ai fais à la main
    Le vecteur obtenu aurait été le même

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    d'accord je comprends ce que tu veux me dire :
    => il faut que je classe les données dans l'ordre avant de faire X(end)-X(1)
    et effectivement en changeant ""juste ça"", ça fonctionne nikel !
    => merci beaucoup Jerome



    (il semble y avoir quand même un petit décalage mais rien de bien méchant...)

    => si je fais je ne retrouve pas mes 10000 initiaux mais 9999... je ne sais pas où est passé le dernier (ou le premier)

    => si je fais la moyenne de mes X avec :
    je ne retrouve pas mes 16.3 mais plutôt 16.3003 ... rien de bien méchant mais j'aimerai quand même bien savoir d'où sa vient...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    => au fait j'ai une autre question :

    savez vous comment passer d'une loi normale de moyenne A et d'écart type B à une loi log normale de même moyenne et de même écart type ?

    moi j'ai fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X=log(mu)+sigma*randn(10000,1);
    X_LogN=exp(X);
    car comme indiqué sur wikipedia :
    http://fr.wikipedia.org/wiki/Loi_log-normale

    X_LogN suit une loi log normale si X suit une soit normale.

    => le problème est que j'ai copier le code de tout à l'heure en dessous et à la fin je ne retrouve pas une moyenne de 16.3 mais de ~17
    (par contre je retrouve bien un nombre de points = 10000 comme au départ)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    => il faut que je classe les données dans l'ordre avant de faire X(end)-X(1)
    C'est une solution... pas vraiment celle que j'aurais choisie. Pose-toi la question "pourquoi cela fonctionne lorsque tu réordonnes ces données ? Qu'y a-t-il comme nouvelles valeurs en X(1) et X(end) ?"

    Citation Envoyé par 21did21 Voir le message
    => si je fais je ne retrouve pas mes 10000 initiaux mais 9999... je ne sais pas où est passé le dernier (ou le premier)
    Et si tu rendais une inégalité stricte en inégalité

    Citation Envoyé par 21did21 Voir le message
    je ne retrouve pas mes 16.3 mais plutôt 16.3003
    Ça c'est tout à fait normal : tu fais une estimation.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    C'est une solution... pas vraiment celle que j'aurais choisie. Pose-toi la question "pourquoi cela fonctionne lorsque tu réordonnes ces données ? Qu'y a-t-il comme nouvelles valeurs en X(1) et X(end) ?"
    ah ok, tu voulais dire :
    ?

    Citation Envoyé par Winjerome Voir le message
    Et si tu rendais une inégalité stricte en inégalité
    ah oui en effet
    j'obtiens bien à présent la bonne valeur

    Citation Envoyé par Winjerome Voir le message
    Ça c'est tout à fait normal : tu fais une estimation.
    à oui, en effet j'avais zappé
    ma moyenne est à présent : 16.2942 ce qui est pas mal du tout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/09/2006, 19h02
  2. Réponses: 1
    Dernier message: 18/07/2006, 23h38
  3. requete sql complexe, que faire: 2 sql imbriques ou fonction date?
    Par Aliveli dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/06/2006, 20h20
  4. [Informatique] Travailler dans la fonction publique
    Par link182 dans le forum Emploi
    Réponses: 1
    Dernier message: 03/04/2006, 17h38
  5. Faire un "ou" dans la fonction waitfor de telnet
    Par jean tof dans le forum Langage
    Réponses: 2
    Dernier message: 03/02/2006, 15h57

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