稀疏数组:列表的处理

Mathematica 中,列表通过给出元素的明确集合来指定. 但是当处理大型数组时,能够指明特定位置处的元素值,并将其余元素指定为默认值,常常是有用的. 在 Mathematica 中可以使用 SparseArray 对象实现.

{e1,e2,...}, {{e11,e12,...},...}, ...普通列表
SparseArray[{pos1->val1,pos2->val2,...}]
稀疏数组

普通列表和稀疏数组.

这里指定了一个稀疏数组.
In[1]:=
Click for copyable input
Out[1]=
这是普通列表的形式.
In[2]:=
Click for copyable input
Out[2]=
这里指定了一个二维稀疏数组.
In[3]:=
Click for copyable input
Out[3]=
这是由列表组成的普通列表.
In[4]:=
Click for copyable input
Out[4]=
SparseArray[list]list 的稀疏数组版本
SparseArray[{pos1->val1,pos2->val2,...}]
在位置 上值为 的稀疏数组
SparseArray[{pos1,pos2,...}->{val1,val2,...}]
同样的稀疏数组
SparseArray[Band[{i,j}]->val]值为 val 的带状稀疏矩阵
SparseArray[data,{d1,d2,...}]××... 稀疏数组
SparseArray[data,dims,val]默认值为 val 的稀疏数组
Normal[array]array 的普通列表版本
ArrayRules[array]array 的位置值规则

创建和转换稀疏数组.

这里产生列表的稀疏数组版本.
In[5]:=
Click for copyable input
Out[5]=
将其转换为一个普通列表.
In[6]:=
Click for copyable input
Out[6]=
这里生产一个默认值为 ,长度为7的稀疏数组.
In[7]:=
Click for copyable input
Out[7]=
这是相应的普通列表.
In[8]:=
Click for copyable input
Out[8]=
这里显示了稀疏数组中采用的规则.
In[9]:=
Click for copyable input
Out[9]=
这里创建一个带状矩阵.
In[10]:=
Click for copyable input
Out[10]//MatrixForm=

SparseArray 的重要特征是用户指定的位置可以是模式.

这里指定了一个4×4稀疏数组,与 匹配的每个位置为 .
In[11]:=
Click for copyable input
Out[11]=
该结果是一个4×4的单位矩阵.
In[12]:=
Click for copyable input
Out[12]=
这是一个具有额外元素的单位矩阵.
In[13]:=
Click for copyable input
Out[13]=
整个第3列为 .
In[14]:=
Click for copyable input
Out[14]=

可以认为 SparseArray[rules] 是采用所有可能位置的规格,然后应用 rules 来确定每个情况下的值. 通常情况下,列表中先给出的规则将被首先尝试.

这里产生一个随机对角线矩阵.
In[15]:=
Click for copyable input
Out[15]=
用户可以具有值取决于索引的规则.
In[16]:=
Click for copyable input
Out[16]=
这里使用 对每个偶数位进行填充.
In[17]:=
Click for copyable input
Out[17]=
用户可以使用涉及另一种选择的模式.
In[18]:=
Click for copyable input
Out[18]=
用户也可以对模式给出条件.
In[19]:=
Click for copyable input
Out[19]=
这里生成一个带状对角矩阵.
In[20]:=
Click for copyable input
Out[20]=
以下是另一种方式.
In[21]:=
Click for copyable input
Out[21]=

为了许多不同的目的,Mathematica 用类似它们所对应的普通列表的处理方式处理 SparseArray 对象. 因此,例如,如果用户要求一个稀疏数组对象的部分元素,Mathematica 将用类似在对应的普通列表中获取部分元素的方式进行.

这里产生一个稀疏数组对象.
In[22]:=
Click for copyable input
Out[22]=
以下是对应的普通列表.
In[23]:=
Click for copyable input
Out[23]=
稀疏数组的部分元素类似于对应的普通列表的部分元素.
In[24]:=
Click for copyable input
Out[24]=
该部分元素具有默认值0.
In[25]:=
Click for copyable input
Out[25]=

许多操作用类似普通列表的方式处理 SparseArray 对象. 在可能的情况下,它们给出稀疏矩阵作为结果.

这里给出一个稀疏数组.
In[26]:=
Click for copyable input
Out[26]=
以下是对应的普通列表.
In[27]:=
Click for copyable input
Out[27]=
Dot 直接对稀疏数组对象进行操作.
In[28]:=
Click for copyable input
Out[28]=
用户可以混合稀疏数组和普通列表.
In[29]:=
Click for copyable input
Out[29]=

Mathematica 用具有头部 SparseArray 的表达式表示稀疏数组. 当计算一个稀疏数组的时候,它就自动转换为具有结构 SparseArray[Automatic, dims, val, ...] 的优化标准形式.

然而,该结构很少是明显的,由于建立类似 Length 的操作可以对相应的普通列表给出结果,而不是对原始SparseArray 表达式结构给出结果.

这里产生一个稀疏数组.
In[30]:=
Click for copyable input
Out[30]=
以下是内部优化表达式结构.
In[31]:=
Click for copyable input
Out[31]//InputForm=
Length 给出对应的普通列表的长度.
In[32]:=
Click for copyable input
Out[32]=
Map 也对单个数值进行操作.
In[33]:=
Click for copyable input
Out[33]=
New to Mathematica? Find your learning path »
Have a question? Ask support »