使用 'std::generate' 或 'std::fill' 来填充 'arma::mat'
Using `std::generate` or `std::fill` to fill an `arma::mat`
我正在尝试围绕gmm_full
编写一个包装器,并gmm_diag
将它们作为mvnorm_distribution
。我需要这个特定的设置,因为我正在处理一个输入文件,并希望让所有工作或多或少与std::*_distribution
s相同。我有我的包装器,它可以随心所欲地工作,但我很难通过任何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::generate
或m.being_col()
都没有像我预期的那样工作。我在想我会得到一个矢量并可以填充它,或者这就是std::generate
会做的,但显然事实并非如此。我在示例中看到我必须取消引用该列,但随后我无法在std::generate
上执行此操作。我既std::fill
又std::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
。
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 如何用文本填充 std::vector<int64_t>
- 将空填充但不以空结尾的固定长度字符数组转换为 std::string 的最佳方法
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- C++初始化/填充静态成员 std::数组元素到特定值
- 组合 std::vector 默认值和填充构造函数
- 使用 'std::generate' 或 'std::fill' 来填充 'arma::mat'
- 如何有效地用枚举填充 2D std::数组
- std :: string的解密具有额外的填充字节
- 与STD :: BITSET的工会成员的结构填充
- 用原始数据填充 std::vector
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 如何填充项目为 8 个字符的集合?(std::set<char [8]>)
- 在 c++ 中填充和分配 std::string
- C++填充一个std::map创建不必要的对象
- std::vector<class> 在调试时填充,但在发布时不填充
- 如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
- 如何正确地将功能填充到std中
- 如何从实双打的std::向量中填充复数双打的std::向量
- 直接从 C API 填充 std::string