我正在尝试围绕gmm_full
和gmm_diag
编写包装,以使它们成为mvnorm_distribution
。我需要这种特定的设置,因为我正在处理一个输入文件,并且希望所有工作与std::*_distribution
大致相同。我有包装程序,它可以按我的意愿工作,但是我很难通过任何arma::mat
算法来填充std
。基本上,我有这样的东西:
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::generate
或m.being_col()
都无法正常工作。我当时以为我可以得到一个向量并可以填充它,否则std::generate
会这样做,但显然并非如此。在示例中,我看到必须取消引用该列,但是之后我无法在std::generate
上进行引用。我同时拥有std::fill
和std::transform
,但到目前为止我还没有成功。
一种解决方案是编写一个生成器类,然后将每个值一个一个地传递,但这不是我真正想要的。我想知道是否有人可以帮助我。我也知道model.generate(N)
,但是我想包装发行版,并像其他std::*_distribution
一样使用它,所以它不能解决我的问题,或者可以,但是我没有知道如何使用它。
P.S。从技术上讲,这是我早些时候对this question进行的跟踪。
答案 0 :(得分:0)
我认为我通过使用arma::mat::each_col
进行了管理。这接受一个lambda函数,并且基本上在列上进行迭代。因此,将是这样的:
m.each_col([](vec& a) mutable {a = gen();});
不要忘记通过引用传递a
。
注意:这可能比arma::gmm_full::generate(N)
或arma::mvnrnd
慢。因此,如果您只想生成大量样本,请先处理这些样本。
P.S。除非您将分配传递给lambda,否则没有必要使用mutable
。