【问题标题】:C++ directed nearest neighbor sortingC++ 定向最近邻排序
【发布时间】:2016-09-03 17:18:00
【问题描述】:

所以在我的代码中,我得到了点的 xyz 坐标,它应该形成一个轮廓。问题是这些点没有以正确的方式排序。当我得到坐标时,它们按上升的 x 和 y 值排序。所以首先对 x 值进行排序,如果两个点具有相同的 x 值,则按它们的 y 值排序。 z 值始终相同,因此可以忽略。 为了对点进行排序以形成轮廓,我使用了最近邻算法的一种变体。 所以这是我的排序代码:

double squareDistancePoints(const std::array<double, 3>& a, const std::array<double, 3>& b)
{
    assert(a.size() == b.size());
    double sum = 0;
    for(size_t i = 0; i < a.size(); ++i)
        sum += pow(b[i]-a[i], 2);
    return sum;
}


for(auto it = matrix.begin(); it != matrix.end(); ++it)
{
    auto bestIt = matrix.end();

    double bestSquareDistance = DBL_MAX;

    for(auto nextIt = it + 1; nextIt != matrix.end(); ++nextIt)
    {
        const auto squareDistance = squareDistancePoints(*it, *nextIt);
        if( squareDistance < bestSquareDistance)
        {
            bestSquareDistance = squareDistance;
            bestIt = nextIt;
        }
    }
    if(bestIt != matrix.end())
    {
        std::swap(*(it + 1), *bestIt);
    }

}

因此,这非常适用于标准轮廓,例如立方体或圆形。但我也有轮廓,这是行不通的。 所以这是一张未分类轮廓的图片

当我使用我提供的排序代码时,我会收到以下结果:

我已经在我的代码的想法中发现了问题。轮廓长于宽,因此排序算法也总是错误位置上的最近点。 所以正确的图片应该是这样的:

我的方法是从一个点开始,搜索最近的点,然后按照这些点给我的方向。这一切都是我手动完成的。 所以我现在的问题是我不知道如何优化我的代码,所以它在排序时遵循一个方向。 我希望有人能帮助我。如果有帮助的话,我还可以发送一个包含未排序和排序点的 .csv 文件。

【问题讨论】:

    标签: c++ algorithm sorting nearest-neighbor


    【解决方案1】:

    您在最后一次迭代中访问了错误的数据区域:(it + 1)==matrix.end() 在这种情况下 => 未定义的行为。

    for(auto it = matrix.begin(); it != matrix.end(); ++it)
    {
        ...
        if(bestIt != matrix.end())
        {
            std::swap(*(it + 1), *bestIt);
        }
    

    【讨论】:

    • 这种未定义的行为会导致错误的结果吗?或者这只是另一个错误?因为对于规则轮廓,例如正方形和圆形,这非常有效
    • UB 仅在 (bestIt != matrix.end()) 时发生。也许它不会发生在正方形或圆形中。你告诉我(添加打印或使用调试器)
    • 我只是做了一个示例代码,这样你就可以看到我在做什么。 link
    • 即使通过我的修复,您的代码也会因使用该链接的段错误而崩溃!是时候调试了。
    • 我编辑了我的代码,现在我在执行代码link时没有收到错误消息@
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2011-12-06
    • 2016-01-08
    相关资源
    最近更新 更多