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 :

Aide pour vectorisation de code [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Points : 26
    Points
    26
    Par défaut Aide pour vectorisation de code
    Bonjour!

    Voici mon probleme:
    J'ai une matrice M(n,m), ainsi que trois vecteurs A(m), B(m) et C(m). Je souhaite construire la matrice N(n,m), où, pour tout couple (n,m), j'ai:

    N_{m,n} = \sum_{i=1}^m \frac{A_i}{B_i - M_{m,n}} C_i


    Evidemment, avec des boucles imbriquées, c'est facile, mais c'est horriblement lent. Actuellement, mon code passe 50% de son temps à calculer ça, alors que ce n'est pas la partie "essentielle".
    Je pense que la solution passe par la vectorisation, mais je ne sais pas comment la mettre en place, notamment en raison du B_i - M_{m,n}.

    Actuellement, le code a cette tête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        for k = 1:n
                for j=1:m
                   Zkj = Z(k,j);
                   N(k,j) = sum( (A./(B - Zkj  )).*C);
                end 
         end
    Merci d'avance pour votre aide!

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    J'ai aussi un autre bout de code que je ne sais pas trop comment vectoriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i=1:n
          for j=1:n
             if (i~=j)
                L(i)=L(i).*(w-w_base(j))./(w_base(i)-w_base(j));
             end
          end      
    end
    Les plus sagaces d'entre vous auront reconnu une interpolation de Lagrange.
    (cette fois-ci,c'est le i~=j et le fait de travailler sur deux indices différents, i et j qui me bloque)

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    pour ton premier code, une façon de vectoriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    n = 200;
    m = 200;
    Z = randi(1000,n,m);
    A = randi(10,1,1,m);
    B = randi(10,1,1,m);
    C = randi(10,1,1,m);
    AA = repmat(A,[n,m,1]);
    BB = repmat(B,[n,m,1]);
    CC = repmat(C,[n,m,1]);
    ZZ = repmat(Z,[1,1,m]);
    res = sum((AA./(BB - ZZ  )).*CC,3);
    Mais
    • je ne suis pas sûr que ce soit plus rapide
    • tu vas certainement avoir des problèmes de mémoire si m et n sont grand (ce qui doit être le cas j'imagine)

    Après tu peux peut-être vectoriser une seule des 2 boucles selon le même principe...
    Si le temps d'exécution est vraiment un problème, tu peux peut-être te tourner vers les fichiers mex?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Pour compléter la réponce de magelan, pense aussi à la préallocation si tu ne peux pas vectoriser, cela peut améliorer significativement le temps de calcul.

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Merci pour vos réponses. En ce qui concerne le premier bout de code, la solution fournie par magelan donne de bons résultats, les matrices que j'ai étant grosses, mais pas gargantuesques. (@Duf: j'avais bien sûr déjà mis en place la préallocation )

    Je vais essayer d'exposer mon second problème (correspondant au deuxième code) de façon plus détaillée:
    J'ai une fonction définie du cercle unité vers Z (nombres complexes), dont je connais la valeur pour un certain nombre de points sur le cercle unité, et je veux interpoler ces valeurs pour d'autres points, toujours du cercle unité.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par magelan Voir le message
    Bonjour,

    pour ton premier code, une façon de vectoriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    n = 200;
    m = 200;
    Z = randi(1000,n,m);
    A = randi(10,1,1,m);
    B = randi(10,1,1,m);
    C = randi(10,1,1,m);
    AA = repmat(A,[n,m,1]);
    BB = repmat(B,[n,m,1]);
    CC = repmat(C,[n,m,1]);
    ZZ = repmat(Z,[1,1,m]);
    res = sum((AA./(BB - ZZ  )).*CC,3);
    Mais
    • je ne suis pas sûr que ce soit plus rapide
    • tu vas certainement avoir des problèmes de mémoire si m et n sont grand (ce qui doit être le cas j'imagine)

    Après tu peux peut-être vectoriser une seule des 2 boucles selon le même principe...
    Si le temps d'exécution est vraiment un problème, tu peux peut-être te tourner vers les fichiers mex?

    Pourrais-tu m'aider à adapter ton code dans le cas où Z n'est plus une matrice de taille n,m mais un vecteur de longueur n (~=m) ? Je m'y perds un peu dans ces repmat...

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Peux-tu nous montrer ce que tu as essayé de faire?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    En fait, en relisant mon code avant de le poster, j'ai compris mon erreur Du coup, ça marche maintenant. Merci de ton aide!

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

Discussions similaires

  1. [Débutant] Aide pour vectorisation d'une partie d'un code
    Par linda05 dans le forum MATLAB
    Réponses: 0
    Dernier message: 14/07/2014, 16h14
  2. [VB.NET] besoin d'aide pour déchiffrer un code
    Par pcdj dans le forum Windows Forms
    Réponses: 10
    Dernier message: 27/06/2006, 12h32
  3. Aide pour comprendre un code
    Par Spacy_green dans le forum Assembleur
    Réponses: 2
    Dernier message: 13/02/2006, 14h22
  4. Aide pour comprendre le code
    Par jfreuff dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/01/2006, 18h54
  5. Je besoin d'aide pour terminer mon code
    Par Paulinho dans le forum C++
    Réponses: 7
    Dernier message: 07/11/2005, 00h30

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