如何在矩形(边界框)内检查一对成对点?

时间:2016-07-19 13:04:14

标签: matlab geometry vectorization

Pm*2点(m)的[X Y]矩阵,Rn*4矩阵n } rectangles([X1 Y1 X2 Y2])。我希望以m*n指示C中第i个点位于{{1}中的第j个矩形内部的方式形成C(i, j)矩阵P }。

单点单项:

这是我检查点是否位于矩形内的方式:

R

更具可读性:

c = (P(1)>=R(1))&(P(1)<=R(3))&(P(2)>=R(2))&(P(2)<=R(4));

在上面的代码中,我确定c = (Px>=Rxmin)&(Px<=Rxmax))&(Py>=Rymin)&(Py<=Rymax); R(1)<=R(3)

R(2)<=R(4)

多个点重复:

很容易管理R(:, [1 3]) = sort(R(:, [1 3]), 2); R(:, [2 4]) = sort(R(:, [2 4]), 2); m*1个案(like second answer here)。但我不知道如何对1*n案例进行矢量化。我目前正在使用for循环:

m*n

如何将其矢量化以提高效率?

1 个答案:

答案 0 :(得分:1)

我建议您分别使用PR的每一列,然后在结尾按位&

Px = P(:,1);
Rx1 = R(:,1).';
Rx2 = R(:,3).';

X1 = bsxfun(@ge, Px, Rx1);
X2 = bsxfun(@le, Px, Rx2);


Py = P(:,2);
Ry1 = R(:,2).';
Ry2 = R(:,4).';

Y1 = bsxfun(@ge, Py, Ry1);
Y2 = bsxfun(@le, Py, Ry2);

C = X1 & X2 & Y1 & Y2

或者如果您愿意:

C = bsxfun(@ge, P(:,1), R(:,1).')& ...  % X lower bound
    bsxfun(@le, P(:,1), R(:,3).')& ...  % X upper bound
    bsxfun(@ge, P(:,2), R(:,2).')& ...  % Y lower bound
    bsxfun(@le, P(:,2), R(:,4).');      % Y upper bound

OP已提供此时序比较

enter image description here