具有以下功能,可在不改变元素总和的情况下将十进制向量四舍五入为 int:
Eigen::VectorXi PSOOCBAA::smart_rounding(Eigen::VectorXd v, int desired_sum) {
Eigen::VectorXd margin (v.size());
Eigen::VectorXi rounded (v.size());
for (int i = 0; i < v.size() ; i++) {
rounded(i) = std::floor(v(i));
margin(i) = v(i) - rounded(i);
}
std::vector<int> indices = sort_indices(margin);
std::reverse(indices.begin(), indices.end());
indices.resize(desired_sum - rounded.sum());
for(int index : indices)
rounded(index) += 1;
return rounded;
}
输入 v 取决于随机数,在极少数情况下,我们会得到以下错误:
在抛出“std::length_error”的实例后调用终止 什么():向量::_M_default_append
在我们的例子中,向量 v 的最大长度是 20,所以 max size 应该没有问题。你们有什么想法吗?
我们已经确保输入正确并且不包含任何
nan
s。我们还添加了所需的总和作为输入,以确保它也是正确的。