c ++犰狳库中的sort_index()函数给出错误的结果

Posted

技术标签:

【中文标题】c ++犰狳库中的sort_index()函数给出错误的结果【英文标题】:sort_index() function in c++ armadillo library gives wrong result 【发布时间】:2020-01-27 23:13:36 【问题描述】:

我在 c++ armadillo 中使用 sort_index() 函数,但它似乎没有给出正确的结果:

输入向量是[3,4,2,1,5] 对两个方向进行排序

arma::sort_index(input, "ascend").print();
arma::sort_index(input, "descend").print();

并获得以下结果: [3,2,0,1,4] 和 [4,1,0,2,3]

两者都不正确。按升序排序应该得到 [2,3,1,0,4] (用numpy.searchsorted 加倍检查并给出上述结果)。

--- 编辑---

感谢您的回复!我现在意识到我误解了sort_index 的索引方式。我还在努力寻找一个高效、等效的函数,在c++中实现np.searchsorted...

【问题讨论】:

您如何达到预期结果?最小的项目在索引3(值1),第二小的项目在索引2(值2),第三小的项目在索引0(值3)和以此类推。 你的意思是你检查了numpy.argsort?你能发布你的预期结果,以及仔细检查它的 numpy 代码吗? 看起来 sort_index[0] 正在为您提供将被排序到索引 0 的值的当前索引,而您期望它是当前位于索引 0 的值的排序索引,如果有意义的话 【参考方案1】:

犰狳的文档指出

sort_index( X )sort_index( X, sort_direction ) 返回描述 X 元素排序顺序的向量(即它包含 X 元素的索引)

返回的向量对应于原始向量X 中元素的索引,这将产生一个排序的向量。

numpy中对应的函数是argsort而不是searchsorted。事实上,来自 numpy 的 argsort 将提供与犰狳中的 sort_index 相同的解决方案。

在您的示例[3,4,2,1,5] 中,最小元素位于索引 3 中,然后是索引 2 中的元素,然后是 0,依此类推。换句话说,如果你在X 中使用索引[3,2,0,1,4] 的元素,你会得到向量[1, 2, 3, 4, 5],这是X 排序的。

【讨论】:

啊,明白了!谢谢:) 我正在尝试找到与searchsorted 等效的c++,是否有可以达到与searchsorted 相同结果的犰狳函数? @segfault_101 犰狳中没有这样的功能,但犰狳并不专注于将元素插入现有向量。这样做也是低效的,因为在刚刚插入的元素之后的所有元素都需要移动。您可能希望为此使用不同的数据结构。

以上是关于c ++犰狳库中的sort_index()函数给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

链接错误:Armadillo 库中的“未定义对‘pthread_atfork’的引用”

犰狳函数的不同最小二乘误差

从 C 数组(列优先)转换为犰狳矩阵(arma::mat)而不复制

C++11 并行化:犰狳的 set_seed_random() 中的瓶颈

Rcpp Armadilllo 中的模板类 arma::Col

C# 中的 C++ Armadillo 代码 [关闭]