在mathematica中,万物都是表达式。但其实这句话也是有局限的,单个符号或者数字可以不认为是表达式,但这我们也不必去讨论,因为很简单,我们姑且称其为基础元素。表达式是mathematica中最重要的部分,我们讨论软件中的表达式,首先是要明白什么是表达式,以及在软件内是怎么解析表达式的。
这就要引入一个函数:FullForm,它可以对表达式表示为完全形式,例如:
FullForm[a + b]
out:Plus[a, b]
FullForm[a b c]
out:Times[a, b, c]
FullForm[{1, 2, 3}]
out:List[1, 2, 3]
从上面的例子中,我们可以看到,表达式是由函数+一系列的基础元素组成,我们称前面的函数为头(Head),Plus, Times, List等都是头,表达式中最核心的也就是头。在这里,我们不能称Plus, Times等为函数,而应称其为头。两者并不完全一样,头是构成表达式的部分,而函数是对表达式进行的操作。函数相当于给表达式加头,经过运算后得到新的表达式。将函数应用于表达式除了使用中括号,也可以使用@,还可以使用//。例如,将f应用于expr,可以表示为:f[expr], f@expr, expr//f。
mathematica提供了一个函数:Head[expr],通过这个函数,我们可以知道该表达式的头。
Apply
知道了什么是头以及头的重要性后,这就引入了一个mathematica中很特色的一个概念,也是能够极大提升变成效率的东西,即换头。顾名思义,换头就是把原先表达式的头换为一个新的头,这就是Apply函数。
Apply[Plus, {a, b, c}]
out:a + b + c
Apply[Plus, a b c]
out:a + b + c
如上例所示,Apply函数将List[a, b, c]的头换为了Plus,即Plus[a, b, c],得到了最后的结果。从这里就可以看出,通过换头能够十分方便的实现很多功能,比如上例中的对列表元素求和,和将乘法转换为加法。充分理解换头的概念和灵活应用是最为关键的。
Apply在mathematica中有一个简写形式,即:@@
考虑下面的例子:
Plus @@ {{2, 3}, {4, 6}, {7, 9}}
out:{13, 18}
Plus @@@ {{2, 3}, {4, 6}, {7, 9}}
out:{5, 10, 16}
从第一个我们能够看出,@@是将最外层的头进行替换,于是变成了对里面的三个子列表进行求和。而如果我们想要将子列表的头进行替换呢,这时可以使用@@@。
注意:在使用缩写形式@@或@@@时,一定要注意运算优先级,最好将后面的表达式使用括号括起来。
Map
在前面我们提到了将函数应用于表达式,可以使用@符号。如果我们想将函数应用于一个列表中的每个表达式呢,这就用到了Map函数,其缩写形式为"/@"。
其他部分
表达式的简化:Simplify