How to| 运用稀疏矩阵

矩阵的稀疏表示非常有用,因为它们不存储每个元素. 如果某一特定值出现得非常频繁,采用稀疏表示将非常有利. Mathematica 通过 SparseArray 对矩阵、向量和张量进行稀疏表示. 它们与稠密矩阵紧密相关,后者由列表表示. 大多数用于列表的运算同样适用于稀疏矩阵.

创建稀疏数组有多种方法. 其中许多方法利用函数 SparseArray 来实现.

这里创建一个稠密矩阵的稀疏矩阵. 稀疏矩阵并不像矩阵那样进行输出,因为它可能会过于庞大:

In[1]:=
Click for copyable input
Out[1]=

您仍将可以像格式化一个矩阵那样格式化:

In[2]:=
Click for copyable input
Out[2]//MatrixForm=

通过指定非零元素,这里创建了一个稀疏矩阵:

In[3]:=
Click for copyable input
Out[3]=

还可使用规则语法 Mathematica 模式创建结构化的稀疏矩阵. 此例创建了一个三对角线矩阵:

In[4]:=
Click for copyable input
Out[5]//MatrixForm=

较为复杂的矩阵可用 Band 创建. 该例中,沿反对角线方向创建了一个矩阵带:

In[6]:=
Click for copyable input
Out[7]//MatrixForm=

还可通过导入诸如 HarwellBoeing 或 Matrix Market 等稀疏矩阵格式中的一种来创建稀疏矩阵.

这里导入一个具有10591个非零元素的961×961样本矩阵:

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=

稀疏矩阵自乘的结果还是一个稀疏矩阵,当零元素的个数可能并不像以前一样理想:

In[11]:=
Click for copyable input
Out[11]=

这是结果. 可以看到,零元素的个数减少了:

In[12]:=
Click for copyable input
Out[12]//MatrixForm=
    

可以像对待稠密矩阵那样提取并设置稀疏矩阵的元素:

In[13]:=
Click for copyable input
Out[13]=

提出元素 (2, 3):

In[14]:=
Click for copyable input
Out[14]=

将元素 (2, 3) 的值设为20:

In[15]:=
Click for copyable input
Out[16]//MatrixForm=
    

有时需要看到稀疏矩阵中非零元素的位置. 这可以通过 MatrixPlot 实现. 即使矩阵有许多元素,MatrixPlot 总能提供矩阵稀疏模式的有效视图.

这里用 Import 加载一个大型矩阵:

In[17]:=
Click for copyable input
Out[17]=

现在绘出矩阵图形,显示有相当程度的矩阵结构:

In[18]:=
Click for copyable input
Out[18]=