我有两个如下的数据集:
set1:57.5276 55.3756 24.2798 54.5989
和
set2:55.1118 55.004 24.824 57.1398
现在,我想排列第二组,使其与第一组最接近(我的意思是57.1398 55.1118 24.824 55.004
这个顺序)。
我该如何在C ++中做到这一点。
答案 0 :(得分:0)
安排第二组,使其顺序与第一组相同。
更具体地说,第一组从最大数(57.5276
)到第二最大数(55.3756
)到第四大数到第三大数。
以相同的方式安排第二组。最大(57.1398
,第二大(55.004
),第四大(24.824
),第三大(57.1398
)依次排列。这样可以最大程度地减少相同索引项之间的平均差异。
从编程上来说,实现此目标的一种简单方法是对两个集合进行排序,然后查找第一集合中每个数字的排序索引,并以相同的顺序排列第二个集合。
答案 1 :(得分:0)
匹配“最接近”应该更好一些。可能是“最小平方误差”,“最小绝对误差”,“最大相关性”,它们都会给出不同的结果。
取决于“最接近”的含义,您可能必须遍历set2的所有排列,这将非常昂贵。如果要使用“对两个集合进行排序”的解决方案,那么在c ++中实现这一点同时又要保留第一个集合的顺序的一种可能方法是创建索引向量到set1中,然后根据set1 < / p>
std::vector<double> set1{{57.5276,55.3756,24.2798,54.5989}};
std::vector<size_t> set1index(set1.size());
std::iota(set1index.begin(), set1index.end(), 0);
std::sort(set1index.begin(), set1index.end(), [&](size_t a, size_t b){return set1[a] < set1[b];});
然后可以对set2进行排序,并使用索引使用set2的值重新创建set1的顺序。