MATLAB系列07:稀疏矩阵、单元阵列和结构
7. 稀疏矩阵、单元阵列和结构
稀疏矩阵是矩阵的一种特殊形式,在这个矩阵中只对非零元素分配内存。单元阵列也是一种矩阵,它的每一个元素可以是 MATLAB 任何一种数据类型。它们广泛应用于 MATLAB 用户图象界面(GUI)函数。最后,结构提供了一种在单个变量中存储了不同类型的数据的方法,在这个变量中的每一个数据项目都有一个独立的名字。
7.1 稀疏矩阵
对大规模稀疏矩阵进行存储和运算(其中大部分为 0)是对内存空间和 cpu资源的极大浪费。不巧的是,在现实中的许多问题都需要稀疏矩阵,我们需要一些有效的方示来解决这个问题。
7.1.1 sparse数据类型
在 MATLAB 中有一个专门的数据类型,用来对稀疏进行运算。 sparse 数据类型不同于doulbe 数据,它在内存中只存储非零元素。实际上, sparse 数据类型只存储每一个非零元素的三个值:元素值,元素的行号和列号。尽管非零元素这三个值必须存储在这内存,但相对于存储稀疏矩阵的所有元素来说要简单高效得多。示例:
>> a=eye(10)
a =
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
>> as=sparse(a)
as =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
(5,5) 1
(6,6) 1
(7,7) 1
(8,8) 1
(9,9) 1
(10,10) 1
7.1.1.1 产生稀疏矩阵
MATLAB 可以通过 sparse 函数把一个全矩阵转化为一个稀疏矩阵,也可以用 MATLAB 函数 speye, sprand 和 sprandn 直接产生稀疏矩阵,它们对应的全矩阵为 eye, rand, 和 randn。例如,表达式 a = speye(4)将产生一个 4×4 的稀疏矩阵。
>> a=speye(4)
a =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
表达式 b = full(a)把稀疏矩阵转化相应的全矩阵。
>> b=full(a)
b =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
7.1.1.2 稀疏矩阵的运算
如果一个矩阵是稀疏的,那么单个元素可以通过简单的赋值语句添加或删除,例如下面的语句产生一个 4×4 的稀疏矩阵,然后把其他的非零元素加入其中。
>> a(2,1)=-2
a =
(1,1) 1
(2,1) -2