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 :

événements/comptage et durée


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut événements/comptage et durée
    Je fais un nouveau post qui est la suite

    http://www.developpez.net/forums/d13...centage-temps/

    Grâce à votre aide j'ai pu calculer un seuil de niveau. Je rappel que je possède des données temporelles t associées chacune à un niveau L.

    A présent je souhaite réussir à calculer le nombre d’événements supérieurs à ce seuil.
    J'entends par événement, non pas le nombre de points supérieurs au seuil mais le nombre de combinaison front montant et descendant supérieurs au seuil.

    Je sais que je dois éviter de faire des boucles à tout bout de champs mais là je ne vois comment l'en passer.


    Voici le code utilisé :

    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
     
     
    filename='T.XLS';
     
     
    % lecture feuille 1
    num = xlsread(filename,'Feuil1');
    t=num(:,1); 
    L=num(:,2); 
     
    x_trie = sort(L,'descend');
    t_tot = t(end)-t(1);
    idx_t_10prct = min(find(t>t_tot*0.1));
    seuil = x_trie(idx_t_10prct);
     
    figure(1)
    plot(t,L,'linewidth',2); hold on
    text(t(100),seuil(1)+5,...
    	['Lw_{10} = \bf',num2str(seuil(1))],...
    	'HorizontalAlignment','center',... 
    	'BackgroundColor',[1,0,0.5],...
    	'Margin',5);
    plot(t, seuil*ones(size(t)),'m--','linewidth',2)
     
    axis ([0 t(end) 60 100])
    title('Niveau de puissance le long du parcours')
    xlabel('Temps s')
    ylabel('Niveau de puissance dB')

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    salut

    si je comprend bien tu devrais pouvoir t'en sortir avec la fonction diff pour les fronts et sum pour le comptage
    quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nb_event_front_montant = sum(diff(L)> seuil);
    nb_event_front_descendant = sum(diff(L)<-seuil);
    Fabien

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Ta solution est une piste en effet mais je vais devoir la changer car la fonction diff renvoie des nombres (une différence de deux L) qui sont tous inférieurs au seuil (une valeur L).

    C'est pour cela que je pensais employer une boucle, du genre :
    si L > seuil alors ...

  4. #4
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Pas sur de comprendre : tu souhaites compter le nombre de fois que tu dépasses ton seuil de 10%?
    C'est quasiment la même solution que celle de Fabien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_event_front_montant = sum(diff(L > seuil)>0);
    Rq : si tu commences au dessus du seuil, l'évènement n'est pas comptabilisé

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Ok je pense pouvoir me débrouillé avec vos indications. Merci.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    je relance ce post avec une question dans la continuité de mon post.

    A présent que je peut compter le nombre d'événements supérieurs à un seuil. Comment puis-je faire pour calculer la durée de ceux-ci ?

    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
    filename='T.XLS';
    
    
    % lecture feuille 1
    num = xlsread(filename,'Feuil1');
    t=num(:,1); 
    L=num(:,2); 
    n1=length(L); % longueur des vecteurs
    
    x_trie = sort(L,'descend');
    t_tot = t(end)-t(1);
    idx_t_10prct = min(find(t>t_tot*0.1));
    seuil = x_trie(idx_t_10prct);
    
    nb_event_front_montant = sum(diff(L > seuil)>0);
    
    %calcul des intervalles de temps
    for ii=1:n1-1,
        t2(ii)=t(ii+1)-t(ii);
    end
    t3=[0,t2(1:end, :)];
    
    figure(1)
    plot(t,L,'linewidth',2); hold on
    text(t(100),seuil(1)+5,...
    	['Lw_{10} = \bf',num2str(seuil(1))],...
    	'HorizontalAlignment','center',... 
    	'BackgroundColor',[1,0,0.5],...
    	'Margin',5);
    plot(t, seuil*ones(size(t)),'m--','linewidth',2)
    
    axis ([0 t(end) 60 100])
    title('Niveau de puissance le long du parcours')
    xlabel('Temps s')
    ylabel('Niveau de puissance dB')
    j'ai commencé par calculer les intervalles de temps à partir de mes données temporelles.

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Je pense que je peux déjà améliorer mon programme en supprimant la boucle en rouge

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Te donne en indexage logique si tu dépasses ton seuil, ensuite il te suffit d'appliquer la méthode décrite ici :
    http://www.developpez.net/forums/d89...zeros-vecteur/

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    La méthode que tu m'indique est intéressante sauf que :
    ne me renvoie que le front montant je n'ai donc pas un indexage pour toute la période de chacun de mes intervalles

  10. #10
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Petite étourderie en effet,
    il faut simplement partir de

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    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
    
    filename='T.XLS';
    
    
    % lecture feuille 1
    num = xlsread(filename,'Feuil1');
    t=num(:,1); 
    L=num(:,2); 
    n1=length(L); % longueur des vecteurs
    
    x_trie = sort(L,'descend');
    t_tot = t(end)-t(1);
    idx_t_10prct = min(find(t>t_tot*0.1));
    seuil = x_trie(idx_t_10prct);
    
    nb_event_front_montant = sum(diff(L > seuil)>0);
    
    t2 = [0 ; diff(t)];
    
    a=Lpow2 > seuil;
    snz = diff(find(~[0 a 0]))-1 ;
    snz = snz(snz~=0) 
    nnz = numel(snz) 
    
    
    
    figure(1)
    plot(t,L,'linewidth',2); hold on
    text(t(100),seuil(1)+5,...
    	['Lw_{10} = \bf',num2str(seuil(1))],...
    	'HorizontalAlignment','center',... 
    	'BackgroundColor',[1,0,0.5],...
    	'Margin',5);
    plot(t, seuil*ones(size(t)),'m--','linewidth',2)
    
    axis ([0 t(end) 60 100])
    title('Niveau de puissance le long du parcours')
    xlabel('Temps s')
    ylabel('Niveau de puissance dB')
    Le code fonctionne ceci dit, j'ai du mal , (et d’ailleurs pas que pour ce code en particulier ) à maintenant trouver les données temporelles t3 qui correspondent.
    Le lien entre deux colonnes de matrices n'est pas clair à mes yeux (sans passer par une boucle).

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    J'ai modifié mes intervalles de temps.
    Puis-je retrouver mes t3 sans passer par une boucle ?

  13. #13
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    regarde ce que font ces lignes :
    i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d_front_montant = diff([-Inf; L(:)] > seuil)>0;
    id_front_descendant = diff([L(:); -Inf] > seuil)<0;
    t_fronts = t(sort([id_front_montant;id_front_descendant]));
    t3 = diff(t_fronts);
    t3 = t3(1:2:end);

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par FLB Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_front_montant = diff([-Inf; L(:)] > seuil)>0;
    id_front_descendant = diff([L(:); -Inf] > seuil)<0;
    t_fronts = t(sort([id_front_montant;id_front_descendant]));
    t3 = diff(t_fronts);
    t3 = t3(1:2:end);
    Dejà premiere question est ce que le t en rouge dans le code tu le considère comme etant ma variable de temps t ?
    Si oui alors j'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ??? Index exceeds matrix dimensions.
     
    Error in ==> lire at 107
    t_fronts = t(sort([id_front_montant;id_front_descendant]));
     
    Error in ==> run at 57
              evalin('caller', [s ';']);

  15. #15
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Oui le t correspond bien à ton vecteur de temps, cohérent avec L.
    En effet, n'ayant pas Matlab sous la main je fais quelques erreurs bêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id_front_montant = find(diff([-Inf; L(:)] > seuil)>0);
    id_front_descendant = find(diff([L(:); -Inf] > seuil)<0);
    Il faut passer de l'indexage logique à l'indexage linéaire. Est ce que tu comprends ce que je veux faire avec ces lignes?

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Tes lignes fonctionnent. Mais c'est vrai qu'étant une novice sur matlab je n'ai pas encore tout compris du fonctionnement de chaque ligne, en particulier pour les lignes de codes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    id_front_montant = find(diff([-Inf; L(:)] > seuil)>0);
    id_front_descendant = find(diff([L(:); -Inf] > seuil)<0);
    t_fronts = t(sort([id_front_montant;id_front_descendant]));
    t3 = diff(t_fronts);
    t3 = t3(1:2:end);

    Autre question :
    le t en rouge dans le code plus haut, tu te sert du t ou bien du t2 ?(intervalles de temps recalculés)

    J'ai ma réponse tu te sert du t.


    Mais alors ton programme reste un mystère pour moi....

  17. #17
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Mise à part le problème de la compréhension de tes lignes de codes,
    je souhaite afficher dans mon plot la duré de ces événements.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    text(t(end)-1,seuil(1)-30,...% place du texte dans la fenetre
    	['durée des événements = \bf',num2str(t2)],...
    	'HorizontalAlignment','center');hold on
    Il doit manquer quelquechose au niveau du t2 pour que cela fonctionne..

  18. #18
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 69
    Points : 19
    Points
    19
    Par défaut
    Et si possible qu'il y est un saut de ligne à l'affichage de la durée de chacun événements sur le plot.

  19. #19
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    salut

    essayes quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    text(t(end)-1,seuil(1)-30,...% place du texte dans la fenetre
    	sprintf('durée des événements = \\bf %.2f \n',t2),...
    	'HorizontalAlignment','center');hold on
    ca ne fait pas exactement ce que tu veux, mais tu pourra adapter

    Fabien

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/11/2010, 18h13
  2. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  3. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  4. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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