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 :

Boucles for -> Calcul matriciel


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Boucles for -> Calcul matriciel
    Bonjour,
    J'ai un programme avec une grande quantité de boucles, son exécution est donc assez lente.
    Il y a 3 boucles inbriquées qui traite les 3 dimesions x, y et z, sur des matrices 3D.
    J'aimerais pouvoir transformer coder les 3 boucles sous forme de matrices mais il y a un élément qui gène.
    Voici une partie du code en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for p=1:np % boucle sur le nombre de points
       x(p)=M(p,2);y(p)=M(p,3);z(p)=M(p,4);f(p)=M(p,5);A(p)=M(p,6);
       w(p)=2*pi*f(p); 
       for ix=1:n
            for iy=1:n
                for iz=1:n
                    r(p,ix,iy,iz)=sqrt((X(ix,iy,iz)-x(p))^2+(Y(ix,iy,iz)-y(p))^2+(Z(ix,iy,iz)-z(p))^2);
                end
            end
       end
    end
    La 2me ligne récupère juste les valeurs de x, y, z, f et A dans une matrice M, ces valeurs sont des vecteurs de dimension (np,1).
    X, Y et Z sont de taille (n,n,n).
    J'aimerais remplacer les 3 boucles ix, iy et iz par une commande de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r(p,:,:,:)=sqrt((X-x(p).*ones(n,n,n))^2+(Y-y(p)*ones(n,n,n))^2+(Z-z(p)*ones(n,n,n))^2);
    Bien sur cela ne fonctionne pas car il y a un problème de dimension cer r est de dimension (np,n,n,n).
    Merci d'avance pour votre aide.

  2. #2
    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,

    Tu dois avoir une erreur au niveau des puissances :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r(p,:,:,:)=sqrt((X-x(p).*ones(n,n,n)).^2+(Y-y(p)*ones(n,n,n)).^2+(Z-z(p)*ones(n,n,n)).^2);
    Sinon x(p).*ones(n,n,n) peut aussi s'écrire :
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ok, merci, le code que tu m'as donné fonctionne bien, je ne pensais pas que c'était possible étant donné que les dimensions des deux membres n'était pas identiques.
    Par contre repmat ne fonctionne pas (Too many input arguments).
    Ensuite j'ai le même type de problème que le premier.
    J'aimerais replacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for p=1:np
        for ix=1:n
            for iy=1:n
                for iz=1:n
                    pres(ix,iy,iz)=A(p)*exp(1i*(w(p)*t-k(p)*r(p,ix,iy,iz)))/(k(p)*r(p,ix,iy,iz));
                end
            end
        end
    end
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for p=1:np
        pres(:,:,:)=A(p).*exp(1i.*(w(p)*t.*ones(n,n,n)-k(p).*r(p,:,:,:)))./(k(p).*r(p,:,:,:));
    end

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

    x(p), y(p) et z(p) étant de simples scalaires, il n'y a pas besoin de les ajuster aux dimensions de X,Y et Z. Ainsi le code de magelan peut se simplifier en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r1(p,:,:,:)=sqrt((X-x(p)).^2+(Y-y(p)).^2+(Z-z(p)).^2);
    En ce qui concerne REPMAT, au delà de 2 dimensions, il faut fournir un vecteur:
    En ce qui concerne cette nouvelle simplification, ne serai-ce pas plutôt pres(p,ix,iy,iz) ?
    Quoiqu'il en soit, le principe est le même: dès que tu veux multiplier/diviser membre-à-membre des tableaux, il te faut mettre un point devant:

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ok, merci pour ces précisions.
    Non il n'y a pas d'indice p sur pres car à la fin de la boucle il y a
    Je fais donc la somme de tous les indices, je n'ai donc pas besoin de conserver la valeur pour chaque indice p.

    L'erreur que me retourne matlab est :

    ??? Error using ==> minus
    Number of array dimensions must match for binary array op.
    Ce qui me semble normal car il y a l'indice p en trop dans r.

  6. #6
    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
    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    x(p), y(p) et z(p) étant de simples scalaires, il n'y a pas besoin de les ajuster aux dimensions de X,Y et Z. Ainsi le code de magelan peut se simplifier en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r1(p,:,:,:)=sqrt((X-x(p)).^2+(Y-y(p)).^2+(Z-z(p)).^2);
    En ce qui concerne REPMAT, au delà de 2 dimensions, il faut fournir un vecteur:
    Oula! j'était pas bien réveillé moi ce matin!

    Peux-tu nous montrer le message d'erreur complet ainsi que le code qui génère cette erreur?
    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.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ok, comme ceci ça fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sp=zeros(n,n,n);pres=zeros(n,n,n);
    for p=1:np   
        for ix=1:n
            for iy=1:n
                for iz=1:n
                    pres(ix,iy,iz)=A(p)*exp(1i*(w(p)*t-k(p)*r(p,ix,iy,iz)))/(k(p)*r(p,ix,iy,iz));
                end
            end
        end
        sp=sp+real(pres);
    end
    Par contre comme celà ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sp=zeros(n,n,n)
    for p=1:np
        sp=sp+real(A(p).*exp(1i.*(w(p)*t.*ones(n,n,n)-k(p).*r(p,:,:,:)))./(k(p).*r(p,:,:,:)));   
    end
    Je n'ai pas d'autre message d'erreur que ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ??? Error using ==> minus
    Number of array dimensions must match for binary array op.
     
    Error in ==> Source_3D at 36
               sp=sp+A(p).*exp(1i.*(w(p)*t.*ones(n,n,n)-k(p).*r(p,:,:,:)))./(k(p).*r(p,:,:,:));

  8. #8
    Invité
    Invité(e)
    Par défaut
    Même remarque que précédemment pour le ones(n,n,n) restant. Maintenant tu utilises beaucoup de points inutilement: seul 1 reste indispensable ici.

    Le problème est que ici size(r(p,:,:,:)) = [1 n n n] différent de [n n n]. Tu peux pour contrer cela utiliser la fonction SQUEEZE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for p=1:np
        sp = sp + squeeze( A(p)*exp(1i*(w(p)*t-k(p)*r(p,:,:,:))) ./ (k(p)*r(p,:,:,:)) );   
    end

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup !
    Cela me fait gagner un temps précieux.

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

Discussions similaires

  1. Calcul de la factorielle de n , en java avec boucle for
    Par mathlooty dans le forum Langage
    Réponses: 17
    Dernier message: 13/02/2018, 17h14
  2. Calcul du temps passé dans une boucle for
    Par Hydro999 dans le forum R
    Réponses: 3
    Dernier message: 28/07/2009, 19h39
  3. [XL-2003] Calculer le temps passé dans une boucle for
    Par mancired dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2009, 15h06
  4. [Débutant] Remplacement boucle for pour calcul matriciel
    Par LoicS dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/03/2009, 19h26
  5. Calcul d'une matrice dans une boucle for
    Par david_Montreal dans le forum MATLAB
    Réponses: 7
    Dernier message: 11/07/2007, 17h17

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