繁体   English   中英

如何在C ++ / armadillo中删除非连续索引

[英]How to shed non-contiguous indices in c++/armadillo

我正在寻找一种干净的方法来使用Armadillo线性代数库(用于C ++)摆脱不连续的索引。 我在下面包含了一些代码,但是似乎有更好的方法可以做到这一点。 任何建议表示赞赏。

以下代码可用于从(列)向量a删除ind索引,但感觉很笨拙。

for(uword k = ind.n_elem; k>0; k--){
        a.shed_row(ind(k-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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM