MATLAB 中的稀疏数组

17 Mar 2025 | 4 分钟阅读

当声明一个普通数组时,MATLAB 会为数组中的每个元素创建一个内存位置。例如,函数 a = eye (10) 创建一个 10x10 的结构,包含 100 个元素。在这个数组中,有 90 个元素是零!

这个矩阵需要 100 个元素,但只有 10 个包含非零数据。这就是一个稀疏数组稀疏矩阵的例子。

稀疏矩阵是一个大型矩阵,其中绝大多数元素为零。

Sparse Arrays in MATLAB

现在假设我们创建另一个 10x10 的矩阵 b,定义如下:

Sparse Arrays in MATLAB

如果将这两个矩阵相乘,结果是:

Sparse Arrays in MATLAB

稀疏属性

MATLAB 有一个特殊的双精度数据类型版本,专门用于处理稀疏数组。

在这个特殊的双精度数据类型版本中,只有数组的非零元素会被分配内存位置,并且该数组被称为具有“稀疏”属性。

具有稀疏属性的数组会为每个非零元素保存三个值:元素本身的值,以及该元素所在的行号和列号。即使每个非零元素需要保存三个值,如果矩阵只有少数几个非零元素,这种方法也比分配整个数组更节省内存。

为了说明稀疏矩阵的用法,我们将创建一个 10x10 的单位矩阵:

Sparse Arrays in MATLAB

如果使用 sparse 函数将此矩阵转换为稀疏矩阵,结果如下:

Sparse Arrays in MATLAB

如果我们使用 whos 命令检查数组 a 和 as,结果如下:

a 数组占用 800 字节,因为有 100 个元素,每个元素占用 8 字节存储。as 数组占用 164 字节,因为有 10 个非零元素,每个元素占用 8 字节存储,加上 20 个数组索引,每个占用 4 字节,以及 4 字节的开销。请注意,稀疏数组占用的内存比完整数组少得多。

issparse 函数可用于确定给定数组是否为稀疏。如果数组是稀疏的,则 issparse (array) 返回 true (1)。

稀疏数据类型的强大之处可以体现在考虑一个 1000x1000 的矩阵 z,其中每行平均有 4 个非零元素。如果此矩阵存储为完整矩阵,将需要 8,000,000 字节的空间。另一方面,如果将其转换为稀疏矩阵,内存使用量将急剧下降。

生成稀疏矩阵

MATLAB 可以通过使用 sparse 函数将完整矩阵转换为稀疏矩阵来生成稀疏矩阵,或者通过直接创建稀疏矩阵,使用 MATLAB 函数 speye、sprand 和 sprandn,它们分别是 eye、rand 和 randn 的稀疏对应版本。


表达式 b = full (a) 将稀疏矩阵转换为完整矩阵。

处理稀疏矩阵

一旦将矩阵变为稀疏,就可以使用简单的赋值语句向其中添加或删除单个元素。

例如,以下语句会生成一个 4x4 的稀疏矩阵,然后向其中添加另一个非零元素:

稀疏矩阵函数

此表显示了一些在处理稀疏矩阵时最常用的函数。

函数描述
full将稀疏矩阵转换为完整矩阵。
issparse确定矩阵是否为稀疏。
nnz返回非零矩阵元素的数量。
nonzeros返回矩阵的非零元素。
nzmax返回为非零元素分配的存储量。
spalloc为稀疏矩阵分配空间。
sparse创建稀疏矩阵或将完整矩阵转换为稀疏矩阵。
speye创建稀疏单位矩阵。
sprand创建稀疏均匀分布的随机矩阵。
sprandn创建稀疏正态分布的随机矩阵。
find查找矩阵中非零元素的索引和值。
spones将稀疏矩阵的非零元素替换为 1。
spfun将函数应用于非零矩阵元素。
spy以图表形式可视化稀疏性。

下一主题MATLAB M 文件