How to| 运用稀疏矩阵
矩阵的稀疏表示非常有用,因为它们不存储每个元素. 如果某一特定值出现得非常频繁,采用稀疏表示将非常有利. Wolfram 语言通过 SparseArray 对矩阵、向量和张量进行稀疏表示. 它们与稠密矩阵紧密相关,后者由列表表示. 大多数用于列表的运算同样适用于稀疏矩阵.
创建稀疏数组有多种方法. 其中许多方法利用函数 SparseArray 来实现.
这里创建一个稠密矩阵的稀疏矩阵. 稀疏矩阵并不像矩阵那样进行输出,因为它可能会过于庞大:
mat = SparseArray[ {{0, 1, 0}, {1, 0, 1}, {0, 1, 0}}]mat//MatrixFormmat = SparseArray[ {{1, 2} -> 1, {2, 1} -> 1, {2, 3} -> 1, {3, 2} -> 1}]还可使用规则语法 :> 及 Mathematica 模式创建结构化的稀疏矩阵. 此例创建了一个三对角线矩阵:
mat = SparseArray[ {i_, j_} /; Abs[i - j] ≤ 1 :> 1, {8, 8}];
mat//MatrixForm较为复杂的矩阵可用 Band 创建. 该例中,沿反对角线方向创建了一个矩阵带:
mat = SparseArray[Band[{1, -1}, {-1, 1}, {1, -1}] -> x, {5, 5}];
mat//MatrixForm还可通过导入诸如 Harwell–Boeing 或 Matrix Market 等稀疏矩阵格式中的一种来创建稀疏矩阵.
这里导入一个具有10591个非零元素的961×961样本矩阵:
Import["LinearAlgebraExamples/Data/dwg961b.cua", "HarwellBoeing"]能够用于稠密矩阵的函数通常也适用于稀疏矩阵. 它们往往将使用速度较快且不需转换成稠密矩阵的特殊稀疏矩阵技术. 这样做能够大大节省时间和内存.
mat = SparseArray[{Band[{2, 1}] -> 1., Band[{1, 1}] -> 2., Band[{1, 2}] -> 3.}, 5]mat//MatrixForm稀疏矩阵自乘的结果还是一个稀疏矩阵,当零元素的个数可能并不像以前一样理想:
mat1 = mat.matmat1//MatrixForm有时需要看到稀疏矩阵中非零元素的位置. 这可以通过 MatrixPlot 实现. 即使矩阵有许多元素,MatrixPlot 总能提供矩阵稀疏模式的有效视图.
这里用 Import 加载一个大型矩阵:
mat = Import["LinearAlgebraExamples/Data/dwg961b.cua", "HarwellBoeing"]MatrixPlot[mat]