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 :

Lenteur de la boucle for pour la construction d'equations


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Lenteur de la boucle for pour la construction d'equations
    Bonjour,
    J'ai remarqué une grande lenteur lors de l'execution de mon code et ce au niveau de la construction des m equations:

    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
     
    m=500;
    %CONSTRUIRE LES EQUATIONS
    eq=sym('eq',[m,1]);
        Y=sym('Y',[m,1]);
        for a=1:m
            eq(a)=0;
            for i=1:n
                for j=1:n
                    eq(a) = (U(i,j,a))* (Y(a)^ P(i,j,a)) + eq(a);
                end
            end
            eq(a)=eq(a)-V(a);
          end
    %RESOUDRE LES EQUATIONS
    y=zeros(1,m);
        for a=1:m
            solution=solve(eq(a),Y(a),'PrincipalValue',true); 
           if isempty(solution)
               y(a)=0;
           else
               y(a)=solution;
           end
        end
    Pourriez vous m'aider? car je dois encore augmenter le nombre d'equations de 500 vers 1000

    Merci d'Avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 21
    Points
    21
    Par défaut
    Tu peux utiliser la methode parfor.

    Elle va te permettre d'utiliser des threads pour diminuer le temps de traitement.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    L'utilisation de parfor peut être utile mais avant même d'utiliser cela il est préférable d'optimiser le code. Matlab préfère nettement quand tu présente le calcul matriciellement.
    Ainsi en modifiant ton code de la façon suivant j’obtiens une multiplication de la vitesse d’exécution par environ 30 sur un test rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for a=1:m
        eq2(a) = sum(sum(U(:,:,a).*(Y(a).^P(:,:,a))));
        eq2(a)=eq2(a)-V(a);
    end
    Il y a certainement moyen de faire disparaître la dernière boucle mais je ne suis pas sûr du comportement de Y.^P quand Y est un vecteur et P un tableau à trois dimensions. Je te laisse faire les tests.

Discussions similaires

  1. lenteur d'une boucle FOR pour cursor
    Par zinabd dans le forum PL/SQL
    Réponses: 1
    Dernier message: 13/08/2010, 10h55
  2. création d'une boucle for pour interrogation requête sql
    Par philder62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/12/2007, 15h14
  3. Réponses: 7
    Dernier message: 10/10/2007, 19h23
  4. Réponses: 2
    Dernier message: 29/08/2006, 13h59
  5. [Numarray]Lenteur! Trop de boucle For peut etre????
    Par parp1 dans le forum Calcul scientifique
    Réponses: 5
    Dernier message: 19/05/2006, 08h31

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