【问题标题】:Elegantly alter a list of variables: Generalization of AddTo, TimesBy, etc优雅地更改变量列表:AddTo、TimesBy 等的泛化
【发布时间】:2011-01-17 08:44:57
【问题描述】:

假设我已经定义了一个变量列表

{a,b,c} = {1,2,3}

如果我想把它们都加倍,我可以这样做:

{a,b,c} *= 2

变量 {a,b,c} 现在计算为 {2,4,6}。 如果我想对它们应用任意转换函数,我可以这样做:

{a,b,c} = f /@ {a,b,c}

如果不指定两次变量列表,您将如何做到这一点?

(抛开我可能想要一个数组而不是一个明确命名的变量列表的反对意见。)

【问题讨论】:

    标签: language-features wolfram-mathematica


    【解决方案1】:

    你可以这样做:

    Function[Null, # = f /@ #, HoldAll][{a, b, c}]
    

    例如,

    In[1]:= 
    {a,b,c}={1,2,3};
    Function[Null, #=f/@#,HoldAll][{a,b,c}];
    {a,b,c}
    
    Out[3]= {f[1],f[2],f[3]}
    

    或者,您可以在不硬编码f 的情况下执行相同操作,但定义自定义set 函数。如果你给它 Listable 属性,你的 foreach 循环的效果可以很容易地重现:

    ClearAll[set];
    SetAttributes[set, {HoldFirst, Listable}]
    set[var_, f_] := var = f[var];
    

    例子:

    In[10]:= {a,b,c}={1,2,3};
    set[{a,b,c},f1];
    {a,b,c}
    
    Out[12]= {f1[1],f1[2],f1[3]}
    

    您可能还希望在 f 是 Listable 的情况下获得速度优势,这在现在尤其重要,因为 M8 Compile 使用户定义的函数能够从速度方面受益于 Listabe,这种方式以前只有内置函数可以。对于这种情况(当您追求速度并且知道f 是可列出的),您需要为set 做的所有事情就是删除set 的可列出属性。

    【讨论】:

      【解决方案2】:

      我在解决这个老问题时找到了答案:ForEach loop in Mathematica

      each 函数定义为该问题的已接受答案,我们可以通过以下方式回答该问题:

      each[i_, {a,b,c}, i = f[i]]
      

      【讨论】:

        猜你喜欢
        • 2019-07-22
        • 2023-03-05
        • 2021-07-08
        • 2020-08-05
        • 2015-11-27
        • 2010-10-04
        • 2016-03-06
        • 2021-05-04
        • 1970-01-01
        相关资源
        最近更新 更多