Оптимизация формулы Matlab без циклов for

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

для я = 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 без петель, но как мне это сделать, чтобы охватить все возможные тета?


РЕДАКТИРОВАТЬ: Теперь мне нужно знать, как добавить 1 к обозначенной ячейке в матрице аккумулятора с заданным вектором координат x и y. Например, скажем, что у меня есть такие векторы, как:

x: [1 2 1 3]
y: [1 3 1 4]

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

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

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


person EWER115    schedule 16.11.2014    source источник
comment
Какая польза от j там?   -  person Divakar    schedule 16.11.2014
comment
j предназначен для доступа к правильному значению в массиве аккумуляторов для тета для голосования   -  person EWER115    schedule 17.11.2014
comment
Не могли бы вы отформатировать раздел EDIT? Тяжело читать это так, как сейчас.   -  person Divakar    schedule 18.11.2014


Ответы (2)


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

theta_vec = [-pi/2:nBinsTheta:pi/2-nBinsTheta].'; %//'
ro_vals = round( cos(theta_vec)*x + sin(theta_vec)*y );
person Divakar    schedule 16.11.2014
comment
Спасибо за идею, теперь у меня новая проблема. Мне нужно добавить 1 к массиву аккумуляторов для каждого значения тета-ро. Проблема в том, что мне нужно добавить 1 несколько раз в одну и ту же ячейку в матрице аккумулятора, и у Matlab есть проблема с кодом, например: A ([1 1 1]) = A ([ 1 1 1]) + 1 , он добавит 1 только один раз. Моя проблема в том, что когда я говорю A (rho (:), theta (:)) = A (rho (:), theta (:)) + 1; существует много дубликатов rhos и theta, и поэтому они не будут должным образом добавлять 1 несколько раз. Как я могу сделать это по-другому? Тета и ро дискретизированы до надлежащего интервала... - person EWER115; 17.11.2014
comment
@ EWER115 Трудно читать коды в комментариях. Не могли бы вы отредактировать вопрос с этими дополнительными деталями и кодами? - person Divakar; 17.11.2014

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: предыдущий ответ может не работать из-за оператора умножения матриц * вместо поэлементного .*

person Dima Lituiev    schedule 16.11.2014
comment
Что ж, в моем решении (другом) я использую матричное умножение с участием двух векторов, что приводит к двумерной матрице (как указано в нем). То есть это похоже на Nx1, умноженное на 1xM, и это не поэлементное умножение, а матричное умножение, в результате чего получаются те же значения, что и при ro внутри этих вложенных циклов. Так что должно работать :) - person Divakar; 16.11.2014