Supongamos que tengo una función f que toma un vector v y devuelve un nuevo vector con los elementos transformados de alguna manera. Lo hace llamando a la función g que supone que el vector está ordenado. Así que quiero f para definirse así:Desoriente: recordar una permutación y deshacerla
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 *)
]
¿Cuál es la mejor manera de hacer el "Desordenar"?
O podríamos obtener realmente de lujo y tienen esto de alguna manera funciona:
answer = Unsort[g[Sort[v]]];
añadido: Vamos a hacer este hormigón con un ejemplo de juguete. Supongamos que queremos una función f que toma un vector y lo transforma añadiendo a cada elemento el siguiente elemento más pequeño, si lo hay. Eso es fácil escribir si asumimos el vector está ordenada, por lo que vamos a escribir una función auxiliar g que hace que esa suposición:
g[v_] := v + Prepend[[email protected], 0]
Ahora para la función que realmente queremos, f, que funciona o no v se ordena :
f[v_] := (* remember the order;
sort it;
call g on it;
put it back in the original order;
return it
*)
Tal vez sea mejor que pasar ** g ** como un parámetro. –
o ligeramente más eficiente, cambiar su original al 'Con [{o = pedidos [v]}, Parte [g [v [[o]]]], para pedidos [o]]] '. – Janus