【问题标题】:Matlab formula optimization without for loops没有for循环的Matlab公式优化
【发布时间】:2015-01-13 16:00:14
【问题描述】:

我正在尝试实现霍夫变换算法。算法有效,但速度很慢。 目前我在两个for循环中通过这个等式计算rho:

对于 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

结束

我怎样才能简化这个,在没有 for 循环的情况下工作? 我需要在没有循环的情况下计算 ro,但我该怎么做才能涵盖所有可能的 theta?


编辑:现在我需要知道如何在给定 x 和 y 坐标向量的情况下将 1 加到累加器矩阵中的指定单元格。例如,假设我有如下向量:

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

我想在没有循环的情况下解决这个问题。我知道我需要使用 sub2ind 转换为线性索引,但问题是会有很多相同的线性索引,例如我给出的,会有 2x1 (1 ,1 坐标重复两次)。如果您尝试像这样添加 1:

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

它只会加 1 一次,这是我的问题。

【问题讨论】:

  • 里面j有什么用?
  • j 是为了在累加器数组中获取适当的值,以便进行投票
  • 你能格式化编辑部分吗?很难像现在这样阅读。

标签: matlab computer-vision vectorization hough-transform


【解决方案1】:

假设 xy 是行向量,您可以使用以下代码预先计算 2D 矩阵中的所有 ro 值,这有望在其余的嵌套循环中为您加快速度您可能正在做的涉及ro 值的工作 -

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

【讨论】:

  • 感谢您的想法,现在我有一个新问题。我需要为每个 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 很难通过 cmets 读取代码。你能用这些额外的细节和代码编辑问题吗?
【解决方案2】:
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:由于矩阵乘法运算符* 而不是逐元素.*,上一个答案可能不起作用

【讨论】:

  • 在我的解决方案(另一个)中,我使用涉及两个向量的矩阵乘法得到一个二维矩阵(如其中所述)。也就是说,就像Nx1 乘以1xM,这不是逐元素乘法,而是矩阵乘法,在这些嵌套循环中得到与ro 相同的值。所以,这应该工作:)
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多