2014-11-16 4 views
1

Я пытаюсь реализовать алгоритм преобразования Hough. Алгоритм работает, но он медленный. В настоящее время я рассчитать Rho, этим уравнением в два для петель:Оптимизация формулы Matlab без циклов

для я = 1: длина (х)

j=1; 
for theta = -pi/2:nBinsTheta:pi/2-nBinsTheta 

    ro =round(x(i).*cos(theta) + y(i).*sin(theta)); 

    .... 
j = j + 1; 
end 

конец

Как можно упростить это, чтобы работать без петель? Мне нужно рассчитать ro без петель, но как я могу это сделать, чтобы покрыть все возможные тета?


EDIT: Теперь я должен знать, как добавить 1, в назначенный ячейки в аккумуляторе матрицы с учетом х и у координат вектора. Для примера скажем, что у меня есть векторы, такие как:

х: [1 2 1 3]
у: [1 3 1 4]

Я хотел бы, чтобы решить эту проблему без петель , Я знаю, что мне нужно преобразовать в линейные индексы, используя sub2ind, но проблема в том, что будет много одинаковых линейных индексов, например, которые я дал, будет 2x1 (координата 1,1 повторяется дважды). Если вы попытаетесь добавить 1 так:

A ([1 1]) = A ([1 1]) + 1;

он добавит 1 только один раз, это моя проблема.

+0

Что использование 'j' там? – Divakar

+0

j предназначен для получения правильного значения в массиве аккумуляторов для theta's для голосования – EWER115

+0

Не могли бы вы отформатировать раздел EDIT? Трудно читать, как сейчас. – Divakar

ответ

0

Предполагая x и y быть векторы-строки, вы можете использовать следующий код, чтобы заранее рассчитать все ro значения в 2D-матрице, которая, надеюсь, должны ускорить вещи для вас внутри вложенных циклов для остальной части работы, которую вы могли бы делать с участием ro значения -

theta_vec = [-pi/2:nBinsTheta:pi/2-nBinsTheta].'; %//' 
ro_vals = round(cos(theta_vec)*x + sin(theta_vec)*y); 
+0

Спасибо за вашу идею, теперь у меня возникла новая проблема. Мне нужно добавить 1 в массив аккумуляторов для каждого значения theta-rho. Проблема в том, что бывает, что мне нужно добавить 1 несколько раз к одной и той же ячейке в накопительной матрице, и у Matlab есть проблема с кодом, например, например: A ([1 1 1]) = A ([1 1 1]) + 1 , он добавит 1 только один раз. Моя проблема в том, что я говорю A (rho (:), theta (:)) = A (rho (:), theta (:)) + 1; есть много дубликатов rhos и theta's, и поэтому не будет правильно добавлять 1 несколько раз. Как я могу это сделать по-разному? Theta и rho дискретизируются до соответствующего интервала ... – EWER115

+0

@ EWER115 Трудно читать коды через комментарии. Не могли бы вы отредактировать вопрос с этими дополнительными деталями и кодами? – Divakar

+0

Я отредактировал вопрос ... – EWER115

0
assert(all(size(x) == size(y)), 'dimension mismatch: x, y') 

theta = (-pi/2:nBinsTheta:pi/2-nBinsTheta)'; 

assert(all(size(theta) == size(y)), 'dimension mismatch: theta, y') 

rho = x.*cos(theta) + y.*sin(theta); 

rho_rounded = round(rho); 

ли вам действительно нужны j?

PS: предыдущий ответ не может работать из-за матрицы оператора умножения * вместо поэлементно .*

+0

Ну, в моем решении (другое), я использую матричное умножение с участием двух векторов, приводящих к 2D-матрице (как указано в ней). То есть, это как «Nx1», умноженное на «1xM», и это не элементное умножение, это умножение матрицы, что приводит к тем же значениям, что и «ro» внутри этих вложенных циклов. Итак, это должно работать :) – Divakar

Смежные вопросы