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