2014-11-16 52 views
1

我想實現Hough變換算法。算法有效,但速度很慢。 目前我計算RHO,通過這個方程在兩個for循環:沒有for循環的Matlab公式優化

對於i = 1:長度(X)

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,但是我怎麼能這樣做來覆蓋所有可能的theta?


編輯︰現在我需要知道如何將1,添加到累加器矩陣中給定的單元格給定x和y座標向量。例如,讓我們說,我有像載體:

X:[1 2 1 3]
Y:[1 3 1 4]

我想解決沒有循環這個問題。我知道我需要使用sub2ind轉換爲線性索引,但問題是會有很多相同的線性索引,例如我給出的,將會有2x1(1,1座標重複兩次)。如果您嘗試像這樣添加1:

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

它只會添加1次,這是我的問題。

+0

是什麼在那裏使用j'的'的工作嗎? – Divakar

+0

j的意思是在累加器數組中存取適當的值以用於投票 – EWER115

+0

您可以格式化EDIT部分嗎?現在很難閱讀。 – Divakar

回答

0

假設xy是行向量,可以使用下面的代碼在一個二維矩陣,希望應該加快速度爲您嵌套循環裏面你可能會在剩下的工作預先計算所有ro值做涉及ro值 -

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

感謝您的想法,現在我有一個新問題。我需要爲每個theta-rho值添加1到累加器數組。問題是,我碰巧需要在累加器矩陣中添加1次到同一個單元格,而matlab有代碼問題,例如:A([1 1 1])= A([1 1 1])+ 1 ,它只會添加1次。我的問題是當我說A(rho(:),theta(:))= A(rho(:),theta(:))+ 1;有很多重複的rhos和theta,因此不會正確添加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:以前的答案可能不是因爲矩陣乘法運算符*代替的elementwise .*

+0

那麼在我的解決方案(另一個)中,我正在使用包含兩個向量的矩陣乘法生成一個2D矩陣(如上所述)。也就是說,就像'Nx1'乘以'1xM',這不是元素乘法,它是一個矩陣乘法,導致與嵌套循環內的'ro'相同的值。所以,這應該工作:) – Divakar