C ++ Armadillo:获取向量中元素的排名

时间:2016-03-13 04:11:28

标签: c++ armadillo

假设我有一个向量,并且我希望得到元素的排名,如果它们已经排序。

所以,如果我有矢量:

0.5
1.5
3.5
0.1

我需要返回每个元素的行列:

2
3
4
1

在犰狳有办法吗?这与之前的post不同,因为我们在排序之前获得排名而不是索引。

3 个答案:

答案 0 :(得分:1)

在这里,看一下:

#include<iostream>
#include<vector> // std:: vector
#include <algorithm> // std::sort
#include <map> // std::map

using namespace std;


int main() {
    vector<double> myVector = { 0.5, 1.5, 3.5, 0.1 };
    vector<double> Sorted = myVector;

    std::sort(Sorted.begin(), Sorted.end());

    map<double, int> myMap;

    for (int i = 0; i < Sorted.size() ; i++)
    {
        myMap.insert(make_pair(Sorted[i],i));
    }

    for (int i = 0; i < myVector.size() ; i++)
    {
        auto it = myMap.find(myVector[i]);
        cout << it->second + 1 << endl;
    }

    return 0;
};

输出:

enter image description here

答案 1 :(得分:0)

这是我的代码使用STL以简洁的方式获得排名

template <typename T>
vector<size_t> calRank(const vector<T> & var) {
    vector<size_t> result(var.size());
    //sorted index
    vector<size_t> indx(var.size());
    iota(indx.begin(),indx.end(),0);
    sort(indx.begin(),indx.end(),[&var](int i1, int i2){return var[i1]<var[i2];});
    //return ranking
    for(size_t iter=0;iter<var.size();++iter){
        //it may cause overflow for a really long vector, in practice it should be ok.
        result[indx[iter]]=iter+1;
    }
    return result;
}

答案 2 :(得分:0)

以下是使用功能arma::sort_index()的纯 Armadillo 代码的解决方案。

函数arma::sort_index()计算排列索引,以将给定向量按升序排序。

两次应用函数arma::sort_index()arma::sort_index(arma::sort_index())}计算 reverse 排列索引,以将向量从升序排序回到其原始未排序顺序。元素的等级等于 reverse 排列索引。

下面是包装在 RcppArmadillo 中的 Armadillo 代码,该代码定义了功能calc_ranks()。函数calc_ranks()计算向量元素的秩,可以从 R 调用它。

#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;
// [[Rcpp::depends(RcppArmadillo)]]

// Define the function calc_ranks(), to calculate 
// the ranks of the elements of a vector.
//
// [[Rcpp::export]]
arma::uvec calc_ranks(const arma::vec& da_ta) {
  return (arma::sort_index(arma::sort_index(da_ta)) + 1);
}  // end calc_ranks

以上代码可以保存到文件 calc_ranks.cpp 中,因此可以使用功能Rcpp::sourceCpp() R 中进行编译。

下面是 R 代码,用于测试功能calc_ranks()(在 R 中编译后):

# Compile Rcpp functions
Rcpp::sourceCpp(file="C:/Develop/R/Rcpp/calc_ranks.cpp")

# Create a vector of random data
da_ta <- runif(7)
# Calculate the ranks of the elements
calc_ranks(da_ta)

# Compare with the R function rank()
all.equal(rank(da_ta), drop(calc_ranks(da_ta)))