Mathematica/常用结构
外观
在 Mathematica 中,一个指导原则是几乎所有在 Mathematica 中表示的对象都具有统一的结构。例如,表达式 如果输入,将被表示为如果它被写为
In[8]:= x^4 + 1 Out[8]= 1+x4
如果FullForm命令用于此表达式,但是
In[9]:= FullForm[x^4 + 1] Out[9]= Plus[1, Power[x, 4]]
Mathematica 中的所有对象,除了原子对象(如符号、数字和字符串)之外,都具有基本形式 head[e1, e2, ...](这可能以其他方式显示或输入)。例如,上述表达式的头部是Plus. 列表也具有这种结构,其中头部是List, 元素是 e1, e2 等。head 的概念也为原子对象定义(Symbol对于符号,Integer对于整数等),但它们没有可提取的子部分。
此原则允许与列表无关的普通表达式使用列表运算符进行操作
In[10]:= Expand[(Cos[x] + 2 Log[x^11])/13][[2, 1]] Out[10]= 2/13
反之亦然——列表可以修改为表现得像普通表达式
In[11]:= Map[Apply[Log, #] &, {{2, x}, {3, x}, {4, x}}] Out[11]= {Log[x]/Log[2], Log[x]/Log[3], Log[x]/Log[4]}
其中Apply函数将其第二个参数的头部更改为第一个参数的头部,并且Map的行为类似于在许多函数式语言中找到的 映射函数。请注意,Log[b,x]是底数b对数,它被 转换为Log[x]/Log[b]在输入时。
由于在 Mathematica 中表示的常规数学对象与简单列表结构之间的这种等价性,一些内置的 Mathematica 函数允许 线程,其中函数在列表上映射自身,而无需太多其他说明。事实上,Apply当被调用时,它本身在列表上进行线程
In[12]:= Apply[Log, {{2,x}, {3,x}, {4,x}}, 1] Out[12]= {Log[x]/Log[2], Log[x]/Log[3], Log[x]/Log[4]}
其中第三个参数为 1 指定Apply仅在其参数的第一个级别(这是我们想要的)中替换其参数的头部,并且等效于上面的示例。