SparseArray[{pos1v1,pos2v2,…}]
生成一个除位置 posi 上的值为 vi 外其他元素为零的稀疏数组.
SparseArray[list]
生成一个稀疏数组 list.
SparseArray[data,{d1,d2,…}]
生成一个稀疏矩阵,表示一个 d1d2… 数组.
SparseArray[data,dims,val]
生成一个稀疏数组,使得该数组中未被说明的元素赋值 val.
SparseArray
SparseArray[{pos1v1,pos2v2,…}]
生成一个除位置 posi 上的值为 vi 外其他元素为零的稀疏数组.
SparseArray[list]
生成一个稀疏数组 list.
SparseArray[data,{d1,d2,…}]
生成一个稀疏矩阵,表示一个 d1d2… 数组.
SparseArray[data,dims,val]
生成一个稀疏数组,使得该数组中未被说明的元素赋值 val.
更多信息
- SparseArray 也称为稀疏矩阵.
- 稀疏数组通常高效用于多数项为零的线性代数和图形邻接矩阵.
- 稀疏数组仅存储非零值的位置,但可表示完整数组:
- data 可有如下格式:
-
rules 指定位置和值的规则. list 将数组转换为 SparseArray SymmetrizedArray[…] 转换为 SparseArray QuantityArray[…] 转换为 Quantity 的 SparseArray SparseArray[…] 最小化明确的非零元素 - 设置 s=SparseArray[rules,…] 可使用下列规范:
-
{{i1 1,…,i1 r}v1,{i2 1,…,i2 r}v2,…} s[[i1 1, …, i1 r]] 有 v1 值,s[[i2 1, …, i2 r]] 有 v2 值,以此类推 pattv 对于所有匹配模式 patt 的 {ik 1,…,ik r} 有{{i1 1,…,i1 r}v,{i2 1,…,i2 r}v,…} patt:>v 为每个匹配位置计算值 v Band[…]vals 为所有带状结构和子区块指定值 {pos1,pos2,…}{v1,v2,…} 等价于 {pos1v1,pos2v2,…} - SparseArray 转换包括:
-
Normal[SparseArray[…]] 转换为普通 List 数组. SymmetrizedArray[SparseArray[…]] 转换为对称数组. ArrayRules[SparseArray[…]] 给出规则列表 {pos1->v1,pos2->v2,…} - SparseArray 对象是普通数组的表示,所以很多函数会像其在普通数组上那样作用. 范例包括像 Dimensions、Part、Plus 和 LinearSolve 的函数.
- SparseArray[data,…] 通常会转换为最优标准格式,其结构为 SparseArray[Automatic,dims,val,…].
- SparseArray 被像 AtomQ 和目的为模式匹配的的函数视为原始对象.
- 默认情况下,SparseArray 将未指定的元素值 val 视为零.
- SparseArray 中的元素不需要是数字,但其本身不能是列表.
- SparseArray[…][prop] 给出 SparseArray 对象的属性 prop. 可能会给出下列属性:
-
"ImplicitValue" 给出未明确指定值的元素 "ExplicitLength" 给出明确值的数量 "ExplicitValues" 给出明确值的列表 "ExplicitPositions" 给出对应明确值的位置列表 "ColumnIndices" 根据压缩稀疏行表示给出列索引 "RowPointers" 根据压缩稀疏行表示给出行指针 "BandWidth" 给出稀疏矩阵非对角线带宽 "Density" 给出明确值元素数量和总元素数量的比例
范例
打开所有单元 关闭所有单元基本范例 (1)
范围 (7)
SparseArray[Table[{2 ^ i} -> 1, {i, 10}]]SparseArray[Table[{2 ^ i, 3 ^ i + i} -> 1, {i, 10}]]SparseArray[Table[{2 ^ i, 3 ^ i + i, i ^ 5} -> 1, {i, 10}]]s = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {5, 5}]MatrixForm[s]s = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {10 ^ 4, 10 ^ 4}]d = RandomReal[1, {100}];m = SparseArray[{i_, i_} :> d[[i]], Length[d]{1, 1}]它等同于 DiagonalMatrix:
m == DiagonalMatrix[d]{ByteCount[m], ByteCount[DiagonalMatrix[d]]}用规则 Band 构建一个分块对角矩阵:
s = SparseArray[Band[{1, 1}] -> {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}]MatrixForm[s]SparseArray[{{1, 0, 0}, {1, 2, 0}, {1, 2, 3}}]rules = Table[RandomInteger[{1, 2}, 4] -> i, {i, 10}]s = SparseArray[rules]Normal[%]ArrayRules 生成一个规则的最小列表,它需要指定 SparseArray:
ArrayRules[s]许多典型的操作对 SparseArray 对象起作用,对其它同类型列表也起作用:
m1 = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {5, 5}];
m2 = SparseArray[{{i_, i_} -> 1}, {5, 5}];Map[MatrixForm, {m1, m2}]MatrixForm[m1 + 2 m2]矩阵积采用 Dot:
MatrixForm[m1.m1]LinearSolve[N[m1], {0, 1, 2, 1, 0}]Map[f, m1, {2}]MatrixForm[%]推广和延伸 (2)
s = SparseArray[{i_, i_} -> y, {3, 3}, x]MatrixForm[s]ns = SparseArray[{{i_, i_} -> -2., {i_, j_} /; Abs[i - j] == 1 -> 1.}, {5, 5}, 0.]MatrixForm[ns]s = SparseArray[{{i_, i_} -> -2, {i_, j_} /; Abs[i - j] == 1 -> 1}, {5, 5}]N[s] 和 ns 相同:
SameQ[ns, N[s]]应用 (4)
Normal[SparseArray[10 -> 1, 19]]Normal[SparseArray[{3, 3} -> 1, 5]]ListLinePlot[SparseArray[{1 -> 2, 10 -> 7, 3 -> 2}]]s = SparseArray[{{i_, j_} /; Mod[2i + j, 7] == 1 -> 1}, {20, 20}]GraphPlot[s]n = 1000;
h = 1. / n;
xgrid = h Range[1, n];
f[x_] := 1 + 100 Exp[-(321(x - 1 / 2)) ^ 2];
g[x_] := Sin[Pi x];id = SparseArray[{i_, i_} -> 1., {n, n}, 0.];
d2 = SparseArray[{{i_, i_} -> -2., {n, n - 1} -> 2., {i_, j_} /; Abs[i - j] == 1 -> 1.}, {n, n}, 0.]u = LinearSolve[d2 / h ^ 2 + id f[xgrid], g[xgrid]];ListPlot[Transpose[{xgrid, u}]]属性和关系 (3)
一个 SparseArray 对象和相应的普通列表 Equal:
s = SparseArray[{{1, 2} -> 3, {4, 5} -> 6}]s == Normal[s]它们不是 SameQ,因为表达结构不同:
s === Normal[s]涉及到 SparseArray 对象的函数 f,通常 f[s]==f[Normal[s]]:
s = SparseArray[RandomInteger[{1, 100}, {1000, 2}] -> RandomReal[1, 1000]]Transpose[s] == Transpose[Normal[s]]s.s == Normal[s].Normal[s]这包括具有属性 Listable 的所有函数:
listable = Map[ToExpression, Cases[Names["System`*"], s_String /; MemberQ[Attributes[s], Listable]]];f = First[RandomChoice[listable, 1]]f[s] == f[Normal[s]]使用 CoefficientArrays 把线性表达式转换成 SparseArray 对象:
expr = ListCorrelate[{1, 2, 1}, Array[x, {100}], {2, 2}]; Short[expr]{v, m} = CoefficientArrays[expr, Array[x, {100}]]使用 Dot 把 SparseArray 转换成表达式:
m.Array[x, {100}]//Short可能存在的问题 (9)
如果 SparseArray 中同一坐标位置在变换规则表中重复出现, 以首次出现的为准:
SparseArray[{{1, 1} -> 1, {1, 1} -> 2}]//NormalSparseArray[{{i_, i_} -> 1, {1, 1} -> 2}]//Normal由于数据量过大而无法全部表示时,SparseArray 给出下面的表现形式:
s = SparseArray[{{i_, i_} -> i}, {100000, 100000}]用 Normal 会给出一个 SystemException:
Normal[s]s = SparseArray[{{i_, i_} -> 1, {i_, j_} /; Abs[i - j] == 1 -> 1}, {3, 3}]r = s.s - 2sMatrixForm[r]用 SparseArray 重新计算稀疏数组结构:
SparseArray[r]SparseArray 表示的内部结构不是唯一的,SameQ 会检测到以下情况:
s1 = SparseArray[{1, 1} -> 1, {2, 2}];
(s1 - s1) === SparseArray[{}, {2, 2}]使用 SparseArray 重新计算稀疏结构:
SparseArray[s1 - s1] === SparseArray[{}, {2, 2}]注意 Equal 可以按预期工作:
(s1 - s1) == SparseArray[{}, {2, 2}]SparseArray 表示的内部结构不是唯一的,并且设置部分可以更改该结构:
s1 = SparseArray[{{3}, {5}} -> 1, {6}];
s2 = SparseArray[{{5}} -> 1, {6}];
s2[[3]] = 1;测试 SparseArray 实例是否相同:
s1 === s2使用 SparseArray 重新计算稀疏结构:
s1 === SparseArray[s2]注意 Equal 可以按预期工作:
s1 == s2在对 SparseArray 进行迭代计算时. 有误差的操作可能会给出不同的值:
s = SparseArray[{{1} -> 2, {4} -> 3}]Module[{i = 1}, Scan[i++&, s];i]Module[{i = 1}, Scan[i++&, Normal[s]];i]Reap[Map[Sow, s]]Reap[Map[Sow, Normal[s]]]对于一个 SparseArray 对象, Part 给出对应的列表的部分:
s = SparseArray[{i_} -> i, {5}]Part[s, 1]FullForm 是从基本存储信息中的重构对象的方式:
FullForm[s]一些不能作用于表达式的函数,在作用于SparseArray 的对象时,该对象会被作为基本单位而无法处理:
s = SparseArray[{i_, i_} -> i, {5, 5}]Cases 不能作用于表示的矩阵:
Cases[s, i_ /; i > 0, Infinity]Cases[Normal[s], i_ /; i > 0, Infinity]可以使用 ArrayRules 的结果,这样不用展开就可以能得到信息:
Cases[ArrayRules[s], (p_ -> i_ /; i > 0) -> i, 1]即使对于稠密 SparseArray,也可能出现被 0 除的情况:
s = SparseArray[{{2, 1}, {1, 2}}]1 / s该 SparseArray 的密度为 1:
s["Density"]由于密度为 1 的 SparseArray 是一种非常特殊的情况,完成该计算将过于耗费资源. 在这种情况下,由于矩阵是稠密的,使用 Normal 才更合理:
1 / Normal[s]巧妙范例 (1)
SetAttributes[cellupdate, Listable];
cellupdate[1, 2] = cellupdate[_, 3] = 1;
cellupdate[_, _] = 0;update[m_] := cellupdate[m, Sum[RotateRight[m, r], {r, {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}}]]Block[{n = 100, m = 10, h}, h = Floor[n / 2 - m / 2];s = SparseArray[Band[{h, h}] -> RandomInteger[1, {m, m}], {n, n}]];
Table[ArrayPlot[Do[s = update[s], {10}];s = SparseArray[s]], {8}]技术笔记
-
▪
- 构建列表 ▪
- 稀疏数组:列表的处理 ▪
- 稀疏数组:线性代数 ▪
- 关于内部实现的一些注释: 数值及相关函数
相关的工作流程
- 创建一个矩阵
历史
2003年引入 (5.0) | 在以下年份被更新:2007 (6.0) ▪ 2021 (13.0)
文本
Wolfram Research (2003),SparseArray,Wolfram 语言函数,https://reference.wolfram.com/language/ref/SparseArray.html (更新于 2021 年).
CMS
Wolfram 语言. 2003. "SparseArray." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2021. https://reference.wolfram.com/language/ref/SparseArray.html.
APA
Wolfram 语言. (2003). SparseArray. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/SparseArray.html 年
BibTeX
@misc{reference.wolfram_2026_sparsearray, author="Wolfram Research", title="{SparseArray}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/SparseArray.html}", note=[Accessed: 29-June-2026]}
BibLaTeX
@online{reference.wolfram_2026_sparsearray, organization={Wolfram Research}, title={SparseArray}, year={2021}, url={https://reference.wolfram.com/language/ref/SparseArray.html}, note=[Accessed: 29-June-2026]}