[英]Combine the ratios of two different vectors in c++
我不知道如何解释,所以如果这个问题存在,请指出正确的主题。 我已经搜索了论坛,但找不到任何答案(也许我遗漏了数学或统计学中的关键字)。
如何从两个向量生成具有组合权重的向量?
例如给定两个向量:
vector_1 = {3, 3, 4}
vector_2 = {5, 5}
我们计算它们的权重,即元素除以向量中元素的总和。
weights_1 = {0.3, 0.3, 0.4}
weights_2 = {0.5, 0.5}
然后将它们组合以产生此向量。 组合权重是两个向量的组合比率。
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 是 weights_1 的第一个元素。
Step 2: combined_weights = {0.3, 0.2, 0.1}
0.2 和 0.1 之和是 weights_1 的第二个元素。 combine_weights 向量的总和等于 weights_2 的第一个元素。
Step 3: combined_weights = {0.3, 0.2, 0.1, 0.4}
从combined_weights向量我们可以得到weights_1和weights_2,即
weights_1 = {0.3, 0.2 + 0.1, 0.4}
weights_2 = {0.3 + 0.2, 0.1 + 0.4}
我的目标是使 vector_1 和 vector_2 具有相似的大小。
new_vector_1 = {3, 2, 1, 4}
new_vector_2 = {3, 2, 1, 4}
更普遍,
您可以找到总数的LCM ,然后乘以,而不是将每个重量除以它的总数
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.