Bonjour à tous!
J'ai un problème de temps de calcul dans un programme et je ne comprends pas mon erreur de raisonnement, et comment l'améliorer si possible
Voilà, mon but est de créer un tableau ayant pour chaque pixel d'une image la coordonnée d'abscisse d'un sur la première colonne, la coordonnées d'ordonnée sur la seconde et enfin la valeur de ce pixel (en nuance de gris) sur la troisième et dernière colonne.
1 |
1 |
valeur |
2 |
1 |
valeur |
1 |
2 |
valeur |
2 |
2 |
valeur |
Voilà ce que ca donne pour une matrice 2x2.
J'ai commencé par le faire de façon un peu bourrin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
coord_intens=zeros(1310720,3); % je créé la matrice finale à la bonne taille (1024 * 1280 pixel = 1310720 lignes)
%remplissage de la seconde colonne
a=-1280;
for i = 1:1024
a=a+1280;
coord_intens(1+a:1280+a,2)=1+a/1280;
end
% remplissage de la première colonne
for j = 1:1280
for n = 0:1023
coord_intens((j+(n*1280)),1)=j;
end
end
% Remplissage de la dernière colonne avec les valeurs d'intensité
for k = 1:1310720
coord_intens(k,3)=image(coord_intens(k,1),coord_intens(k,2));
end
%on utilise les coordonnées déjà enregistrées dans les deux première colonnes pour remplir la troisième. |
Avant tout:
il fonctionne.
En analysant un peu, j'ai deux boucles simples, dont une avec plus d'un million d'éléments, et une double boucle.
Je me suis dis que je pouvais faire bien mieux. Alors j'ai utilisé les indexages intelligent de matlab et la fonction
ind2sub pour n'avoir plus qu'une seule simple boucle.
Voilà ce que ça donne:
1 2 3 4 5 6 7 8 9 10 11
|
coord_intens=zeros(1310720,3); %idem, on créé en avance la matrice finale
for i=1:1310720 %une seule simple boucle
[ligne, colonne]=ind2sub(size(img),i);
coord_intens(i,1)=ligne; %Pour chaque ligne, on rempli ligne et colonne
coord_intens(i,2)=colonne;
coord_intens(i,3)=img(coord_intens(i,1),coord_intens(i,2));
% et enfin on rempli la dernière colonne en utilisant les deux 1ere, comme avant
end |
Là je me suis dis:
Génial j'ai carrement gagné en complexité! Et en plus il fonctionne lui aussi
Mais en pratique, quand j'applique le programme, le premier fonctionne en quelques secondes (3 ou 4) quand le second (celui qui est censé être malin) fonctionne en 30 ou 40 secondes!
Qu'est ce qui peut bien se passer? Pourquoi ça ne fonctionne pas? Et surtout que devrais-je faire? Garder ma première version alors qu'elle me paraît moche ou travailler pour améliorer encore la seconde?
En espérant avoir été assez clair dans mes explications, je vous remercie d'avance pour votre aide
Simon
Partager