提升连接组件无法正常工作

时间:2015-07-23 07:56:52

标签: c++ algorithm boost

我无法让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连接的组件并没有给我正确的答案。

0 个答案:

没有答案