2016-06-07 4 views
0

Mon code semble fonctionner très lentement et je ne vois aucun moyen de le rendre plus rapide. Tous mes tableaux ont été préalloués. S est un grand nombre d'éléments (par exemple 10000 éléments, par exemple). Je sais que mon code fonctionne lentement à cause du "pour k = 1: S" mais je ne peux pas penser à une autre façon d'effectuer cette boucle à une vitesse relativement rapide. Puis-je obtenir de l'aide, car il faut des heures pour fonctionner.Le code est très lent

[M,~] = size(Sample2000_X); 
[N,~] = size(Sample2000_Y); 
[S,~] = size(Prediction_Point); 

% Speed Preallocation 
Distance = zeros(M,N); 
Distance_Prediction = zeros(M,1); 

for k=1:S 
    for i=1:M 
     for j=1:N 
      Distance(i,j) = sqrt(power((Sample2000_X(i)-Sample2000_X(j)),2)+power((Sample2000_Y(i)-Sample2000_Y(j)),2)); 
     end 
     Distance_Prediction(i,1) = sqrt(power((Prediction_Point(k,1)-Sample2000_X(i)),2)+power((Prediction_Point(k,2)-Sample2000_Y(i)),2)); 
    end 
end 

Merci.

+1

Décrivez ce que vous essayez de faire avec votre code. – Dan

Répondre

0

Je me suis rendu compte que le problème majeur était l'organisation de mon code. J'effectuais le calcul dans une boucle où c'était absolument inutile. J'ai donc séparé le code en deux blocs et cela fonctionne beaucoup plus vite.

for i=1:M 
    for j=1:N 
     Distance(i,j) = sqrt(power((Sample2000_X(i)-Sample2000_X(j)),2)+power((Sample2000_Y(i)-Sample2000_Y(j)),2)); 
    end 
end 

for k=1:S 
    for i=1:M 
    Distance_Prediction(i,1) = sqrt(power((Prediction_Point(k,1)-Sample2000_X(i)),2)+power((Prediction_Point(k,2)-Sample2000_Y(i)),2)); 
    end 
end 

Merci à la communauté pour l'aide.

0

Votre matrice Distance ne dépend pas de k, donc vous pouvez facilement calculer l'extérieur de la principale for -loop, par exemple en utilisant:

d = sqrt((repmat(Sample2000_X, [1,M]) - repmat(Sample2000_X', [M,1])).^2 + (repmat(Sample2000_Y, [1,N]) - repmat(Sample2000_Y', [N,1])).^2); 

Je suppose M=N, parce que elsewise votre code ne fonctionnera pas. Ensuite, vous pouvez calculer votre matrice Distance_Prediction. Il est plutôt étrange que vous calculiez ceci dans le for -loop sur k, parce que la matrice sera changée dans chaque itération sans l'employer. Quoi qu'il en soit, cela fera exactement la même chose que votre code:

for k=1:S 
     Distance_Prediction = sqrt((Sample2000_X - Prediction_Point(k,1)).^2 + (Sample2000_Y - Prediction_Point(k,1)).^2); 
    end