gpt4 book ai didi

sorting - 取消排序 : remembering a permutation and undoing it

转载 作者:行者123 更新时间:2023-12-02 14:25:54 24 4
gpt4 key购买 nike

假设我有一个函数 f,它接受向量 v 并返回一个新向量,其中元素以某种方式转换。它通过调用假设向量已排序的函数 g 来实现这一点。所以我希望 f 的定义如下:

f[v_] := Module[{s, r},
s = Sort[v]; (* remember the permutation applied in order to sort v *)
r = g[s];
Unsort[r] (* apply the inverse of that permutation *)
]

执行“取消排序”的最佳方法是什么?

或者我们可以变得非常奇特并让它以某种方式起作用:

answer = Unsort[g[Sort[v]]];

添加:让我们用一个玩具示例来具体说明这一点。假设我们想要一个函数 f,它接受一个向量,并通过将下一个最小元素(如果有)添加到每个元素来对其进行转换。如果我们假设向量已排序,那么就很容易编写,因此让我们编写一个辅助函数 g 来实现该假设:

g[v_] := v + Prepend[Most@v, 0]

现在我们真正想要的函数 f,无论 v 是否排序都有效:

f[v_] := (* remember the order; 
sort it;
call g on it;
put it back in the original order;
return it
*)

最佳答案

一种可能的方法:

 mylist = {c, 1, a, b, 2, 4, h, \[Pi]}
g /@ (Sort@mylist)[[Ordering@Ordering@mylist]]

给出

{g[c], g 1 , g[a], g[b], g[2], g[4], g[h], g[[Pi]]}

也就是说,

(Sort@mylist)[[Ordering@Ordering@mylist]] == mylist

我最初是从 MathGroup 了解到上述内容的,[已编辑]来自 Andrzej Kozlowski 的帖子

http://forums.wolfram.com/mathgroup/archive/2007/Jun/msg00920.html

关于sorting - 取消排序 : remembering a permutation and undoing it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4545223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com