稀疏数组:列表的处理
在 Mathematica 中,列表通过给出元素的明确集合来指定. 但是当处理大型数组时,能够指明特定位置处的元素值,并将其余元素指定为默认值,常常是有用的. 在 Mathematica 中可以使用 SparseArray 对象实现.
| {e1,e2,...}, {{e11,e12,...},...}, ... | 普通列表 |
| SparseArray[{pos1->val1,pos2->val2,...}] |
| 稀疏数组 |
普通列表和稀疏数组.
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
| 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 的位置值规则 |
创建和转换稀疏数组.
| Out[5]= |  |
| Out[6]= |  |
这里生产一个默认值为

,长度为7的稀疏数组.
| Out[7]= |  |
| Out[8]= |  |
| Out[9]= |  |
Out[10]//MatrixForm= |
| |  |
SparseArray 的重要特征是用户指定的位置可以是模式.
这里指定了一个4×4稀疏数组,与

匹配的每个位置为

.
| Out[11]= |  |
| Out[12]= |  |
| Out[13]= |  |
整个第3列为

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

对每个偶数位进行填充.
| Out[17]= |  |
| Out[18]= |  |
| Out[19]= |  |
| Out[20]= |  |
| Out[21]= |  |
为了许多不同的目的,Mathematica 用类似它们所对应的普通列表的处理方式处理 SparseArray 对象. 因此,例如,如果用户要求一个稀疏数组对象的部分元素,Mathematica 将用类似在对应的普通列表中获取部分元素的方式进行.
| Out[22]= |  |
| Out[23]= |  |
稀疏数组的部分元素类似于对应的普通列表的部分元素.
| Out[24]= |  |
| Out[25]= |  |
许多操作用类似普通列表的方式处理 SparseArray 对象. 在可能的情况下,它们给出稀疏矩阵作为结果.
| Out[26]= |  |
| Out[27]= |  |
| Out[28]= |  |
| Out[29]= |  |
Mathematica 用具有头部 SparseArray 的表达式表示稀疏数组. 当计算一个稀疏数组的时候,它就自动转换为具有结构 SparseArray[Automatic, dims, val, ...] 的优化标准形式.
然而,该结构很少是明显的,由于建立类似 Length 的操作可以对相应的普通列表给出结果,而不是对原始SparseArray 表达式结构给出结果.
| Out[30]= |  |
Out[31]//InputForm= |
| |  |
| Out[32]= |  |
| Out[33]= |  |