【问题标题】:Calculating percent difference between elements in a list with functional programming in Mathematica?在 Mathematica 中使用函数式编程计算列表中元素之间的百分比差异?
【发布时间】:2010-07-09 23:18:10
【问题描述】:

这源于一个相关的讨论,How to subtract specific elements in a list using functional programming in Mathematica?

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

链接的问题使用差异来轻松计算列表中连续元素之间的绝对差异。无论内置的 Differences 函数多么容易解决这个特定问题,它仍然留下了如何执行不同操作的问题。

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

我尝试找到一种方法来使用SlotSlotSequence 来隔离特定元素,然后对它们应用自定义函数。这是执行此类操作的最有效方法吗(假设有一种方法可以隔离元素并对其执行操作)?

【问题讨论】:

    标签: list functional-programming wolfram-mathematica


    【解决方案1】:

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

    您可以使用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}}
    

    然后你可以Apply一个函数给这些:

    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}
    

    (通过查看Apply 的“更多信息”说明了解@@@。)

    您可以使用 MostRest 代替 Partition 来形成第一个和第二个参数的列表,然后使用 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}
    

    threads 对两个列表 Differences[list]Most[list] 的除法运算 (/)。

    【讨论】:

    • 很好的答案!顺便说一句,我更喜欢@@@的这种解释:stackoverflow.com/questions/1141166/…
    • +1,很好的答案。我个人,最喜欢最后一个。虽然,我可能会写它Differences[#]/Most[#]& @ list,但这只是我。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多