На основе диапазона для l oop неоднозначность в C ++ - PullRequest
0 голосов
/ 25 апреля 2020

Эти две части кода:

A)

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) кластеры пусты и им не назначены пиксели. Можете ли вы помочь мне понять, почему, пожалуйста?

1 Ответ

1 голос
/ 25 апреля 2020

В вашей версии A вы создаете копию кластера в этой строке:

c = cluster;

Поэтому, когда вы делаете

c.add_pixel(pixel);

, вы не меняете * Диапазон 1008 *.

По той же причине этот l oop:

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

фактически не очищает пиксели любого кластера в clusters, поскольку каждый cluster является копией. Если вы действительно хотите сослаться на каждый кластер в clusters, вам нужно сделать это:

for (auto & cluster : clusters)
    {
        cluster.clear_pixels();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...