繁体   English   中英

在c ++中组合两个不同向量的比率

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM