结构的操作

Wolfram 语言有改变表达式结构的有效功能. 这可以使我们实现合并、分配等数学特性,并对一些简洁和有效的程序提供基础.

这里我们描述各种对表达式进行的操作. "属性" 介绍一些操作如何自动在所有具有特定头部并且该头部被赋以适合的属性的表达式上进行.

Wolfram 语言函数 Sort[expr] 不仅排列列表元素,也对具有任意头部的表达式排序. 用这种方式,我们可以对任意函数实现结合特性或对称性.

Sort 将函数的变量按序排列.
In[1]:=
Click for copyable input
Out[1]=
Sort[expr]按照一种标准顺序对列表或表达式的元素分类
Sort[expr,pred]pred 函数决定是否按顺序排列
Ordering[expr]当排好序时,给出元素的顺序
Ordering[expr,n]当排好序时,给出前 n 个元素的顺序
Ordering[expr,n,pred]使用函数 pred 来决定是否每对都是排好序的
OrderedQ[expr]当表达式 expr 的元素按标准顺序排列时为 True,否则为 False
Order[expr1,expr2] 按标准顺序出现在 前时取值 ,相反时取值

按顺序分类.

Sort 的第二个变量是用于决定是否每对都是排好序的函数. 排序按递减顺序进行.
In[2]:=
Click for copyable input
Out[2]=
根据不含 的元素比含 的元素靠前的次序排列.
In[3]:=
Click for copyable input
Out[3]=
Flatten[expr]压平与 expr 具有相同头部的嵌套函数
Flatten[expr,n]最多取消 n 次嵌套
Flatten[expr,n,h]撤销以 h 为头部的函数的结构
FlattenAt[expr,i]撤销表达式 expr 中的第 i 层结构

压平表达式的结构.

Flatten 压平函数嵌套.
In[4]:=
Click for copyable input
Out[4]=
Flatten 将元素拼接为列表或其它表达式.
In[5]:=
Click for copyable input
Out[5]=

可以使用 Flatten 进行组合. 函数 Distribute 允许你实施特性, 例如,分配特性和线性.

Distribute[f[a+b+,]]f 分配到和式去得到
Distribute[f[args],g]f 分配到头部为 g 的变量
Distribute[expr,g,f]当头部为 f 时分配
Distribute[expr,g,f,gp,fp]f 分配到 g,并分别用 fpgp 代替它们

分配律.

分配到 .
In[6]:=
Click for copyable input
Out[6]=
更复杂的一些例子.
In[7]:=
Click for copyable input
Out[7]=

一般地,f 分配到和式 Plus 时,是将如 的表达式展开为 . 函数 Expand 对标准的代数乘法如Times 进行类似的分配展开. Distribute 可对任意运算进行类似的分配展开.

Expand 实施乘法 Times 对加法 Plus 的分配.
In[8]:=
Click for copyable input
Out[8]=
对一个列表,而非和式,进行分配. 结果包含所有可能的变量对.
In[9]:=
Click for copyable input
Out[9]=
当表达式的头部为 时,对其进行分配.
In[10]:=
Click for copyable input
Out[10]=
当头部是 时,对列表进行分配. 结果,用 代替列表 List,用 代替 .
In[11]:=
Click for copyable input
Out[11]=

Distribute 相关的是函数 Thread. Thread 将函数并行地作用于一个列表或表达式的所有项.

Thread[f[{a1,a2},{b1,b2}]]f 线性作用于列表给出
Thread[f[args],g]f 线性作用于头部为 g 的变量 args

线性作用于表达式的函数.

变量是列表的函数.
In[12]:=
Click for copyable input
Out[12]=
Thread 线性作用于列表的元素.
In[13]:=
Click for copyable input
Out[13]=
不在列表中的元素将重复.
In[14]:=
Click for copyable input
Out[14]=

"将一些对象放在一起" 中提到,并且在 "属性" 中有更详细的讨论,Wolfram 语言的许多内置函数具有可列表的性质,它们可以自动进行线性作用.

内置函数,比如 Log可列表的,因此它们可以自动逐项作用于列表.
In[15]:=
Click for copyable input
Out[15]=
Log 不能自动对方程进行线性作用.
In[16]:=
Click for copyable input
Out[16]=
可以用 Thread 使函数作用于方程两端.
In[17]:=
Click for copyable input
Out[17]=
Outer[f,list1,list2]广义外积
Inner[f,list1,list2,g]广义内积

广义内积和外积.

Outer[f,list1,list2] 给出 中元素所有可能的组合,并将 f 作用于这些组合. Outer 可以看作是张量的积的推广,如 "张量" 中讨论的.

Outer 给出了元素的所有组合,并用 作用.
In[18]:=
Click for copyable input
Out[18]=
这里 Outer 产生一个下三角 Boolean 矩阵.
In[19]:=
Click for copyable input
Out[19]=
Outer 可用于任何头部相同的表达式.
In[20]:=
Click for copyable input
Out[20]=

Distribute 一样,Outer 给出元素所有可能的组合,而 InnerThread 一样仅给出表达式中相应位置元素的组合.

Inner 形成的结构.
In[21]:=
Click for copyable input
Out[21]=
Inner 是内积 Dot 的推广.
In[22]:=
Click for copyable input
Out[22]=