在 Wolfram 语言的后续版本中引入了与本教程内容相关的附加功能. 最新信息请见矩阵和线性代数.

稀疏数组的运用

矩阵的稀疏表示非常有用,因为不用存储每个元素. 如果一个特定值出现得非常频繁,使用稀疏表示将非常有利. Wolfram 语言通过 SparseArray 提供了矩阵、向量和张量的稀疏表示.

本教程讨论的是如何 在 Wolfram 语言中创建和使用 SparseArray 对象. 如果您对关于稀疏矩阵上进行线性代数计算感兴趣的话,您需要参考"矩阵计算"一节.

基本运算

在 Wolfram 语言中表示稀疏矩阵的基本对象是 SparseArray.

SparseArray[list]一个普通列表的 SparseArray 形式
SparseArray[{{i1,j1}->v1,{i2,j2}->v2,},{m,n}]
元素{ik,jk} 取值为 vkm×n 稀疏数组
SparseArray[{{i1,j1},{i2,j2},}->{v1,v2,},{m,n}]
相同的稀疏数组
SparseArray[data,{m,n},def]一个默认元素为 defm×n 稀疏数组
SparseArray[Band[b]->v,{m,n}]一个 m×n 带状稀疏数组
Normal[array]对应于一个SparseArray 的普通列表
ArrayRules[m]非零元素的位置
一个 SparseArray 对象可以通过给出一个非零元素列表来创建:
默认设置下,将输出一个特殊格式的稀疏矩阵. 使用 MatrixForm 可看到稀疏数组所表示的矩阵:
稀疏矩阵的运算完全等价于稠密矩阵的运算. 例如,算术运算被支持,其结果是一个稀疏数组:
可列表运算对于稀疏数组也同样有效,并将效力渗透于各个元素:
支持所有使用函数 Dot 的矩阵乘法的组合. 这里示范的是两个稀疏数组的点积:
这里示范的是带有一个稠密向量的稀疏数组的点积:
带有一个稠密矩阵的稀疏数组的点积是被支持的:
稀疏表示的有用性在于它们不存储每个元素. 如果一个特定的值多次出现在稀疏数组(这个值通常是零),那么只存储那些异于这个共同值的元素更为有效. 默认的输出格式显示了非默认元素的个数和维数:
如果一个数与稀疏数组相加,它是与所有元素相加,包括默认的元素零. 由于现在默认的元素不再是零,而是1.5,于是在输出中显示:
如果命令 N 被应用于一个稀疏矩阵,它将对所有元素生效. 这里构建一个用作示范的3×3 稀疏矩阵:
N 被应用于稀疏矩阵,结果将是一个稀疏矩阵,其中所有元素(包括默认元素)均为近似机器数值:
这里一个带有精度参数的 N 应用于矩阵. 这生成20位精度的近似实数构成的稀疏矩阵. 注意的是N[0,20] 的结果仍为 0:

SparseArray

生成一个稀疏数组的主要函数是 SparseArray. 这可以在一个矩阵上进行运算以生成其稀疏表示:
SparseArray 也可以取一个表示一定部位的值的规则列表:
一个与 SparseArray 等价的语法将指标和元素值各自分组成立列表:
这两种形式的 SparseArray 的结果是相同的:

有关这两种形式相对优越性的更完全讨论在"SparseArray 的规则输入"一节中给出.

SparseArray 也能够接受要创建的矩阵的维数. 这里,尽管最大的显式指标是{2,3},仍创建了一个 5×5 矩阵:
在这个例子中,默认值被设定为1;通常的默认值是0:
允许改变默认值使得许多面向元素的运算速度非常快. 这些运算只需要在实际出现的元素和默认值上进行:
用户也可以给出规则的模式. 这通常是构建结构化矩阵的一个便利途径. 用户能够使用规则右首的模式名称. 通常,如果可以这样进行的话使用 Band 较好;这在"带状稀疏疏组"一节中讨论:

Wolfram 语言使用符号化的代数技术来简化某些构建稀疏疏组的模式. 这允许构建稀疏疏组时不用测试每一个潜在元素,来看其是否确实在数组中出现,这样做显著节省了计算时间.

您可以使用 Wolfram 语言函数 Random 来生成各项为伪随机数的稀疏数组. 您也可以使用Random 来生成稀疏数组的指标. 在这个例子中生成了一个最多有50个非默认项的 10×10 稀疏矩阵:
如果想在稀疏数组或任何其它要计算的表达式右端规则上使用 Random,您应该使用RuleDelayed (通过 输入)来形成规则. 如果不这样做,在整个稀疏矩阵中将使用同一个数值:

一般原则是:SparseArray 中所用的规则与 Wolfram 语言中所有规则的通常使用方式相同.

SparseArray 的规则输入

作为 SparseArray 输入语法的规则有两种不同的使用方式,它们在此作以示范:
两种方式生成完全相同的稀疏数组:

如果想要混合显式的模式指标,使用存在多个规则的第一种形式是方便的. 对于小型数组来说,这种方式也通常更具可读性. 如果您只有显式指标(例如在从一个文件中读取数据后),则第二种形式更加有效.

这里使用多个规则的 SparseArray 来混合显式的模式指标:
这里示范的是只使用一个规则的 SparseArray 的形式. 测量计算所用的时间是为了说明性能:
使用 Thread 将单一规则转化为多重归则是可能的. 这比生成稀疏数组花费的时间更多:
这里使用 SparseArray 的多重规则形式. 它比单一规则形式慢:
SparseArray 的单一规则形式较快的一个原因是指标和元素可以使用压缩数组这种有效的存储技术. 如果它们由压缩数组转化过来,则 SparseArray 较慢,如下所示:

关于压缩数组的更多信息参见"压缩数组".

带状稀疏数组

如果想要构建具有某种类型带状结构的稀疏矩阵,可以通过 Band 实现.

SparseArray[Band[b]->v,{m,n}]一个 m×n 带状稀疏数组
Band[{i,j}]开始于位置{i,j}的对角矩阵带
Band[{imin,jmin},{imax,imax}]{imin,jmin}{imax,imax}的对角矩阵带
Band[{imin,jmin},{imax,imax}{di,dj}]{imin,jmin} 开始,以步长{di,dj}移动的对角矩阵带
创建一个对角矩阵:
在对角线的上下方均有矩阵带:
沿着反对角线插入一个矩阵带:

一般地,使用 Band 来创建稀疏数组将更加有效.

单位矩阵和对角稀疏矩阵

在 Wolfram 语言中有许多创建单位矩阵和对角稀疏矩阵的方法.

IdentityMatrix[n,Sparse->True]稀疏单位矩阵
DiagonalMatrix[SparseArray[{a,b,c,d}]]
稀疏对角矩阵
生成一个 4×4 稀疏单位矩阵:
生成一个 4×4 稀疏对角矩阵:
如果想要进行浮点数的计算,使用包含浮点数项的矩阵会非常有利;这在"矩阵内容"一节中将有更详细的介绍. 对于 IdentityMatrix,可以使用选项 WorkingPrecision
对于对角矩阵,您可以确定对角线上是否已经是机器精度的数:

注意矩阵所有项是如何均为机器精度数值的. 这对改善你的计算效率会有所帮助. 关于 Wolfram 语言可以操作的不同矩阵类型在"矩阵类型"一节中有更详细的介绍.

Normal

将一个稀疏数组转化为它所表示的稠密对象,可以使用 Normal
当然,生成一个不能在您的系统上表示的稀疏数组是非常直接的. 例如,下面的稀疏矩阵只有两个非零元素,但有2499999998个零元素:
如果将这个矩阵转化为稠密矩阵,将引发异常情况,因为在一般的计算机上将其表示是不可能的:

ArrayRules

SparseArray 能够接受一个规则列表来形成稀疏数组. 这些规则持有非零元素的指标和值. 在下面的例子中,在位置{2,1} 处的元素的值为5. ArrayRules 生成一个稀疏数组的规则:
ArrayRules 返回代表稀疏数组的规则. 它返回一个空白模式的规则{_,_} 来显示默认值:
当一个标量被加入该稀疏数组,默认值将改变. 例如这里的默认值是5:
ArrayRules 可取一个第二参数,这个参数是输出中所显示的默认值. 这里使用的是一个取值为5的默认规则. 由于只有一个元素的值为5,规则列表要长得多:
ArrayRules 为得到稀疏数组的信息,例如非默认元素或默认值等,提供了一个非常有用的途径. 这个例子说明的是如何得到非默认元素的指标:

结构化操作

稀疏数组的结构化操作完全等价于稠密矩阵的操作.

得到矩阵的一部分

通过 Wolfram 语言函数 Part 可以非常直接地提取一个稀疏矩阵的元素、行和列. 通常 Part 的输入符号是[[ ]].

m[[i,j]]i,j
m[[i]]i
m[[i;;j]]ij
m[[All,i]]i
m[[All,i;;j]]ij
m[[{i1,,ir},{j1,,js}]]由行标为 ik 及列标为 jk 的元素组成的 r×s 子矩阵
Tr[m,List]m 的对角元素列表

得到部分矩阵的方式.

这是一个用作示范的稀疏矩阵:
得到第一行的第三个元素:
得到第三行;该行以稀疏向量的形式被返回:
也可以通过使用 All 指定所有行来获得一列;该列以稀疏向量的形式被返回:
负指标用于指示矩阵的末尾. 下面得到的是最后一行的最后一个元素:
使用 ;; 可以得到矩阵的一个范围. 这将得到第二至四行:
这将得到第二至四列:
也可以给出一个跨度. 这将得到每隔一行的元素:
函数 Tr 作用于一个矩阵的对角元素. 单参数形式将它们相加:
Tr 也可以取一个函数作为第二个参数,它将应用于对角元素上. 如果使用的是 List,这将返回对角元素:

得到多个部分

使用列表中的指标提取多个元素是可能的. 这将通过下面的矩阵进行示范:
下面得到的是第三行的第一个和第三个元素:
下面得到的是第一行和第三行:
下面得到的是第一行和第二行的第一个和第三个元素:

设置矩阵的一部分

在赋值式左端通过 Wolfram 语言函数 Part 可以非常直接地设置稀疏矩阵的元素、行和列.

m={{a11,a12,},{a21,a22,},}指定 m 为一个矩阵
m[[i,j]]=v将元素{i,j}的值重置为 v
m[[i]]=v将行 i 的全部元素重置为 v
m[[i]]={v1,v2,}将行 i 的元素重置为{v1,v2,}
m[[All,j]]=v将列 j 的全部元素重置为 v
m[[All,j]]={v1,v2,}将列 j 的元素重置为{v1,v2,}

重置矩阵的部分.

这是一个示范稀疏矩阵:
要更新矩阵的一部分,可以在赋值式左端使用 Part. 这里设置了第三行的第三个元素:
这里设置矩阵的第二行:
这里,第二列被设置:
您也可以使用范围语法来设置矩阵的一部分. 这里设置隔行的每个元素为 z

设置多个部分

使用列表中的指标设置多个元素是可能的. 这将通过下面的矩阵进行示范:
下面设置的是第二行的第一个和第三个元素:
如果赋值式右端是一个与要指定的元素个数匹配的列表,赋值是一个元素一个元素地进行. 因此,下面第二行的第一个和第三个元素被给出两个不同值:
下面设置的是第二行和第三行:
下面给出第二和第三行的两个不同值:
下面设置第二行和第三行的第一个和第三个元素:
下面给第二行和第三行的第一个和第三个元素设置上不同的值:

提取子矩阵

范围语法对于提取子矩阵很有用.

m[[i0;;i1,j0;;j1]]提取由行 i0i1、列 j0j1组成的子矩阵
m[[i0;;i1]]提取由行 i0i1 组成的子矩阵
m[[All,j0;;j1]]提取由列 j0j1 组成的子矩阵

提取子矩阵.

提取由 m2,1m3,2 的子矩阵:
提取行 1 至 3 组成的子矩阵:
提取列 2 至 4 组成的子矩阵:
可以使用负指标来倒数. 这将返回第一列和最后一列被去除后的的矩阵:

删除行和列

如果想要删除行或列,可以使用 Drop.

Drop[m,{i0,i1}]删除行 i0i1
Drop[m,{},{j0,j1}]删除列 j0j1
Drop[m,{i0,i1},{j0,j1}]删除行 i0i1 以及列 j0j1

删除行和列.

这里去除行2至4:
这里去除列2至4:
在这个例子中,行2和3以及列1、2和3都被去除:

插入行和列

如果想要插入一个行,可以使用 Insert.

Insert[m,r,i]将行 r 插入矩阵 m 的位置 i

插入一个行.

在第3行之前插入一行:
如果想要插入一个列,必须要进行矩阵转置,将该列当作一行插入,然后再将矩阵转置回来. 这里在第5列前插入一列:

扩展矩阵

通过 PadLeftPadRight 进行矩阵的填充可以增加其大小:
PadLeft 将元素加到矩阵的开始. 这个例子返回一个 4×4 稀疏矩阵:
可以通过 MatrixForm 看到结果:
PadRight 将元素加到矩阵的末端;结果是一个稀疏数组:
如果给定 PadLeft 的是负指标,可以在右端进行填充:
填充函数的一个重要用途是矩阵的复制和平铺. 在这个例子中,输入矩阵的每一行被复制了两遍,每一列被复制了三遍:
PadLeftPadRight 还有一些额外的功能. 这些将在 Wolfram 语言参考文献中介绍:

转置

元素的转置是一种一般的矩阵操作:
Transpose 在特定指标处将元素对换;结果是一个稀疏数组:
如果要计算稀疏矩阵的共轭转置,可以使用 ConjugateTranspose
如果一个矩阵等于其共轭转置,则被称作 Hermitian:
也可以使用函数 HermitianMatrixQ 进行测试:

元素的轮换

另一种结构化的操作是在一个指标内进行元素的轮换. 这可以通过函数 RotateLeftRotateRight 实现:
这里在第一层上向左轮换一步,因此这是在行上进行操作;结果是一个稀疏数组:
这里在第一层上向左轮换一步,因此这是在列上进行操作;结果是一个稀疏数组:
这里在相反方向进行列的轮换:

测试矩阵

Wolfram 语言提供了一些函数来测试稀疏矩阵和提取尺寸信息.

VectorQ[expr]如果 expr 是向量的形式则给出 True,否则给出 False
MatrixQ[expr]如果 expr 是矩阵的形式则给出 True,否则给出 False
ArrayQ[t,n]测试 t 是否是一个秩为 n 的张量
Dimensions[expr]一个向量或矩阵的尺寸列表
ArrayDepth[t]找到一个张量的秩
mi==mj比较两个矩阵的等价性
断言 MatrixQ 可以用于测试稀疏矩阵. 它也可以如先前所示,用于测试稠密矩阵:
这里测试 sp 是否是一个稀疏矩阵:
MatrixQ 可取一个第二参数来指定应用于每个元素的测试.这个例子中,对每个元素是否为整数 进行测试:
在这个例子中,每个元素必须是一个大于1的整数. 由于一些元素是0,结果是False
除了 MatrixQ 外,还有 VectorQArrayQ 等断言,它们用于测试向量和张量:
ArrayQ 也可以取一个秩参数来测试数组的深度. 在这个例子中,稀疏参数不是一个秩为4的张量,结果是 False
ArrayQ 还可以取一个第三参数来测试每个元素. 在这个例子中,因为所有的元素都是 NumberQ,因此结果是 True
命令 Dimensions 用于提取尺寸信息:
当输入为一个矩阵时,Dimensions 返回一个长度为2的列表,表明有两个指标来标识矩阵中任何元素. 另外一种测试标识元素所需指标数的方法是通过 ArrayDepth;它等价于Length[Dimensions[sp]]
为了比较两个矩阵的元素是否相等,可以使用 Equal,其通常所用的快捷输入方式是 ==. 例如,将元素与其自身比较将返回 True
Equal 使用的是数值,因此可用于比较整数和实数值:

应该注意的是,Equal 可用于任何 Wolfram 语言表达式. 如果想要使用矩阵的整体性质来比较两个矩阵的等价性,比较矩阵范数的效果可能更好. 这在"矩阵范数"一节中讨论.

进一步的结构化操作

本节讨论用于矩阵运算的进一步的结构化操作.

Flatten[m]展平 m 中的嵌套列表
Flatten[m,n]展平 m 中的嵌套列表至第 n
Partition[m,n]m 分成长度为 n 的子列表
Join[m1,m2]连接 m1m2
Append[m,r]m 的末端插入行 r
Prepend[m,r]m 的开始插入行 r
这里生成一个样本矩阵用作示范:
将矩阵展平成一个向量:
使用 Partition 指定行的长度为3可以使该向量重新变回原来的矩阵:
通过函数 Join 可以将多个矩阵连接在一起:
另外,也可以将新矩阵以新列的形式横向连接:
使用 Append 可以在矩阵末端插入新行:

应该注意的是这也可以通过 Insert 实现. 这将在"插入行和列"一节中说明.

面向元素的操作

使用 Wolfram 语言可以轻松操作稀疏矩阵中的元素. 首先,创建一个浮点数矩阵:
通常,应用于一个矩阵的代数运算在每个元素上生效. 这里把矩阵与5相加:
这里,矩阵的每个元素都进行平方:
如果一个矩阵与另外一个矩阵相除,除法运算也是逐个元素进行. 如果两个矩阵的维数不一致,则会出现错误:
要使 Sin 函数作用于每个元素,要将整个矩阵应用 Sin
如果一种运算的两个参数均为矩阵,则运算在两个矩阵的相应元素上进行. 这里的结果相当于将矩阵乘以2:
如果一个参数是矩阵,而另一个参数是向量,则运算在矩阵的行与向量的元素上进行. 这是生成对角稀疏矩阵的一种有效方式:

所有这些运算都非常快,因为它们只需要对实际存储的元素(包括默认元素)进行运算.

注意使用运算符 Times 将两个矩阵相乘等价于将两个矩阵的相应元素相乘. 另一方面,矩阵乘法可以通过函数 Dot 实现,这在"矩阵乘法"一节中介绍. 面向元素的乘法通过下面的例子说明:

可列表性

如果想要将您自定义的函数应用于矩阵的每个元素,您应该给定函数 Listable 的属性. 这个函数将每个元素进行平方后除以3:

当可列表运算应用于稀疏数组时,它仅对实际存储的元素(包括默认元素)进行运算,因此 fun[0]的值仅计算了一次.

Map

除了利用可列表性外,您也可以使用 Map 将一个函数作用于矩阵中的每个元素:
Map 将对矩阵中的每个元素应用函数fun
您可以看到稀疏数组所表示的矩阵. 注意由于函数 f 没有任何定义,它只将每个元素包裹:
这里,一个将其参数先平方再除以5的函数应用于矩阵的每个元素:

通过 Map 将一个函数应用于一个稀疏数组时,它仅对实际存储的元素(包括默认元素)进行运算.

稀疏矩阵的可视化

本节将回顾关于稀疏矩阵格式化与绘图的可用函数. 由于稀疏矩阵已经很好地集成到系统中,本节中的大部分例子与稠密矩阵的工作方式非常相似. 稠密矩阵的可视化技术在"矩阵的可视化"一节中介绍.

MatrixForm[mat]输出一个矩阵,其中元素以二维数组方式排列
MatrixPlot[mat]显示 mat 的结构模式

稀疏矩阵的格式化

稀疏矩阵可以用函数MatrixForm 进行格式化:
MatrixForm 对于向量和高秩稀疏数组也同样有效;大括号可以帮助理解分组方式:

MatrixForm 得到的视图是稠密型的,它可以帮助您看到稀疏模式. 但是,它可以迅速导致非常大的输出,尤其是在数组的秩增加时.

稀疏矩阵的绘图

绘制稀疏矩阵的一种方便的途径是通过函数 MatrixPlot,它将在"矩阵的绘图"一节中更详尽地介绍.

这里使用前面一节所介绍的函数 Import 读入一个稀疏矩阵:
该矩阵可以进行绘制. 这是观察矩阵结构的一种有利方式:
如果矩阵与其自身相乘,稀疏程度将降低,但仍具有一个相对结构:

稀疏矩阵的导入和导出

Wolfram 语言提供了一些用于I/O的不同工具. 您可以将您的数据保存至一个文件,从而使您或同事能在日后继续在 Wolfram 语言中使用. 要实现此目的切,您或许可考虑使用一些表达式 I/O 函数,这将在"表达式的导入和导出"中讨论.

如果希望使用指定的数据格式来操作外部的矩阵,函数 ImportExport 是很有用的. 函数 Import 支持各种不同格式,其中一些格式与稀疏矩阵相关.

有两种格式是稀疏矩阵所特有的,并被 Wolfram 语言支持:"HarwellBoeing" 和 "Matrix Market". 这个例子使用 HarwellBoeing 格式将文件dwg961b.cua 中的矩阵导入:
结果是一个具有10591个非零元素的961×961矩阵:
可以确定矩阵的维数:
如果该矩阵与其自身相乘,结果可能不像先前一样稀疏:

有关 HarwellBoeing 和 Matrix Market 格式的矩阵的许多例子可以在http://math.nist.gov/MatrixMarket/index.html 得到.

矩阵乘法

在 Wolfram 语言中矩阵的乘法通过函数 Dot 实现,其通常的快捷输入方式是一个点. 该运算完全支持稀疏数组:
稀疏矩阵可以与自身相乘,结果仍是一个稀疏矩阵:
这里将一个稀疏矩阵与一个稠密向量相乘. 这种情况下的结果是稠密的:
如果向量被放入稀疏数组,相乘的结果将是稀疏的:
一般地,如果两个参数均为稀疏型,矩阵乘法的结果将是稀疏的. 如果默认值不同时,这种说法不成立:
关于稀疏矩阵向量乘法尤其重要的一点是,它的速度非常快. 在这个例子中,一个100000×100000三对角稀疏矩阵与一个稠密向量相乘:
稀疏和稠密矩阵乘法的另一个问题是,根据稠密矩阵是在左还是在右,计算的速度有所不同:
尽管两种情况下结果相同,第一个例子比第二个例子要慢:
提高速度的一种可能方式是将稠密矩阵转化为一种稀疏表示. 现在结果是一个稀疏矩阵:
另一种解决方案将是通过将每个矩阵转置来将次序逆转:

外积

外积是由低秩张量构建高秩张量的一种方式. Wolfram 语言通过函数 Outer 提供了这一功能. 它的用途之一是将两个向量组合成一个作为外积的矩阵. 这里将该函数作用于输入的稀疏向量,生成一个稀疏数组:

如果想要使用稀疏数组作为通用的稀疏数据结构,稀疏外积的生成是非常有利的.

矩阵置换

许多矩阵技术依赖于矩阵按某种特殊方式的排序. 例如,有些技术试图对矩阵排序,以将元素放在对角线上,而另外一些技术则试图将一定元素组合到稠密矩阵块上. Wolfram 语言函数 Part 非常适合对矩阵的行与列进行置换.

m[[perm]]对矩阵的行应用置换
m[[All,perm]]对矩阵的列应用置换x
m[[perm,perm]]对矩阵的行与列应用置换
m[[perm]]=m对矩阵的行应用逆置换
m[[All,perm]]=m对矩阵的列应用逆置换

对矩阵应用置换.

这里生成一个随机矩阵:
现在矩阵将重新排序,以使具有最小2范数的行放到最前面. ("范数"在"矩阵计算"一节中讨论.) 首先计算每一行的范数:
对矩阵重新排序所需的置换进行计算:
将排序应用于矩阵各行;结果中具有最小2范数的行被排在最前面:
现在使用部分赋值式应用逆置换. 这将改变符号 pmat 所持有的矩阵. 部分赋值式的介绍在前面

将方程转化为稀疏数组

矩阵在许多科技领域如此重要的原因是矩阵可以有效表示线性方程组. 与其它技术型计算系统相比,Wolfram 语言的独特性在于它将有效操作矩阵与矩阵所表示的方程的各种方式结合在了一起. 它可以轻松地从矩阵到方程组或从方程组回归到矩阵. 在这里,一个稀疏矩阵与一个未知向量相乘,形成了一个方程组.

这些方程可以通过代数方程求解程序 Solve 解出:
然而,由方程到矩阵表示会复杂一些. Wolfram 语言提供了函数 CoefficientArrays 来简化这种转换. 这里取刚才生成的方程;结果是由一个稀疏向量和一个稀疏矩阵组成的列表:
通过 MatrixForm 可以看到稀疏数组的细节:
CoefficientArrays 是一个通用函数,可以用于非线性和线性多项式方程组:
当输入是一个非线性多项式时,结果将包括较高阶的张量:
使用点积仍可重新获得原始表达式:

这种直接用于线性方程组的能力对于某些应用是非常有利的. 例如,生成有限个不同解. 这将在"有限个不同解"的例子中进行说明.

SparseArray 数据格式

有几种用于存储稀疏数组的不同格式. 每一种都各有利弊. Wolfram 语言使用压缩稀疏行(CSR)格式作为内部存储格式. 这可以通过一个示范矩阵进行说明.

您可以看到矩阵 InputForm 的内部形式:

这种格式对于描述任意秩张量来说具有足够一般的通用性. 这种格式的另一个优点是,在同一行中存储的数据元素彼此相邻,从而提供更好的缓存性能. 缺点是,对于在矩阵中插入新元素,它不是最优化的.