hadamard=bdiag(matrix(1,500,500),matrix(1,300,300),...))
D*hadamard
我想本质上声明一个 std::vector<std::uniform_real_distribution<double> > distribution_pos(10);
for(auto it = distribution_pos.begin(); it != distribution_pos.end(); it++)
{
it->std::uniform_real_distribution<double>(0.0,1.0);
}
对象的向量(大小10)。然后,我想遍历此向量并调用对象的值构造函数(std::uniform_real_distribution<double>
和0.0
的数字应在循环的每次遍历中更改,但为简洁起见,在此省略)。上面的代码似乎没有满足我的要求。在已经声明1.0
之后是否可以对值构造函数进行显式调用?
答案 0 :(得分:4)
不,您不能像std::vector
's constructor那样默认构造并推入值,因此无法再次构造它们。
要避免这种情况,而不是创建一个具有该大小的向量,reserve(10)
(不会构造任何东西,只是保留内存),然后您可以emplace_back
这些值,这将构造一个具有给定参数的对象。
std::vector<std::uniform_real_distribution<double> > distribution_pos;
distribution_pos.reserve(10);
for (std::size_t i = 0; i < 10; ++i) {
distribution_pos.emplace_back(0.0, 1.0);
}
答案 1 :(得分:3)
我想遍历此向量,并为 对象
该对象已经默认使用(0.0,1.0)构造,您不能再次调用构造函数。不过,您可以通过取消引用迭代器并为其分配分配新分配:
*it = std::uniform_real_distribution<double>(0.0,1.0);
或使用基于范围的for循环:
for(auto &dist : distribution_pos) {
dist = std::uniform_real_distribution<double>(0.0,1.0);
}
如果您确实想要保留原始分布(也许保持其内部状态),则可以替换其参数对象:
for(auto &dist : distribution_pos) {
// get the current parameters
auto params = dist.param();
// create new and replace the old parameters
dist.param(
std::move(
std::uniform_real_distribution<double>::param_type(
params.a(), params.b()
)
)
);
}