使用Mathematica中的函数式编程计算列表中元素之间的百分比差异?

Ale*_*lec 4 functional-programming wolfram-mathematica list

这源于一个相关的讨论,如何使用Mathematica中的函数编程减去列表中的特定元素?

如何轻松计算列表中值之间的百分比差异?

链接的问题使用差异来轻松计算列表中连续元素之间的绝对差异.无论内置的差异函数容易出现这个特殊问题,它仍然存在如何执行不同操作的问题.

正如我之前提到的,我现在希望计算百分比差异.给定一个元素列表{value1, value2, ..., valueN},如何执行类似于(value2-value1)/value1所述列表的操作?

我已经尝试找到一种方法来使用SlotSlotSequence隔离特定元素,然后将自定义函数应用于它们.这是做这样事情的最有效方式(假设有一种方法可以隔离元素并对它们执行操作)?

And*_*lan 9

有一些自然的方法可以做到这一点.

您可以使用分区形成"减少百分比"功能的参数列表:

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

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

Out[4]= {{a, b}, {b, c}, {c, d}, {d, e}}
Run Code Online (Sandbox Code Playgroud)

然后你可以函数应用于这些:

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

Out[6]= {f[a, b], f[b, c], f[c, d], f[d, e]}
Run Code Online (Sandbox Code Playgroud)

使用百分比减少功能:

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}
Run Code Online (Sandbox Code Playgroud)

(阅读申请时的"更多信息"说明,阅读@@@ .)

您可以使用MostRest来形成第一个和第二个参数的列表,然后使用MapThread组合它们,而不是分区:

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

Out[14]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Run Code Online (Sandbox Code Playgroud)

另一种方法是通过两个步骤形成您的操作(减法和除法),如下所示:

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

Out[10]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Run Code Online (Sandbox Code Playgroud)

除法运算(/)线程在两个列表Differences[list]Most[list]之间.