我有先前聚类的向量,以及当前聚类的向量。一个集群有一个2D Point2F的矢量,我想基于每个集群之间的距离来挑选出那些集群,这些集群存储在距离矢量中,或者你能建议一种更好的方法来对集群矢量进行排序吗?
distances.resize(previousClusters.size()*currentClusters.size());
for (int i=0; i<previousClusters.size()*currentClusters.size(); i++)
{
distances[i].resize(previousClusters.size()*currentClusters.size());
}
for (int i=0; i< previousClusters.size(); i++)
{
for(int j=0; j < currentClusters.size(); j++)
{
distances[i][j] = cv::norm(previousClusters[i].m_Properties.m_Center - currentClusters[j].m_Properties.m_Center );
}
}
答案 0 :(得分:4)
注意:这回答了最初编写的问题(因为它仍然写在标题中)。问题的主体已经改变为使其无效,但答案可能仍然有助于对矢量矢量进行排序。
首先,您需要确定一个向量在另一个向量之前排序的含义,并编写一个比较器:
struct compare_distance_vectors {
bool operator()(std::vector<double> const & v1, std::vector<double> const & v2) {
// implement your comparison here.
// return "true" if v1 should come before v2.
}
};
然后使用std::sort
按照排序进行排序:
std::sort(vectors.begin(), vectors.end(), compare_distance_vectors());
如果你想要词典排序(即按第一个元素排序,然后按第二个排序,如果相等,等等),那么你可以使用默认比较器({{1 },并使用std::less<value_type>
进行比较):
<
通常,要按照任何顺序对任何类型的序列(例如std::sort(vectors.begin(), vectors.end());
)进行排序,请编写类似的比较器以指定顺序,然后将std::vector<cv::Point2f>
与该比较器一起使用。
答案 1 :(得分:-1)
您可以尝试在“上部”向量上使用std::sort(第二个原型允许您首先定义“较低”向量的排序方式),然后每次调用函数对象Comp时,在每个“较低”的方法上再次使用std :: sort(这次第一个原型就够了)。
这也适用于你的第二个问题。