Вычисление процентной разницы между элементами в списке с помощью функционального программирования в Mathematica? - PullRequest
4 голосов
/ 10 июля 2010

Это вытекает из соответствующего обсуждения, Как вычесть определенные элементы в списке с помощью функционального программирования в Mathematica?

Как можно легко рассчитать процентную разницу между значениями в списке?

Связанный вопрос использует различия, чтобы легко рассчитать абсолютные различия между последовательными элементами в списке. Несмотря на то, что встроенная функция «Различия» делает эту конкретную проблему простой, она все равно оставляет вопрос о том, как выполнять различные манипуляции.

Как я упоминал ранее, сейчас я рассчитываю рассчитать процентную разницу. Учитывая список элементов, {value1, value2, ..., valueN}, как можно выполнить операцию, подобную (value2-value1)/value1, с указанным списком?

Я пытался найти способ использовать Slot или SlotSequence, чтобы изолировать определенные элементы, а затем применить к ним пользовательскую функцию. Является ли это наиболее эффективным способом сделать что-то подобное (если предположить, что существует способ изолировать элементы и выполнять над ними операции)?

Ответы [ 2 ]

9 голосов
/ 10 июля 2010

Есть несколько естественных способов сделать это.

Вы можете сформировать список аргументов для вашей функции «процентного уменьшения», используя Partition :

In[3]:= list = {a, b, c, d, e};

In[4]:= Partition[list, 2, 1]

Out[4]= {{a, b}, {b, c}, {c, d}, {d, e}}

Тогда вы можете применить функцию к этим:

In[6]:= f @@@ Partition[list, 2, 1]

Out[6]= {f[a, b], f[b, c], f[c, d], f[d, e]}

Использование функции уменьшения процента:

In[7]:= PercentDecrease[a_, b_] := (b - a)/a

In[8]:= PercentDecrease @@@ Partition[list, 2, 1]

Out[8]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}

(Прочтите о @@@, посмотрев заметки «Дополнительная информация» на Применить .)

Вместо раздела вы можете использовать Most и Rest , чтобы сформировать списки первого и второго аргументов, а затем объединить их, используя MapThread :

In[14]:= MapThread[PercentDecrease, {Most[list], Rest[list]}]

Out[14]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}

Другой способ состоит в том, чтобы сформировать вашу операцию (вычитание и деление) в два этапа, например:

In[10]:= Differences[list] / Most[list]

Out[10]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}

Операция деления (/) потоков по двум спискам Differences[list] и Most[list].

0 голосов
/ 10 июля 2010
...