个性化阅读
专注于IT技术分析

MATLAB中的稀疏数组

本文概述

声明普通数组后, MATLAB将为数组中的每个元素创建一个内存位置。例如, 函数a =眼睛(10)将创建100个元素, 这些元素排列为10 x 10结构。在此数组中, 其中90个元素为零!

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

稀疏矩阵是其中大部分元素为零的大型矩阵。

MATLAB中的稀疏数组

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

MATLAB中的稀疏数组

如果将这两个矩阵相乘, 则结果为

MATLAB中的稀疏数组

稀疏属性

MATLAB具有double数据类型的特定版本, 该版本旨在与稀疏数组一起使用。

在double数据类型的此特定版本中, 仅为数组的非零元素分配了内存位置, 并且据说该数组具有”稀疏”属性。

具有稀疏属性的数组将为每个非零元素保存三个值:元素本身的值以及元素所在的行号和列号。即使每个非零元素必须保存三个值, 但是如果矩阵只有几个非零元素, 则此方法比分配完整数组要有效得多。

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

MATLAB中的稀疏数组

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

MATLAB中的稀疏数组

如果我们像whos命令一样检查数组a和, 结果为

» whos 
Name            Size         Bytes     Class      Attributes 
   a                10x10         800    double 
  as               10x10         164    double       sparse

一个数组占用800个字节, 因为有100个元素, 每个元素有8个字节的存储空间。 as数组占用164个字节, 因为有10个非零元素, 每个元素有8个字节的存储空间, 再加上20个数组索引, 每个数组索引分别占4个字节和4个字节的开销。请注意, 稀疏阵列比完整阵列占用的内存少得多。

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

稀疏数据类型的功效可以通过考虑每行平均有4个非零元素的1000 x 1000矩阵z来看出。如果此矩阵存储为完整矩阵, 则将需要8, 000, 000字节的空间。另一方面, 如果将其转换为稀疏矩阵, 则内存使用量将急剧下降。

» zs = sparse(z); 
» whos 
Name 		Size 		Bytes 		Class 
z              1000x1000      8000000      double array 
zs             1000x1000        51188         sparse array 
Grand total is 1003932 elements using 8051188 bytes.

生成稀疏矩阵

MATLAB可以通过使用稀疏函数将完整矩阵转换为稀疏矩阵或通过使用MATLAB函数speye, sprand和sprandn直接制作稀疏矩阵来生成稀疏矩阵, speye, sprand和sprandn是eye, rand和randn的稀疏等效项。

For example, the expression a = speye(4) generates a 4 x 4 sparse matrix.
» a = speye(4) 
a = 
      (1, 1) 	1 
      (2, 2)         1 
      (3, 3)         1 
      (4, 4)         1

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

» b = full (a) 
   b = 
            1   0    0   0 
           0    1   0    0 
           0    0   1   0
           0    0   0   1

使用稀疏矩阵

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

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

» a = speye (4) 
        a = 
           (1, 1)    1
           (2, 2)     1 
           (3, 3)     1 
           (4, 4)      1
» a (2, 1) = -2 
        a = 
           (1, 1)    1 
           (2, 1)   -2 
           (2, 2)    1
           (3, 3)    1
           (4, 4)    1

稀疏矩阵函数

该表显示在处理稀疏矩阵时最常用的一些功能。

Function Description
full 它将稀疏矩阵转换为完整矩阵。
issparse 它确定矩阵是否稀疏。
nnz 它返回非零矩阵元素的数量。
nonzeros 它返回矩阵的非零元素。
nzmax 它返回分配给非零元素的存储量。
spalloc 它为稀疏矩阵分配空间。
sparse 它创建一个稀疏矩阵或将完整的转换为稀疏。
speye 它创建一个稀疏身份矩阵。
sprand 它创建一个稀疏均匀分布的随机矩阵。
sprandn 它创建一个稀疏的正态分布随机矩阵。
find 它查找矩阵中非零元素的索引和值。
spones 它将非零稀疏矩阵元素替换为1。
spfun 它将函数应用于非零矩阵元素
spy 它将稀疏模式可视化为情节。

赞(1)
未经允许不得转载:srcmini » MATLAB中的稀疏数组

评论 抢沙发

评论前必须登录!