假设我有一个向量,并且我希望得到元素的排名,如果它们已经排序。
所以,如果我有矢量:
0.5
1.5
3.5
0.1
我需要返回每个元素的行列:
2
3
4
1
在犰狳有办法吗?这与之前的post不同,因为我们在排序之前获得排名而不是索引。
答案 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;
};
输出:
答案 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)))