如何在不使用Matlab中的嵌套循环的情况下最有效地比较坐标对?

如何在不使用Matlab中的嵌套循环的情况下最有效地比较坐标对?,matlab,comparison,coordinates,memory-efficient,Matlab,Comparison,Coordinates,Memory Efficient,如果我有20对坐标,它们的x和y值是: x y 27 182 180 81 154 52 183 24 124 168 146 11 16 90 184 153 138 133 122 79 192 183 39 25 194 63 129 107 115 161 33 14 47 65 65 2 1 124 93 79 现在,如果我随机生成15对坐标(x,y),并想与上面给出的20对坐标进行比较,我如何才能在没有嵌套循环的情况下最有效地进行比较?如果您原来的20个点不会

如果我有20对坐标,它们的x和y值是:

x   y
27  182
180 81
154 52
183 24
124 168
146 11
16  90
184 153
138 133
122 79
192 183
39  25
194 63
129 107
115 161
33  14
47  65
65  2
1   124
93  79

现在,如果我随机生成15对坐标(x,y),并想与上面给出的20对坐标进行比较,我如何才能在没有嵌套循环的情况下最有效地进行比较?

如果您原来的20个点不会改变,那么如果您将它们排序为O(n log n),效率会更好;然后,您可以通过O(logn)搜索查看列表中是否有每个随机点

如果“原始”点列表发生更改(插入/删除),则可以使用二叉树获得同等的性能

但是:如果你的分数和你的问题一样低,你的双循环可能是最快的方法!随着数据量变得越来越大,具有低Big-O曲线的算法将变得更快,但这通常是以一次性减速为代价的(在您的情况下是排序),并且只有15x20个数据点。。。不会有人类可察觉的差异;如果在系统时钟上计时,您可能会看到一个。或者你可能不会


希望这有帮助

如果您试图查看15个随机生成的坐标对中的任何一个是否等于20个原始坐标对中的任何一个,一个简单的解决方案是使用如下函数:

isRepeated
将是一个15乘1的逻辑数组,其中
newPts
行存在于
oldPts
中,否则为零。

如果您的坐标是1)实际整数,2)它们的跨度是合理的(否则使用稀疏矩阵),我将使用一个简单的真值表。像

x_0= [27 180 ...
y_0= [182 81 ...
s= [200 200]; %# span of coordinates
T= false(s);
T(sub2ind(s, x_0, y_0))= true;
%# now obtain some other coordinates
x_1= [...
y_1= [...
%# and common coordinates of (x_0, y_0) and (x_1, y_1) are just
T(sub2ind(s, x_1, y_1))
x_0= [27 180 ...
y_0= [182 81 ...
s= [200 200]; %# span of coordinates
T= false(s);
T(sub2ind(s, x_0, y_0))= true;
%# now obtain some other coordinates
x_1= [...
y_1= [...
%# and common coordinates of (x_0, y_0) and (x_1, y_1) are just
T(sub2ind(s, x_1, y_1))