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 :

Moyen élégant pour faire un calcul glissant


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut Moyen élégant pour faire un calcul glissant
    Bonjour,

    Je recherche une astuce de notation et de méthode pour faire des calculs glissants (surtout pour éviter les boucles for). Par exemple, sur une série temporelle de 100 données, calculer une moyenne sur 10 jours glissants (ou une variance), ou bien calculer une correlation entre deux séries avec une fenêtre glissante.

    Merci par avance.

  2. #2
    Membre émérite
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Par défaut
    Salut,

    Tu peux utiliser la fonction tsmovavg de la "Financial Toolbox".

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Bonjour,
    Oui je l'utilise déjà.
    En fait je recherche plus une méthode élégante pour faire des calculs glissants, mais pas nécessairement des moyennes mobiles...

    La moving average simple est calculée comme suit en interne, mais je ne trouve pas ça super top...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for idx = 1:vinVars
        % Simple moving average
        ma = filter(ones(1,lag)/lag, 1, vin(idx,:));
     
        % Fill in the NaN's vector
        simOut(idx, lag:end) = ma(lag:end);
    end

  4. #4
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _moebius_
    Bonjour,

    Je recherche une astuce de notation et de méthode pour faire des calculs glissants (surtout pour éviter les boucles for). Par exemple, sur une série temporelle de 100 données, calculer une moyenne sur 10 jours glissants (ou une variance), ou bien calculer une correlation entre deux séries avec une fenêtre glissante.

    Merci par avance.
    Je vois bien ce que tu veux dire. Ca ressemble à un problème que j'ai régulièrement sur des matrices : j'ai besoin des 8 voisins dans un calcul. je fais un tableau annexe de 9 colonnes, qui contient les indices de la maille centrale et de ses 8 voisins.

    Cett stratégie adaptée à ton problème donnerait qqchose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    N=length(mamatrice) ;
    V0 =1:N ;
    V = V0 ;
    for i=1:9, V = [V0 ; V(:,[2:end 1])] ; end
     
    % et pour une moyenne glissante sur mamatrice
    M = mean(mamatrice(V)) ;
    j'ai pas testé, mais il doit y avoir un truc de ce genre qui marche.
    L'élégance est que le tableau V ne dépend pas du prob posé.

    Note : pour économiser du code en matlab, il faut parfois (souvent ) passer par la case barettes mémoire supplémentaires lol
    OL

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Ca ressemble beaucoup à cette idée, mais on a encore une boucle for qui traine..
    Il y a peut-être moyen d'imbriquer les indexages.

    PS: Exact pour les barettes...

  6. #6
    Membre émérite
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Par défaut
    Bonsoir !

    as-tu essayé la fonction filter?
    il n'y a pas de for

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    x=10*sin((1:100)/40)+randn(1,100);
    N=10;
    y=filter(ones(1,N),N,x);
    subplot(2,1,1);plot(x)
    subplot(2,1,2);plot(y)

  7. #7
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _moebius_
    Ca ressemble beaucoup à cette idée, mais on a encore une boucle for qui traine..
    Il y a peut-être moyen d'imbriquer les indexages.

    PS: Exact pour les barettes...
    Tu pousses le purisme un peu loin quand même . Les boucles for ne mordent pas !!! Tu as droit de les utiliser !!!!

    ici tu as une boucle de longueur 10 indépendante de la taille N de ton tableau. Tu asdonc résolu ton problème d'optimisation.

  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 317
    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 317
    Par défaut
    Citation Envoyé par ol9245
    Les boucles for ne mordent pas !!! Tu as droit de les utiliser !!!!
    Oui et non... tout dépend de se que l'on cherche. Un code efficace, robuste, lisible, facile à faire évoluer... ?

    Le fait est que Matlab est un logiciel de calcul matriciel. Donc il faut penser en terme de matrices et non pas d'éléments de matrices.

    Il est tout à fait possible d'utiliser les boucles FOR-END mais... dans la solution citée précédemment, ce qui manque cruellement pour améliorer son efficacité, c'est la préallocation de mémoire.

    Pour info, voici un code vectorisé qui résout le problème de moyenne mobile (d'après l'exemple de wikipédia ) :
    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
    X=[2 3 5 8 8 7 8 5 2]
     
    n=3; % uniquement n impair et supérieur ou égal à 3
     
    nX=numel(X);
     
    if nX-(n-1)>0 & n>=3
     
       idx=ones(n,nX-(n-1));
       idx(1,:)=1:nX-(n-1);
       idx=cumsum(idx);
     
       mean(X(idx))
     
    end
    Je pense qu'il est encore possible d'améliorer ce code... je pense que rostomus a raison et que FILTER est bien la solution ici, sinon il vous reste les mex. Et la, plus de problème de mémoire.

Discussions similaires

  1. [XL-2003] Vba Aide pour faire un calcul
    Par Ropie94 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/07/2009, 16h41
  2. Problème pour faire un calcul
    Par carlou135 dans le forum Linux
    Réponses: 7
    Dernier message: 27/11/2007, 17h38
  3. Réponses: 5
    Dernier message: 23/02/2007, 09h04
  4. utiliser données texte pour faire des calculs
    Par sarah67 dans le forum Access
    Réponses: 20
    Dernier message: 06/02/2006, 14h09
  5. Quels sont les meilleurs moyens Marketing pour faire connaitre un site ?
    Par patrick_lassaly dans le forum Webmarketing
    Réponses: 23
    Dernier message: 24/11/2005, 11h28

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