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 :

Calcul angle entre 2 vecteurs, gratter la milliseconde ?


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2016
    Messages : 2
    Par défaut Calcul angle entre 2 vecteurs, gratter la milliseconde ?
    bonjour,

    je suis actuellement stagiaire dans une société spatiale et je developpe un petit outil en matlab pour faire des calculs d'orbites, mon soucis c'est qu'une simultation prend presque 48 h !!!

    j'ai en fait une fonction tres gourmande en temps de calcul qui est lancée plusieurs milliards de fois donc gratter quelques milliseconde serait un plus !

    la fonction calcule un angle en radian entre 2 vecteurs (en 3 dimension.
    en entrée : v et u deux vecteurs 3-sur-n
    en sortie : un angle en radian entre u et v (n-sur-1)

    et le code que je pense deja optimisé au max, mais si quelqu'un connait une astuce ou deux ... pour gratter du temps CPU...

    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
    25
    26
     
    function angle = searchAngle(u, v)
     
    norm = @(v) sqrt(sum(v.^2, 2));
    dot = @(u, v) sum(u .* v, 2);
    cross = @(a, b) [ a(:,2) .* b(:,3) - a(:,3) .* b(:,2), ...
          a(:,3) .* b(:,1) - a(:,1) .* b(:,3), ...
          a(:,1) .* b(:,2) - a(:,2) .* b(:,1) ];
     
    normVect = norm(u) .* norm(v);
     
    dotVect = dot(u, v); 
    threshold = normVect * 0.9999;
     
    idx1 = dotVect > threshold;
    axis = cross(v(idx1,:), u(idx1,:));
    angle(idx1) = asin(norm(axis) ./ normVect(idx1));
     
    idx2 = dotVect < -threshold;
    axis = cross(v(idx2,:), u(idx2,:));
    angle(idx2) = pi - asin(norm(axis) ./ normVect(idx2));
     
    idx = ~(idx1 | idx2);
    angle(idx) = acos(dotVect(idx) ./ normVect(idx));
     
    end

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Un truc qui doit sans doute ralentir ton code c'est que tu ne fais pas de "préallocation" pour la variable angle, du coup le programme doit resizer angle à la volée pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    angle(idx1) = asin(norm(axis) ./ normVect(idx1)); %redimentionnement a la volee de angle, c est lent
     
    angle(idx2) = pi - asin(norm(axis) ./ normVect(idx2));  %pareil
    Du coup tu pourrais définir angle en début de fonction comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    angle = zeros(1,n)
     
    %ensuite pareil
    angle(idx1) = asin(norm(axis) ./ normVect(idx1)); % pas de resize angle est deja pret
     
    angle(idx2) = pi - asin(norm(axis) ./ normVect(idx2));  %pareil
    De plus dans les versiond recented de matlab les fonction cross et dot sont définies, tu devrais pouvoir les utiliser telle quelle sans les redefinir.
    Sinon petit truc :
    dot(a,b) = a*b'
    norm(a) = sqrt(a*a')

  3. #3
    Membre émérite
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Par défaut
    salut,

    une possibilité serait de se passer des pointeurs de fonctions. En calculant directement les vecteurs tu devrais gagner (un tout petit peu) en vitesse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    normU = sum(u.^2, 2); normV = sum(v.^2, 2);
    Pour le produit vectoriel, tu peux essayer de regarder cette fonction (un produit vectoriel qui se veut rapide, tu dois pouvoir n'utiliser que les deux dernière lignes) :
    http://www.mathworks.com/matlabcentr...ectorCross3d.m

    Le gros des calculs se fait de toutes facons dans asin et acos, et là c'est difficile d'accélerer plus...

    Sinon il semble que tes vecteurs soient dans des tableaux N-par-3, et par 3 par N, non ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Quel est l'ordre de grandeur de n ?

    Citation Envoyé par kajtp Voir le message
    dot(a,b) = a*b'
    norm(a) = sqrt(a*a')
    Ce qui s'écrit avec MATLAB sans l'opérateur de transposition :


  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2016
    Messages : 2
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Quel est l'ordre de grandeur de n ?
    la valeur de n est 222651 !!

    je regarde ton code..

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Tu gagneras déjà du temps en utilisant des vecteurs 3xN et non pas Nx3 :

    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
    clc
    clear all
     
    n = 222651;
     
    u = rand(n, 3);
    v = rand(n, 3);
     
    tic
    angle = searchAngle(u, v);
    toc
     
    clear functions
    clear angle
     
    tic
    u = u.';
    v = v.';
    angle = searchAngle(u, v);
    toc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Elapsed time is 0.026036 seconds.
    Elapsed time is 0.018571 seconds.
    L'opérateur de transposition est juste la pour l'exemple.
    L'idéal serait de pouvoir modifier les dimensions des deux tableaux dès leur création.

Discussions similaires

  1. Calculer le signe de l'angle entre 2 vecteurs. (en 3D)
    Par Invité dans le forum Mathématiques
    Réponses: 5
    Dernier message: 05/07/2014, 11h50
  2. [GLSL] Calculer un angle entre deux vecteurs.
    Par who_knows dans le forum OpenGL
    Réponses: 5
    Dernier message: 05/05/2010, 17h40
  3. Programmation Python angles entre deux vecteurs
    Par Manudu38 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 18/11/2009, 18h17
  4. Calcul d'angle entre deux vecteurs
    Par feynman dans le forum Fortran
    Réponses: 8
    Dernier message: 22/09/2007, 13h59
  5. Calcul d'angle entre 2 vecteurs - direction
    Par lothei dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 03/09/2007, 19h29

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