我正在寻找一种干净的方法来使用Armadillo线性代数库(用于C ++)摆脱不连续的索引。我在下面包含了一些代码,但是似乎有更好的方法可以做到这一点。任何建议表示赞赏。
以下代码可用于从(列)向量ind
中删除a
中的索引,但感觉很笨拙。
for(uword k = ind.n_elem; k>0; k--){
a.shed_row(ind(k-1));
}
有什么想法吗?
答案 0 :(得分:1)
这是一种使用模板化函数的方法,该方法用于基于要排除的(排序)索引uvec
删除行。您从std::set_difference
获取丢失的索引,然后从那里去。
#define ARMA_USE_CXX11
#include <armadillo>
#include <iostream>
template <class T>
T drop_rows(T a, arma::uvec exclude) {
arma::uvec full_range = arma::regspace<arma::uvec>(0, a.n_rows - 1);
std::vector<int> diff;
std::set_difference(full_range.begin(), full_range.end(),
exclude.begin(), exclude.end(),
std::inserter(diff, diff.begin()));
T b = a.rows(arma::conv_to<arma::uvec>::from(diff));
return b;
}
int main() {
arma::uvec exclude = {0, 1, 4};
arma::vec a = arma::linspace<arma::vec>(100, 500, 5);
arma::vec b = drop_rows(a, exclude);
std::cout << b << std::endl;
arma::mat A = arma::mat(5, 5, arma::fill::eye);
arma::mat B = drop_rows(A, exclude);
std::cout << B << std::endl;
return 0;
}