使用 'std::generate' 或 'std::fill' 来填充 'arma::mat'

Using `std::generate` or `std::fill` to fill an `arma::mat`

本文关键字:std 填充 arma mat generate 使用 fill      更新时间:2023-10-16

我正在尝试围绕gmm_full编写一个包装器,并gmm_diag将它们作为mvnorm_distribution。我需要这个特定的设置,因为我正在处理一个输入文件,并希望让所有工作或多或少与std::*_distributions相同。我有我的包装器,它可以随心所欲地工作,但我很难通过任何std算法填充arma::mat。基本上,我有这样的东西:

arma::vec gen() {
// gmm_full model initilization
return model.generate();
}
void main() {
arma::mat m(dim, N);
std::generate(m.begin_col(0), m.end_col(N-1), gen);
}

到目前为止,我意识到std::generatem.being_col()都没有像我预期的那样工作。我在想我会得到一个矢量并可以填充它,或者这就是std::generate会做的,但显然事实并非如此。我在示例中看到我必须取消引用该列,但随后我无法在std::generate上执行此操作。我既std::fillstd::transform,但到目前为止我还没有成功。

一种解决方案是编写一个生成器类并逐个传递每个值,但这不是我真正想要的。我想知道是否有人可以帮助我解决这个问题。我也知道model.generate(N)但我想包装发行版并像其他std::*_distribution一样使用它,所以它不会解决我的问题,或者它确实解决了,我不知道如何使用它。

附言从技术上讲,这是我之前提出的这个问题的后续。

我想我通过使用arma::mat::each_col.这接受一个 lambda 函数,基本上迭代列。所以,它会是这样的:

m.each_col([](vec& a) mutable {a = gen();});

不要忘记通过引用传递a

警告:这可能比arma::gmm_full::generate(N)arma::mvnrnd慢。因此,如果您只想生成大量样本,请先使用这些样本。

附言 除非您将分配传递给 lambda,否则不需要mutable