0

这两段代码:

一个)

void KMeans<N>::assign_pixels_to_clusters()
{
    for (auto cluster : clusters)
    {
        cluster.clear_pixels();
    }

    for (auto pixel : pixels)
    {
        float min_distance = FLT_MAX;
        Cluster<N> c;

        for (auto cluster : clusters)
        {
            float distance = norm(
                pixel.get_value(),
                cluster.get_centroid()
            );

            if (distance < min_distance)
            {
                min_distance = distance;
                c = cluster;
            }
        }

        c.add_pixel(pixel);
    }
}

和 B)

template <size_t N>
void KMeans<N>::assign_pixels_to_clusters()
{
    for (auto cluster : clusters)
    {
        cluster.clear_pixels();
    }

    for (auto pixel : pixels)
    {
        float min_distance = FLT_MAX;
        int idx = 0;

        for (int i = 0; i < no_of_clusters; i++)
        {
            float distance = norm(
                pixel.get_value(),
                clusters[i].get_centroid()
            );

            if (distance < min_distance)
            {
                min_distance = distance;
                idx = i;
            }
        }

        clusters[idx].add_pixel(pixel);
    }
}

看起来与我相似,但只有 B) 以我想要的方式工作。在 A) 的情况下,像素根本没有分配给集群。在运行代码 A) 之后,簇是空的并且没有分配给它们的像素。你能帮我理解为什么吗?

4

1 回答 1

1

在您的A版本中,您正在此行制作集群的副本:

c = cluster;

所以当你这样做时

c.add_pixel(pixel);

你没有改变clusters范围。

出于同样的原因,这个循环:

for (auto cluster : clusters)
    {
        cluster.clear_pixels();
    }

实际上并没有清除 中任何簇的像素clusters,因为每个cluster都是副本。如果你真的想引用中的每个集群clusters,你需要这样做:

for (auto & cluster : clusters)
    {
        cluster.clear_pixels();
    }
于 2020-04-24T22:25:40.737 回答