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 :

Optimisation d'un bout de code


Sujet :

MATLAB

  1. #1
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut Optimisation d'un bout de code
    Bonjour,
    Je traite un nombre important de données et je me trouve confrontée à un temps de calcul assez élevé, alors je me demandais si on ne pouvait pas mieux faire.

    Voici la partie qui me bouffe le plus de temps:
    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
     
     P=rand(65000,3);
     V1=rand(90,3);
     for i=1:3:length(P)-2
        gi=zeros(3,3);
        gi(1,:)=P(i,:);
        gi(2,:)=P(i+1,:);
        gi(3,:)=P(i+2,:);
        [ci, ia, ib]=intersect(gi, V1,'rows');
        if size(ia)~=0
            P(i,:)=  [0 0 0];
            P(i+1,:)=[0 0 0];
            P(i+2,:)=[0 0 0];
        end
     
    end
    Je répète se code au minimum 100 fois alors j'aimerais bien savoir s'il y a moyen de faire autrement en gaspillant moins de temps?

    Merci d'avance

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

    Utilise plutôt la fonction NUMEL ou ISEMPTY à la place de SIZE dans if size(ia)~=0Ensuite tu peux simplifier ta boucle comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i=1:3:length(P)-2
        [ci, ia, ib] = intersect(P(i:i+2,:), V1,'rows');
        if numel(ia)~=0
            P(i:i+2,:) = 0;
        end
    end
    Sinon pour optimiser le temps d'exécution, je te conseille d'appliquer la fonction INTERSECT sur tout le vecteur P et de travailler ensuite sur les indices, notamment avec FLOOR.
    Bonne continuation.
    Dernière modification par Invité ; 17/12/2011 à 21h59.

  3. #3
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Merci Winjerome

    En suivant ton conseil j'ai remplacé par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [ci, ia, ib]=intersect(P, V1,'rows');
    if numel(ia)~=0
    P(ia,: )=0;
    end
    Mais j'ai pas utilsé Floor et je ne sais pas si ce que j'ai fait est correct ou pas, qu'en pensez vous?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Décembre Voir le message
    je ne sais pas si ce que j'ai fait est correct ou pas, qu'en pensez vous?
    Cela dépend de tes besoins...
    Dans le code de ton premier message, tu fais la vérification 3 par 3 (si au moins l'un des 3 est contenu dans V1, tu mets les 3 à zéro), alors qu'ici tu n'en tiens pas compte...

  5. #5
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Dans le code de ton premier message, tu fais la vérification 3 par 3 (si au moins l'un des 3 est contenu dans V1, tu mets les 3 à zéro), alors qu'ici tu n'en tiens pas compte
    Effectivement, en faidsant vite j'ai omis de prendre en considération la vérification 3 par 3 qui est très importante

    J'ai essayé ceci, mais le résultat que j'obtiens est différent de ce que j'avais avant (en utilisant le code lent), il y a certainement une erreur mais j'arrive pas à la voir !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [ci, ia, ib]=intersect(P, V1,'rows');
     
    for i=1:3:length(P)-2
        if (ia(:)==i)|(ia(:)==i+1)|(ia(:)==i+2)
            P(i:i+2,:)=0;
        end
    end
    Voyez-vous le problème?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Il te manque l'utilisation de la fonction ANY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if any(ia(:)==i)|(ia(:)==i+1)|(ia(:)==i+2)
    Sinon tu vérifies si toutes les valeurs du vecteur sont vraies.

    Ou comme indiqué précédemment avec FLOOR:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [ci, ia, ib]=intersect(P, V1,'rows');
    ia = 3*floor((ia-1)/3)+1;
    P(ia,:) = 0;
    P(ia+1,:) = 0;
    P(ia+2,:) = 0;
    Dernière modification par Invité ; 17/12/2011 à 22h00.

  7. #7
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Merci Winjerome

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

Discussions similaires

  1. optimisation d'un bout de code
    Par ol9245 dans le forum MATLAB
    Réponses: 8
    Dernier message: 15/12/2010, 18h54
  2. Réponses: 9
    Dernier message: 02/10/2010, 12h43
  3. Optimiser un bout de code VB
    Par ted the Ors dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/07/2008, 21h48
  4. Optimisation d'un bout de code
    Par Lost in dans le forum MATLAB
    Réponses: 3
    Dernier message: 29/04/2008, 22h58

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