Algorithm 查找多个数组中最近的元素

Algorithm 查找多个数组中最近的元素,algorithm,matlab,grouping,matching,closest,Algorithm,Matlab,Grouping,Matching,Closest,假设我有两个数组: a=[10 21 50 70 100 120]; b=[18 91]; 我想匹配a和b中距离最近且在10个单位以内的(单个)元素 结果: idxa=[1 2 3 4 5 6] idxb=[2 5] 匹配的元素共享相同的编号 我感到困惑,因为我不确定如何确保(例如)18与21匹配,而不是10匹配,因为它们都满足彼此在10个单位内的要求。此外,我想在几个(最多8个)列表中执行此操作,代码变得过于复杂,我觉得有一个我缺少的简单解决方案。我不担心效率,因为列表的长度很小 谢谢大

假设我有两个数组:

a=[10 21 50 70 100 120];
b=[18 91];
我想匹配a和b中距离最近且在10个单位以内的(单个)元素

结果:

idxa=[1 2 3 4 5 6]

idxb=[2 5]
匹配的元素共享相同的编号

我感到困惑,因为我不确定如何确保(例如)18与21匹配,而不是10匹配,因为它们都满足彼此在10个单位内的要求。此外,我想在几个(最多8个)列表中执行此操作,代码变得过于复杂,我觉得有一个我缺少的简单解决方案。我不担心效率,因为列表的长度很小


谢谢大家!

您的数组似乎已排序(我将根据该假设继续;如果没有,您可以简单地对它们进行排序)

您是否尝试过将多个阵列合并到一个更大的阵列中?(类似于合并排序的合并步骤)。这将是一个很好的起点,因为它将减少“在数组中查找壁橱元素”的问题,相比之下,这是一个微不足道的问题

这也将允许您删除重复项;即将阵列中的所有'21'减少为单个'21'

为了确保18匹配21而不是10,您需要计算键(18)与10个单位([10,21])内的每个值之间的差值,然后选择差值最小的一个


更新:针对您关于仅查找所有数组的公共值的评论,可以在合并数组时通过查找数组的交集来完成此操作,这实际上可能是一种预定义的方法,具体取决于您的语言。

对于小型数组,这可以通过蛮力完成:

(1) 迭代两个数组中较小的一个,然后迭代较大的数组
(2) 跟踪“迄今为止最接近的匹配”CMSF
(3) 如果找到更好的匹配项,请更新CMSF

(4) 当您到达列表的末尾时,如果CMSF是跨多个列表执行此操作,您是否总是与同一个列表进行比较?或者您是否希望找到所有三个列表的“通用”项?另外:如果是领带,会发生什么情况?我希望找到“通用”项对于所有三个。实际数据实际上是小数,所以不应该有关系。如果有,应该只取它首先找到的任何一个。在我看来,这很像一个最小成本最大二部匹配问题。这也被称为数组是否被排序(它们似乎是这样的)这不必迭代整个数组。如果CMSF超过阈值(在本例中为10),则无需跟踪该CMSF,并且在设置CMSF<10并找到一个大于10的元素(再次假设数组已排序)后,无需继续