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() 中的瓶颈