对向量矩阵中的值进行排序,输出对应的索引

Posted

技术标签:

【中文标题】对向量矩阵中的值进行排序,输出对应的索引【英文标题】:sorting values in vector matrix, output corresponding indices 【发布时间】:2016-01-19 00:54:24 【问题描述】:

我在下面发现了这个问题,得到了一些很好的答案:

For example, I have a set, or vector, or matrix of samples A : [5, 2, 1, 4, 3]. I want to sort these to be B : [1,2,3,4,5], but I also want to remember the original indexes of the values, so I can get another set which would be: C : [2, 1, 4, 3, 0 ] - which corresponds to the index of the each element in 'B', in the original 'A'.

如果我将问题扩展到 2 个索引会怎样,例如 2x3 矩阵

1 5 6

4 8 2

排序(降序,既不是按列/按行,也不是按值)

8 6 5 4 2 1

输出索引

(1,1) (0,2) (0,1) (1,0) (1,2) (0,0)

我试过了,但我确定我需要帮助,任何帮助都意义重大......

template <typename T> vector <vector <size_t>> sort_indexes(const vector <vector <T>> &v)

//// initialize original index locations
vector<vector<size_t>> idx(v.size());
for (size_t i = 0; i != idx.size(); ++i) 
    idx[i] = i;
    for (size_t j = 0; i != idx[i].size(); ++j) 
        idx[j] = j;
    

// sort indexes based on comparing values in v
sort(idx.begin(), idx.end(),
    [&v](size_t i1, size_t i2) return v[i1] > v[i2]; );

return idx;

int main ()

vector<vector<int>> v;
v[0].push_back(10);
v[0].push_back(1);
v[0].push_back(3);
v[1].push_back(20);
v[1].push_back(30);
v[1].push_back(40);

for (auto i = 0; i < v.size(); i++) 
    for (auto j:sort_indexes(v) )
    cout << i << j <<"  "<< v[i][j] << endl;

cin.get();
return 0;

我为我的问题采用了这个https://***.com/a/12399290/5807825。我尝试了对代码的一些调整,任何人都可以阐明哪些部分是错误的,或者一切......我希望没有。

【问题讨论】:

并没有真正得到您的问题,您是否正在寻找一种算法来实现它。解释很清楚。你只是想实现它,不管涉及到什么过程 非常感谢您的提问。是的,我需要一个 C++ 代码来实现它......来自 Lukasz Wiklent 的“使用 C++ lambda 函数”的答案不知何故给了我一些开始。我正在为我的案子尝试他的答案,但没有成功。 【参考方案1】:

生成指向数组的指针或索引数组,并根据数组对指针或索引进行排序。如果使用指针,比较函数只需要知道数组中元素的类型。如果使用索引,则可以使用 lambda 比较(假设是 C++、Java 等语言)。

使用索引和 lambda 比较的数组示例 C++ 代码:

void examplesort(int array[], int index[], int size)
    int * tmpa = new int[size];     // temp array
    // generate indices to array
    for(int i = 0; i < size; i++)
        index[i] = i;
    // sort indices according to array
    std::sort(index, index+size,
        [&array](int i, int j) return array[i] < array[j];);
    // tmpa[] = sorted array[]
    for(int i = 0; i < size; i++)
        tmpa[i] = array[index[i]];
    // copy tmpa to array
    for(int i = 0; i < size; i++)
        array[i] = tmpa[i];
    delete[] tmpa;
    return;

【讨论】:

因为我刚刚跳入 C++ 向量/STL,我可能需要时间来弄清楚你的建议......但我已经尝试了 @Lukasz Wiklent 的方式,他对我上面提到的问题的回答?它适用于单个索引。您能否向我展示一些可以处理我上面展示的示例的复杂代码的调整?

以上是关于对向量矩阵中的值进行排序,输出对应的索引的主要内容,如果未能解决你的问题,请参考以下文章

第四十二篇 Numpy的基本操作——索引相关

如何通过C ++中的数据获得向量的索引

对向量中具有奇数索引的数字进行排序

合并排序 - 向量不排序

python 怎么取dataframe的索引值

如何在 C++ 中对向量组元素进行排序?