犰狳中 find() 的补充索引

Complementary indexes to find() in Armadillo

来自 R 的犰狳和 C++ 新手的基本问题。

我有一个向量 X,我想将 0 以下的条目设置为给定值,将大于 0 的条目设置为另一个值。 Armadillo 具有返回 indices of elements of X that are non-zero or satisfy a relational conditionfind 函数(不合逻辑!?)所以我可以这样做:

arma::uvec ind0 = find(X < 0);
arma::uvec ind1 = find(X >= 0);

X(ind0).zeros();
X(ind1).fill(1);

这显然不是最佳解决方案。不调用 find 两次的更好方法是什么?

您可以使用 .transform() 成员函数。需要 C++11 编译器。

mat X(100,100,fill::randu);

X -= 0.5;

X.transform( [](double val) { return (val < 0) ? double(0) : double(1); } );

这就是您所需要的!它将使小于0的值等于0,大于1的值等于1。

 X = clamp(X, 0, 1); 

更多信息请访问: http://arma.sourceforge.net/docs.html#clamp