2011-04-28 2 views
0

Dans MATLAB, le code vectorisé est plus rapide que l'utilisation de boucles for-loops. J'ai essayé de le faire mais je ne comprends pas complètement comment cela fonctionne. J'espérais que quelqu'un pourrait me montrer comment améliorer ces 2 boucles et une boucle avec des indices changeants pour que je puisse tourner la tête. Toute aide serait incroyable.Vectorisation des boucles

width= 700; 
height= 600; 
fg= zeros(height, width); 
for i= 1: height 
    for j= 1: width 
     fg(i, j) = 0; 
     while ((match== 0)&& (k<= M)) 
      if (w(i, j, rank_ind(k))>= thresh) 
       if (abs(u_diff(i, j, rank_ind(k)))<= D* sd(i, j, rank_ind(k))) 
        fg(i, j)= 0; 
        match= 1; 
       else 
        fg(i, j)= fr_bw(i, j); 
       end 
      end 
      k= k+ 1; 
     end 
    end 
end 

Remarque w, u_diff, sd, rank_ind et fr_b sont tous les tableaux

+0

S'il vous plaît ne pas dupliquer vos questions: [Matlab vectorisation pour les boucles] (http://stackoverflow.com/questions/5820229/ matlab-vectorizing-for-loops). Au lieu de cela, vous devez modifier la question d'origine pour mieux refléter votre problème. – gnovice

+0

J'ai re posté la dernière question était confuse et le code était incorrect J'ai marqué pour être retiré et re posté avec le code correct afin qu'il puisse être compris. – user729506

+0

@ user729506: Vous auriez pu modifier votre question précédente pour la rendre plus claire. Si vous pensez que la question précédente ne peut pas être récupérée en la modifiant, vous pouvez la supprimer vous-même et faire une pause pour réfléchir à la manière d'améliorer la question avant de la publier à nouveau. – abcd

Répondre

1

Permettez-moi de voir si je comprends bien: Vous voulez copier la valeur de fr_bw dans fg uniquement si aucune valeur correspondante dans u_diff est plus petit que D*sd, et w est au-dessus d'un certain seuil, non?

Dans ce cas, vous pouvez réécrire votre code de la manière suivante:

%# find where u_diff is larger than D*sd 
%# but not where there's any u_diff that is smaller than D*sd 
whereToCopy = any(w(:,:,rank_ind) >= thresh & ... 
    abs(u_diff(:,:,rank_ind)) > D*sd(:,:,rank_ind),3) & ... 
    ~any(w(:,:,rank_ind) >= thresh & ... 
    abs(u_diff(:,:,rank_ind)) <= D*sd(:,:,rank_ind),3); 

%# whereToCopy has 1 wherever we need to copy, and 0 elsewhere 
%# thus, create fg from fr_bw directly by multiplication 
fg = double(fr_bw) .* double(whereToCopy); 
+0

Oui vous avez raison, cela pourrait être un problème très bête mais j'ai implémenté votre code, merci, mais il a retourné une erreur: Les entiers ne peuvent être combinés qu'avec des entiers de la même classe, ou scalaires doubles. Cette erreur est apparue sur la ligne fg = fr_bw. * WhereToCopy, sur les temps. Ai-je manqué quelque chose de stupide désolé? – user729506

+0

@ user729506: oui, vous avez manqué de me dire que 'fr_bw' n'est pas un double. Maintenant ça devrait marcher. – Jonas

+0

Mes excuses ne fonctionnent toujours pas mais je pense que c'est parce que j'utilise la fonction rgb2gray que détient fr_bw. fr_bw = rgbgray (fr). – user729506