Предположим, что у меня есть функция f, которая принимает вектор v и возвращает новый вектор с элементами, преобразованными каким-то образом. Он делает это, вызывая функцию g, которая предполагает, что вектор сортируется. Поэтому я хочу, е должны быть определены следующим образом:Unsort: запомнить перестановку и уничтожить ее
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 *)
]
Какой самый лучший способ сделать «Unsort»?
Или мы могли бы получить действительно фантазии и есть это как-то работать:
answer = Unsort[g[Sort[v]]];
ДОБАВЛЕНО: Давайте сделаем этот бетон примера игрушка. Предположим, что нам нужна функция f, которая принимает вектор и преобразует его, добавляя к каждому элементу следующий наименьший элемент, если он есть. Это легко писать, если мы предположим, что вектор отсортирован, поэтому давайте напишем вспомогательную функцию г, что делает такое предположение:
g[v_] := v + Prepend[[email protected], 0]
Теперь для функции мы действительно хотим, F, который работает ли или не сортируется v :
f[v_] := (* remember the order;
sort it;
call g on it;
put it back in the original order;
return it
*)
Может быть, лучше передать ** г ** в качестве параметра. –
или немного более эффективно, измените оригинал на 'With [{o = Заказ [v]}, Part [g [v [[o]]]], Ordering [o]]]'. – Janus