Векторизация для петель - PullRequest
0 голосов
/ 28 апреля 2011

В MATLAB векторизованный код работает быстрее, чем использование циклов for.Я пытался сделать это, но я не до конца понимаю, как это работает.Я надеялся, что кто-нибудь покажет мне, как улучшить эти 2 для циклов и цикла while с изменением индексов, чтобы я мог обдумать это.Любая помощь будет потрясающей.

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

Примечание w, u_diff, sd, rank_ind и fr_b - все массивы

1 Ответ

1 голос
/ 28 апреля 2011

Дайте мне посмотреть, правильно ли я вас понимаю: вы хотите скопировать значение fr_bw в fg, только если никакое соответствующее значение в u_diff не меньше D*sd, а w выше некоторого порога, право?

В этом случае вы можете переписать свой код следующим образом:

%# 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...