测试相似性不会检索预期的布尔计数?

时间:2014-07-07 17:02:25

标签: vb.net floating-point similarity floating-point-precision grasshopper

测试两组十进制数字之间的相似性(位于this link上的pt1和pt2的x和y坐标)。我没有得到预期的布尔值计数(15,682)。可能是decimal to binary conversion问题吗?更改阈值并不总是有帮助,特别是对于更多数字。任何帮助将不胜感激!

x是双打的排序列表

for i = 1 to x.count-1
if Math.Abs(x(i)-x(i-1))<myThreshold then... 

2 个答案:

答案 0 :(得分:2)

由于浮点数具有一定数量的有效数字(与固定点的设定小数位数相反),绝对差值将在较大值和相对误差之间区别较差

Math.Abs(x(i)-x(i-1)) / Math.Max(Math.Abs(x(i)), Math.Abs(x(i-1)))
应该使用

代替。 不幸的是,这往往会夸大小值之间的差异(并且对于两个等于零的值完全分解),因此对于那些绝对差异是优选的。
您可以使用标准化差异在它们之间进行权衡

Math.Abs(x(i)-x(i-1)) / (1.0+Math.Max(Math.Abs(x(i)), Math.Abs(x(i-1))))

对于幅度远大于1的值的相对差异,以及幅度远小于1的值的绝对差值。

答案 1 :(得分:1)

尽管我喜欢复杂的答案,但Grasshopper中有一个很好的cull duplicates功能。我在你的1144个值上测试了它,它返回了865个独特的值。

由于这些是分数,因此它是删除重复项的最快方法。在我的系统上,与python做同样的事情是46ms vs 1.1s。

Simple cull rig

当您将容差从0增加到0.2时,唯一点的数量会下降,但非常突然:

graph of number of unique points

所以看起来你只有相同的观点。这可能与您导出Dropbox中的数据的方式有关,但是因为您的所有数字都是6dp我认为您可以安全地使用此方法并利用David所拥有的所有优化内置。