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 :

produit vectoriel dans une boucle


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut produit vectoriel dans une boucle
    mabrouk l'3id pout tt le monde;
    je veux calculer le produit vectoriel de plusieurs vecteur d'une maniere successif de telle sort voir s'il y a intersection entre ces vecteurs voila l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    J =[ -0.1351 0.9908 -0.0000];
     
    K =[ -0.1930 0.9812 0.0000];
     
    L =[-0.1351 0.9908 -0.0000];
     
    cross(J,L)
    cross(J,K)
    cross(L,J)
    je veux calculer ce produit mais dans une boucle parceque j'en ai plusieurs vecteurs dans les elemets d'entrée
    quelqu'un peux d'aidée

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    bonjour,

    Si tu as plusieurs vecteurs et que tu souhaites faire le produit vectoriel 2 à 2, tu peux utiliser nchoosek pour trouver tous les couples.

    Sur ton exemple, voici ce que ca peut donner. J'ai fait ca rapidement. Tu dois surement pouvoir optimiser tout ca...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    % Définition de tes vecteurs dans une cellule
    A{1}=[ -0.1351 0.9908 -0.0000];
    A{2}=[ -0.1930 0.9812 0.0000];
    A{3}=[-0.1351 0.9908 -0.0000];
     
    % Trouve toutes les permutations de tes vecteurs
    res=nchoosek(1:length(A),2)
     
    % Calcule le produit vectoriel
    for i=1:length(res)
    resfinal{i}=cross(A{res(i,1)},A{res(i,2)});
    end

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut
    Merci bcp pour votre reponse
    voici la matrice d'entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    K =
     
      Columns 1 through 9 
     
       -0.7071   -0.0647   -0.0684   -0.0499   -0.0919   -0.0912   -0.1930   -0.1351   -0.1930
        0.7071    0.9979    0.9977    0.9988    0.9958    0.9958    0.9812    0.9908    0.9812
       -0.0000    0.0000    0.0000    0.0000    0.0000   -0.0000    0.0000   -0.0000    0.0000
     
      Column 10 
     
       -0.1351
        0.9908
       -0.0000
    chaque ligne est un vecteur

    comment je peux Définir les vecteurs dans une cellule

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Tu n'as pas besoin de définir une cellule pour chaque vecteur. Je ne pensais pas que tu avais déjà une variable qui contenait tous tes vecteurs.

    Dans ce cas, c'est encore plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    % Tu récupères les dimensions de ta variable contenant ton vecteur
    [c,l]=size(K);
     
    % Trouve toutes les permutations de tes vecteurs
    res=nchoosek(1:c,2)
     
    % Calcule le produit vectoriel
    for i=1:length(res)
    resfinal{i}=cross(K(:,res(i,1)),K(:,res(i,2)));
    end

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut
    Merci bcp tu as bien m'aidée pour ce programme

    ds le resfinal je trouve
    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
     
    resfinal = 
     
      Columns 1 through 6
     
        [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]
     
      Columns 7 through 12
     
        [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]
     
      Columns 13 through 18
     
        [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]    [3x1 double]
     
      Column 19
     
        [3x1 double]

    normalement pour chaque [ 3x1 double ] c'est un vecteur
    comment puis-je recuperer les vecteur parceque je dois eleminer la valeur nulle pour chaque 3 eme composante pour chaque vecteur

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Le résultat final est contenue dans une cellule.

    Regarde dans la faq pour plus de détail:
    cellule

    tu peux récupérer les résultats de chaque produit vectoriel deux à deux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    resfinal{1}
    resfinal{2}
    % etc

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut
    Merci bcp encore une fois

    les valeurs que j'ai trouve sont tres petite en comparisant avec la 3 eme composante de chaque vecteur

    mnt je veux faire une sorte de normalisation c'est a dire je prends la 3 eme composante de chaque vecteur et voir s'il est no nulle c'est le cas je dois la diviser par la 1er et la 2eme composante comme ce cela :
    resfinal [p1;p2;p3] ca sera resfinal[p1/p3;p2/p3,1]

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Heu juste une remarque en passant. Tes vecteurs ne sont pas les lignes de ta variable K mais les colonnes non ?

    Si c'est le cas, tu dois boucler sur les indices des lignes et non des colonnes. Pour 10 vecteurs, tu obtiens 45 combinaisons possibles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % Tu récupères les dimensions de ta variable contenant ton vecteur
    [c,l]=size(K);
    
    % Trouve toutes les permutations de tes vecteurs
    res=nchoosek(1:l,2)
    
    % Calcule le produit vectoriel
    for i=1:length(res)
    resfinal{i}=cross(K(:,res(i,1)),K(:,res(i,2)));
    end
    Pour la suite, je pense que tu peux faire la normalisation tout seul. C'est pas très compliquer de diviser deux vecteurs. Code quelque chose et reviens si tu as un problème ou une erreur. Je ne vais pas tout faire quand même

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut
    je suis desolé si je te derange par mes question ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    % Calcule le produit vectoriel
    for i=1:length(res)
    resfinal{i}=cross(K(:,res(i,1)),K(:,res(i,2)));
     
    resfinal{i}= resfinal{i}(1)/ resfinal{i}(3),resfinal{i}(2)/ resfinal{i}(3),resfinal{i}(3)/ resfinal{i}(3)
     
    end
    voila ce que je viens de faire

    mais il me donne une erreur

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Tu ne me dérange pas avec tes questions, sinon, je n'aurais pas répondu à tes messages. C'est juste que je suis là pour aider (dans la mesure de mes moyens) et non pas pour donner des réponses sans que les posteurs ne réfléchissent un minimum au problème qu'ils ont.

    Tu as posté rapidement ce nouveau message et j'en déduis donc que tu n'as pas lu le lien de la faq que j'ai pu t'envoyer. Prend le temps de lire la définition d'une cellule.

    Sinon, l'erreur que tu as est logique. Quand tu vas faire ta normalisation, tu vas écraser le résultat de ton produit vectoriel. Change le nom de la variable qui calcule ta normalisation.

    Tu auras également un problème avec la sauvegarde dans cette nouvelle variable. Regarde à nouveau la FAQ sur les cellules. il faut que tu rentres un vecteur dans chaque cellule. Donc que tu mettes des crochets [] quand tu enregistres le résultat de ta normalisation.

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut
    voila le code que j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [h,s]=size(resfinal)
     
    for i=1:s
        P(i)=resfinal{i}(1)/ resfinal{i}(3),resfinal{i}(2)/ resfinal{i}(3),resfinal{i}(3)/ resfinal{i}(3);
    end
    voila l'erreur
    ?? Cell contents assignment to a non-cell array object.

    Error in ==> GMC at 44
    P{i}=resfinal{i}(1)/ resfinal{i}(3),resfinal{i}(2)/ resfinal{i}(3),resfinal{i}(3)/ resfinal{i}(3);
    votre remarque??

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    C'est en effet la deuxième erreur que je te signalais. Il faut que tu ajoutes des [] sur ton calcul en passant par une cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [h,s]=size(resfinal)
    
    for i=1:s
        P{i}=[resfinal{i}(1)/ resfinal{i}(3);resfinal{i}(2)/ resfinal{i}(3);resfinal{i}(3)/ resfinal{i}(3)];
    end

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 329
    Points : 88
    Points
    88
    Par défaut
    toujours la meme erreur

    h =
    1

    s =

    45

    ??? Cell contents assignment to a non-cell array object.

    Error in ==> GMC at 43
    P{i}=[resfinal{i}(1)/ resfinal{i}(3),resfinal{i}(2)/ resfinal{i}(3),resfinal{i}(3)/ resfinal{i}(3)];

Discussions similaires

  1. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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