gpt4 book ai didi

wolfram-mathematica - ...Values 的 "Sort"选项有什么作用?

转载 作者:行者123 更新时间:2023-12-04 08:02:02 25 4
gpt4 key购买 nike

所有 ..Values函数具有未记录的选项 Sort :

In[1]:= Options /@ {OwnValues, DownValues, UpValues, SubValues, 
DefaultValues, FormatValues, NValues}

Out[1]= {{Sort -> True}, {Sort -> True}, {Sort -> True}, {Sort ->
True}, {Sort -> True}, {Sort -> True}, {Sort -> True}}

此选项有什么作用以及它可能用于哪些目的?

最佳答案

输入函数的定义时,请按特定顺序输入它们。如果您的定义不包含模式,它们将在内部存储在哈希表中。当您请求它们时,它们将默认排序:

In[11]:= 
Clear[g];
g[5]=1;
g[4]=2;
g[3]=3;

In[15]:= DownValues[g]
Out[15]= {HoldPattern[g[3]]:>3,HoldPattern[g[4]]:>2,HoldPattern[g[5]]:>1}

但是,通常您可能希望查看分配值的原始顺序。方法如下:
In[16]:= DownValues[g,Sort->False]
Out[16]= {HoldPattern[g[5]]:>1,HoldPattern[g[4]]:>2,HoldPattern[g[3]]:>3}

您可能想要使用它的一个实例的一个例子是,当您需要实现缓存时(我尝试基于此选项执行此操作的尝试可以在 here 中找到)。但是,对于大量定义,可能无法保证定义会按照原始顺序进行,因为内部散列表可能会被扩展和重新散列数次。通常,哈希表实现不保证键值对的存储顺序。那么,您通过设置 Sort->False 实现的目标是 ...Values在它们返回给您之前,它们不会被 Mathematica 排序,因此您可以按照 Mathematica 当前存储它们的顺序获得它们。

另一种可能需要这样做的情况是,当您想使用 DownValues 构建类似字典的结构时- 在这种情况下,使用 Sort->False 提取 key 会快得多,因为不必对键集进行排序(对于大键集很重要):
In[31]:= 
Clear[gg];
(gg[#]:=200000-#)&/@Range[200000];

In[33]:= DownValues[gg][[All,1,1,1]]//Short//Timing
Out[33]= {4.867,{1,2,3,<<199994>>,199998,199999,200000}}

In[34]:= DownValues[gg,Sort->False][[All,1,1,1]]//Short//Timing
Out[34]= {2.103,{95090,102286,<<199996>>,38082,26686}}

您可以找到此类用途的示例,例如 here .

据我所知, Sort选项仅影响非基于模式的 DownValues (和其他 ...Values ),因为对于基于模式的 DownValues Mathematica 无论如何都试图按照它们的一般性顺序对它们进行重新排序,正如它所理解的那样。 OTOH,用于基于模式的 DownValues ,您可以手动重新排序规则,Mathematica 将保留您的更改,而对于没有模式的定义,尝试在最初给出定义后手动重新排序似乎对它们没有影响(也许,再次因为它们在内部散列,并且散列-tables 通常不关心顺序)。

关于wolfram-mathematica - ...Values 的 "Sort"选项有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7062268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com