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 :

Expression avec indice dans la Boucle FOR


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Points : 8
    Points
    8
    Par défaut Expression avec indice dans la Boucle FOR
    Bonjour tout le monde

    j'ai un algorithme écrit en Maple que j'aimerais convertir en Matlab, mais puisque je suis débutante en Matlab j'ai trouvé quelques difficultés dans quelques parties de mon algorithme

    mon problème est le suivant: j'aimerais écrire U1=..., U2=.., U3=..., ainsi de suite
    ma boucle for en Maple ça s'écrit par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i from 1 to 5 do 
    U[i]:=<1,0,0>
    od:
    en Matlab j'ai écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i=1:5 
    U(i)=[1;0;0];
    end
    sachant que le résultat est un vecteur colonne
    -->je reçois un message d'erreur

    j'ai aussi une autre boucle for que j'aimerais écrire mais j'ai aussi le même problème d'affectation de l'indice à ma variable

    ma boucle for en Maple ça s'écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i from 1 to 5 do 
    D[i]:=<dx[i],dy[i],dz[i]>
    od:
    en matlab j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    syms dx dy dz
    for i=1:5 
    D(i)=[dx(i);dy(i);dz(i)];
    end
    sachant que dx, dy et dz sont des déplacements suivant x, y et z
    ceci m'a donné une erreur parce que l'affectation de l'indice est fausse, mais je n'ai pas su comment faire


    s'il vous plaît aidez-moi
    MERCI

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Tout d'abord une remarque TRES importante. Mapple est symbolique, Matlab est numérique. Cela veut dire qu'en matlab, les seules affectations que tu puisses faire sont numérique.

    1ere boucle: U(i)=[1;0;0]; n'a pas de sens car U(i) est un réel (un élément d'un vecteur ou d'une matrice U) alors que [1 0 0] est une vecteur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    % solution possible matlab
    U= nan(5,3); une matrice à 5 lignes et 3 colonnes
    for i=1:5 
    U(i,:)=[1,0,0]; %assigne la i-ème ligne
    end
    % Equivalent vectorisé
    U= repmat([1,0,0],5,1); % réplique ton vecteur sur 5 lignes et 1 colonne
    Pour la 2nd boucle, même principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    D(i,:)=[dx(i),dy(i),dz(i)]; % assigne la ième ligne de i. Suppose que les dx, dy, dz n'ont qu'une colonne.
    note bien que dans tous les cas, tu n'a qu'une seule variable contenant les vecteurs qui t'intéressent

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    merci pour votre réponse, oui vous avez raison je ne peux pas écrire U(i) mais ce que j'ai voulu dire par U(i) c'est Ui (quelque soit i)
    est U est un vecteur colonne ( 3 lignes et 1 colonne)
    voici ce que je voulais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:n
        U<sub>i</sub>=[1;0;0]
    end
    c'est à dire lorsque je mets par exemple n=3 et j'exécute la boucle je reçois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    U<sub>1</sub>=[1;0;0]
    U<sub>2</sub>=[1;0;0]
    U<sub>3</sub>=[1;0;0]
    est c'est la même chose pour la deuxième boucle, i est un indice qui varie

    merci

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    En matlab, il est déconseillé de construire N vecteurs colonnes U1,U2,...,UN

    Il vaut mieux construire une seule matrice U avec N colonnes, telle que U(:,n)= Un. La raison est que si je cherche la somme des Un, il suffit de faire sum(U,2), (alors qu'il faudrait écrire une infâme boucle pleine d'eval si j'avais N variables différentes).

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    merci mais je ne sais pas si le fait de mettre tout dans une matrice ne va pas me causé de problème par la suite dans mon algorithme, mais je vais essayer donc pour la première boucle je vais mettre U= repmat([1;0;0],1,5) et pour la deuxième boucle je ne peux pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i=1:n
    D(i,:)=[dx(i),dy(i),dz(i)]
    end
    qu'est ce que je fait pour que D soit une matrice n colonne et de 3 lignes tel que chaque colonne est sous la forme dxi dyi dzi et i varie de 1 à n ???

    Merci

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    tout dans une matrice ne va pas me causé de problème
    Je pense plutôt que ça simplifiera la suite.

    Sinon pour concaténer trois vecteurs colonnes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    D= cat(2,dx,dy,dz);
    Tu peux voir sur ces exemples ce qui fait la force Matlab : le calcul vectorisé qui traite directement des vecteurs/matrices et qui évite d'écrire des boucles.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    merci beaucoup mais je trouve une grande difficulté avec matlab puisque je suis une débutante, peut être les matrices peuvent régler le problème mais si je veux écrire dans la même matrice U différentes colonnes U= repmat([1;0;0],1,5; [1;1;0],6,10; [1;0;3],11,20) ( je sais que c'est faux mais avant j'utilisais avec maple des boucles for à chaque fois) comment faire?

    pour la deuxième boucle je ne peux pas écrire D= cat(2,dx,dy,dz); ça répond pas à ce que je veux faire
    j'aimerais par exemple affecter au vecteur D1 le vecteur colonne [dx1 dy1 dz1]
    est à D2 le vecteur colonne [dx2 dy2 dz2]

    ainsi de suite, en réalité j'ai 472 itération donc mon i est égal à 472 et dans la suite de mon algorithme j'aurais besoin de faire par exemple le Cross Product de la première colonne de la matrice U avec D1 et ainsi de suite

    en travaillant avec maple puisqu'on n'a pas ce problème d'indice j'écrivais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i from 1 to 472 do 
    T[i]:=CrossProduct(U[i],D[i])
    end do;
    mais avec matlab je ne peux plus écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i=1:472
    T(i)=cross(U(i),D(i))
    %ou bien T=cross(U,D) en supposant U est D deux matrices 
    end

  8. #8
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Pour des éléments non homogènes, tu peux définir plusieurs variables, ou encore les stocker toutes dans un cell array
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    % plusieurs variables
    U1= repmat([1;0;0],1,5);
    U2= repmat([3;2;1],6,10);
    % un cell-array de matrice
    U= {repmat([1;0;0],1,5; [1;1;0],6,10; [1;0;3],11,20);repmat([3;2;1],6,10)};
    Mais note que si tes vecteurs ne sont pas de la même dimension, la somme ou le produit scalaire n'a pas de sens de tout façon !

    pour la deuxième boucle je ne peux pas écrire D= cat(2,dx,dy,dz);
    bien sur que si, il faut juste réfléchir un peu! J'ai supposé que les dx,dy,dz sont des colonnes, et j'ai construit la matrice D= [dx,dy,dz]; dont la ième ligne D(i,: ) = [dx(i),dy(i),dz(i)]. Si tu veux des colonnes bah il suffit de transposer via D= D'. Si les dx dy dz sont des lignes et pas des colonnes, il suffit de les transposer, ou de les concaténer suivant l'autre dimension !

    Et c'est la que la magie de la vectorisation matlab opère: pour calculer tous les produits scalaires entre chaque colonne de U et chaque colonne de D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pscalaires= U' * D;
    % avec pscalaires(i,j)= < U(:i) ; D(:,j) >

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    bien sur que si, il faut juste réfléchir un peu! J'ai supposé que les dx,dy,dz sont des colonnes, et j'ai construit la matrice D= [dx,dy,dz]; dont la ième ligne D(i,: ) = [dx(i),dy(i),dz(i)]. Si tu veux des colonnes bah il suffit de transposer via D= D'. Si les dx dy dz sont des lignes et pas des colonnes, il suffit de les transposer, ou de les concaténer suivant l'autre dimension !
    oui je comprends bien votre raisonnement mais si je travaille avec 472 colonnes je ne peux plus écrire D=[dx,dy,dz,.......] et déjà les composantes de ma matrice sont des inconnus ( que j'ai nommée avant dx1...dxn, dy1...dyn, dz1...dzn):
    j'aimerais pouvoir écrire cette matrice
    D=
    dx1 dx2 ... dxn
    dy1 dy2 ... dyn
    dz1 dz2 ... dzn

    sachant que les dxi, dyi et les dzi sont des variables qui représentent le déplacement que je vais les déterminer par la suite.
    MERCI

  10. #10
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    je ne peux plus écrire D=[dx,dy,dz,.......]
    il suffit de les mettre dans un cell array data et de faire cat(1,data{:});

    sont des variables qui représentent le déplacement que je vais les déterminer par la suite
    Ce sont des inconnues ou des valeurs numériques ? Si ce sont des inconnues, ce n'est pas la bonne manière de procéder. Pourquoi aggréger D à partir de plusieurs variables symboliques ? il vaut mieux définir une unique matrice symbolique D, et passer par exemple D(:,1) à la place de dx.

Discussions similaires

  1. PB avec Update dans une boucle FOR
    Par bagandcass dans le forum PL/SQL
    Réponses: 2
    Dernier message: 25/07/2013, 18h46
  2. [Batch] Pb avec la commande "Findstr" dans une boucle "For"
    Par Salent dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 10/12/2012, 13h57
  3. [Débutant] Changez l'indice d'itération dans une boucle for
    Par lekev62 dans le forum MATLAB
    Réponses: 5
    Dernier message: 18/11/2009, 14h16
  4. Réponses: 2
    Dernier message: 28/08/2006, 18h17
  5. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22

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