Объедините крысу ios двух разных векторов в с ++ - PullRequest
0 голосов
/ 06 марта 2020

Я не знаю, как это объяснить, поэтому, если этот вопрос существует, просто наведите меня на правильную топи c. Я искал на форуме, но не смог найти ответа (возможно, в математике или статистике есть ключевое слово, которое мне не хватает).

Как создать вектор с объединенными весами из двух векторов?

Например, для двух векторов:

vector_1 = {3, 3, 4}
vector_2 = {5, 5}

Мы рассчитываем их вес, который представляет собой элемент, деленный на сумму элементов в векторе.

weights_1 = {0.3, 0.3, 0.4}
weights_2 = {0.5, 0.5}

Это затем объединяются для получения этого вектора. Объединенные веса - это объединенная крыса ios из двух векторов.

combined_weights = {0.3, 0.2, 0.1, 0.4}

Существует ли функция, которая может вычислять объединенные веса?

combined_weights = calculate(weights_1, weights_2)

Процесс:

Step 1: combined_weights = {0.3} 

0.3 - первый элемент весов_1.

Step 2: combined_weights = {0.3, 0.2, 0.1} 

Сумма 0,2 и 0,1 - второй элемент весов_1. Сумма вектора комбинированных весов равна первому элементу weights_2.

Step 3: combined_weights = {0.3, 0.2, 0.1, 0.4} 

Из вектора комбинированных весов мы можем получить как weights_1, так и weights_2, то есть

    weights_1 = {0.3, 0.2 + 0.1, 0.4}
    weights_2 = {0.3 + 0.2, 0.1 + 0.4}

Моя цель состоит в том, чтобы make vector_1 и vector_2 имеют одинаковый размер.

new_vector_1 = {3, 2, 1, 4}
new_vector_2 = {3, 2, 1, 4}

enter image description here

В общем,

enter image description here

1 Ответ

1 голос
/ 06 марта 2020

Вместо того, чтобы делить каждый вес на общее количество, вы можете найти LCM ваших итогов и умножить, что удерживает вас в целочисленном арифметическом c

int total1 = std::accumulate(weights1.begin(), weights1.end(), 0);
int total2 = std::accumulate(weights2.begin(), weights2.end(), 0);
int lcm = std::lcm(total1, total2);

Мы хотим чтобы сделать деструктивные действия ниже, так что мы можем также сделать это с откорректированными значениями

std::deque<int> working1;
std::transform(weights1.begin(), weights1.end(), std::back_inserter(working1), [=](int w){ return w * lcm / total1; });

std::deque<int> working2;
std::transform(weights2.begin(), weights2.end(), std::back_inserter(working2), [=](int w){ return w * lcm / total2; });

Сравнивая передние элементы, вы выбираете меньшие, добавляете их к выводу (если не ноль), и уменьшаете больше на это значение. Повторяйте этот процесс, пока обе копии не станут пустыми

std::vector<int> combined;

while (!working1.empty() && !working2.empty())
{
    int & top1 = working1.front();
    int & top2 = working2.front();
    if (top1 < top2)
    {
        if (top1 > 0) { combined.push_back(top1) }
        top2 -= top1;
        working1.pop_front();
    }
    else
    {
        if (top2 > 0) { combined.push_back(top2) }
        top1 -= top2;
        working2.pop_front();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...