我无法让boost的连接组件算法可靠地工作。我想用它来分离3D点数据的集合。我有一个数据集,其中有两个明显的“群集”的3D点被大距离隔开。
我创建了一个带有捆绑信息的无向Boost图形对象,这是一个简单的“点”类,它包含一个x,y和z属性以及一个计算该点与另一个点的距离的方法。
adjacency_list<vecS, vecS, undirectedS,Point> Graph;
我有一个点信息矢量(Point_dat),我现在转移到图的顶点
for (size_t i = 0; i < Inter_dat.size(); i++)
{
// Create a new vertex for every element of the original data
add_vertex(Graph);
(Graph)[i] = Point_dat[i];
}
我现在遍历图形的顶点(在两个循环中)来计算从每个顶点到另一个顶点的距离(我知道有更有效的方法可以做到这一点,但这是第一次尝试) 如果两点之间的距离低于阈值,我在两个顶点之间添加一条边。
typedef adjacency_list<vecS, vecS, undirectedS, Point>::vertex_iterator iterator;
std::pair<iterator, iterator> p = vertices(Graph);
for (iterator it = p.first; it != p.second; it++)
{
for (iterator it2 = it; it2 != p.second; it2++)
{
double thisdist = Graph[*it].Distance(Graph[*it2]);
if (thisdist < distance_thresh & thisdist > 0)
{
add_edge(*it,*it2, Graph);
}
}
}
然后我计算连接的组件。
std::vector<int> comp(num_vertices(Graph));
int num = connected_components(Graph, &comp[0]);
问题是,数据没有被分成两个集群。主群集仍然包含一些第二个。事实上,如果我使用最大的组件(由Boost选择)重新运行分析,它会找到许多新组件。
为什么不工作?我需要添加不同的参数吗?
更新:为了提供更多上下文,我正在尝试实现我在Matlab中用C ++开发的过程。为了尝试查看问题的根源,我保存了图表的边缘
std::ofstream myfile("D:\\edges.txt");
auto q = edges(Graph);
for (auto it = q.first; it != q.second; ++it)
myfile << *it << std::endl;
myfile.close();
并将结果数据导入Matlab。然后,我使用Matlab的连接组件处理这个边缘信息,它给了我完全正确的答案。我似乎正确地设置了图形,但Boosts连接的组件并没有给我正确的答案。