给定一个矩阵,计算最小值的值和索引很容易:
A = rand(10);
[value, index] = min(A(:));
然而,我也想恢复第二个最小值(最大值同理)。
当然,我可以采取以下两种方法之一:
1. 将A转换为向量并排序。 优点:然后我可以恢复第二、第三、第n个最小值。 缺点:如果A很大,则排序代价高昂。
2. 找到A的最小位置后,我可以将此值替换为一个大值(例如:Inf),然后再次运行min。 优点:比排序便宜。 缺点:我必须修改矩阵(并在辅助变量中保存修改后的值)。对于大矩阵来说,重新运行min的代价很高。
我想知道是否有更好的解决方案: 当计算min时,算法必须跟踪到目前为止找到的最小值,直到新值具有较低的值为止(然后我们更新该值)。 如果我们改为跟踪到目前为止找到的最后n个最小值,就可以恢复最小的n个值了。
我可以实现这个方法,但我想知道是否有更好的方法或者是否已经实现了这个方法。
sort
,你可以通过一次 昂贵的sort
操作得到2倍最小值和2倍最大值。否则,你需要运行2个min
和 2个max
。进行测试并找出哪种方法更加节省成本。 - Hokisort
非常快。而且,如果您拥有GPU,您可以随时使用gpuarray
。在GPU中,reduce操作非常快。 - Ander Biguri