У меня есть следующий фрагмент кода в Matlab с двумя циклами for: «I» — это двоичное изображение, которое было предварительно выделено.

...
[x,y] = find(bwmorph(I,'endpoints'));
n=numel(x);
m=numel(x)-1;
n=m+1;
r=i+1;
for i= 1:m
for j = r:n
I=linept(I, x(i), y(i), x(j), y(j));
end;
end;
...
Функция linept приведена ниже. Она взята из файлового обмена Matlab:
function result=linept(matrix, X1, Y1, X2, Y2)
result = matrix;
a=max(1, X1);b=sign(X2 - X1);c=max(1, X2);
for x=a:b:c
y = round(f(x, X1, Y1, X2, Y2));
if y > 0
result(x, y) = 1;
end
end
d=max(1, Y1);e=sign(Y2 - Y1);g=max(1, Y2);
for y=d:e:g
x = round(f2(y, X1, Y1, X2, Y2));
if x > 0
result(x, y) = 1;
end
end
function y=f(x, X1, Y1, X2, Y2)
a = (Y2 - Y1)/(X2 - X1);
b = Y1 - X1 * a;
y = a * x + b;
function x=f2(y, X1, Y1, X2, Y2)
if X1==X2
x = X1;
else
a = (Y2 - Y1)/(X2 - X1);
b = Y1 - X1 * a;
x = (y - b)/a;
end
Из-за большого количества циклов for и вызовов функций этот код выполняется очень медленно. Он выполняется быстро для простого изображения с несколькими конечными точками, но занимает много времени, когда количество ребер больше. Это немного быстрее. если размер изображения уменьшен. Я попытался векторизовать его и предварительно распределил некоторые переменные, но особых улучшений нет. Может ли кто-нибудь помочь мне в том, как векторизовать коды, которые вызывают функции в циклах. Спасибо



func2иfunc3? Кроме того, что такоеmвn=m+1;иiвr=i+1;в начале? Точно так же этиa,b,c.. не могли бы вы добавить, что они означают? - person Divakar   schedule 05.02.2015parforдля разных изображений, чтобы улучшить время работы. Он будет распределять работу по разным ядрам на вашем компьютере. - person C.Colden   schedule 05.02.2015