【发布时间】:2019-12-27 15:49:32
【问题描述】:
我想根据实数向量对整数向量进行排序。 例如。我有一个整数向量 (1,2,3) 和一个对应的实数向量 (0.3,0.2,0.1)。现在我想对整数进行排序,以便与最小实数相对应的整数排在第一位,与第二小的实数相对应的整数排在第二位,依此类推,即整数向量应该像 (3,2,1) 一样排序. 代码是:
int main()
{
const unsigned int M = 5;
const unsigned int N = 10;
Eigen::MatrixXd samples = Eigen::MatrixXd::Random(M,N);
std::vector<unsigned int> indices(N);
std::iota(indices.begin(),indices.end(),0);
std::shuffle(indices.begin(),indices.end(),std::default_random_engine(1.0));
const unsigned int S = 4;
std::vector<unsigned int> A(indices.begin(),indices.begin()+S);
std::vector<unsigned int> B(indices.begin()+S,indices.end());
std::default_random_engine generator;
std::uniform_int_distribution<unsigned int> distribution(0,N-1);
const unsigned int index = distribution(generator);
std::vector<double> distances(A.size());
for(unsigned int l=0; l<A.size(); ++l)
{
distances[l] = (samples.col(index)-samples.col(A[l])).norm();
}
std::sort(A.begin(),A.end(),[&distances](unsigned int i, unsigned int j){return
distances[i]<distances[j];});
distances.resize(B.size());
for(unsigned int i=0; i<B.size(); ++i)
{
distances[i] = (samples.col(index)-samples.col(B[i])).norm();
}
std::cout << "distances:" << std::endl;
for(unsigned int i=0; i<B.size(); ++i)
{
std::cout << distances[i] << " ";
}
std::cout << std::endl;
std::cout << "indices before sorting:" << std::endl;
for(unsigned int i=0; i<B.size(); ++i)
{
std::cout << B[i] << " ";
}
std::cout << std::endl;
std::sort(B.begin(),B.end(),[&distances](unsigned int i, unsigned int j){return
distances[i]<distances[j];});
std::cout << "indices after sorting:" << std::endl;
for(unsigned int i=0; i<B.size(); ++i)
{
std::cout << B[i] << " ";
}
std::cout << std::endl;
return 0;
}
输出是:
距离:
2.42122 0.940923 1.45279 1.81009 1.96321 1.76887
排序前的索引:
2 5 4 9 8 7
排序后的索引:
7 8 9 2 5 4
为什么输出不如下?
距离:
2.42122 0.940923 1.45279 1.81009 1.96321 1.76887
排序前的索引:
2 5 4 9 8 7
排序后的索引:
5 4 7 9 8 2
【问题讨论】:
-
按照什么逻辑你期望排序后的索引是这样的?
-
鉴于您描述的问题,您认为我们真的需要
Eigen::MatrixXd和<random>中的所有内容吗?请构造一个minimal reproducible example,重点关注minimal部分。 -
@Fureeish:是的,代码可以缩短。
-
@Öö Tiib:我错误地认为 std::sort 中的整数 i 和 j 指的是向量 A 和 B 的索引,而不是它们的内容。