使用`std :: generate`或`std :: fill`填充`arma :: mat`

时间:2019-06-13 09:16:37

标签: c++ random c++17 std

我正在尝试围绕gmm_fullgmm_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::generatem.being_col()都无法正常工作。我当时以为我可以得到一个向量并可以填充它,否则std::generate会这样做,但显然并非如此。在示例中,我看到必须取消引用该列,但是之后我无法在std::generate上进行引用。我同时拥有std::fillstd::transform,但到目前为止我还没有成功。

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

P.S。从技术上讲,这是我早些时候对this question进行的跟踪。

1 个答案:

答案 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