China-bub.com 下载 第9章稀疏矩阵 在许多问题中提到了含有大量0元素的矩阵,这样的矩阵称为稀疏矩阵。比如求解普通或 者部分微分方程的数值解。为了节省存储空间和计算时间,MATLAB考虑到矩阵的稀疏性, 在对它运算时有特殊的命令。 9.1矩阵为什么稀疏 一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存。如果MATLAB把一个矩 阵当作稀疏矩阵,那么只需在m×3的矩阵中存储m个非零项。第1列是行下标,第2列是列下 标,第3列是非零元素值,不必保存零元素。如果存储一个浮点数要8个字节,存储每个下标 要4个字节,那么整个矩阵在内存中存储需要16×m个字节。 ■例9.1 A=eye(1000): 得到一个1000×1000的单位矩阵,存储它需要8Mb空间。如果使用命令: B=speye(1000); 用一个1000×3的矩阵来代表,每行包含有一个行下标、列下标和元素本身。现在只需 16Kb的空间就可以存储1000×1000的单位矩阵,它只需要满单位矩阵的0.2%存储空间。对于 许多的广义矩阵也可这样来作。 ■ 稀疏矩阵的计算速度更快,因为MATLAB只对非零元素进行操作,这是稀疏矩阵的第二 个突出的优点。 ■例9.2 假设矩阵A、B和例9.1中的矩阵一样。计算2*A需要一百万次的浮点运算,而计算2*B只 需要2000次浮点运算。 ■ 因为MATLAB不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵,在下一节 中将给出这些命令。前面章节中的算术和逻辑运算都适用于稀疏矩阵。 9.2创建和转换稀疏矩阵 在MATLAB中,用命令sparse来创建一个稀疏矩阵。 命令集87 创建稀疏矩阵 sparse(A) 由非零元素和下标建立稀疏矩阵A。如果A已是一个稀疏 矩阵,则返回A本身。 sparse(m,n) 生成一个m×n的所有元素都是0的稀疏矩阵
下载 第9章 稀 疏 矩 阵 在许多问题中提到了含有大量 0元素的矩阵,这样的矩阵称为稀疏矩阵。比如求解普通或 者部分微分方程的数值解。为了节省存储空间和计算时间, M AT L A B考虑到矩阵的稀疏性, 在对它运算时有特殊的命令。 9.1 矩阵为什么稀疏 一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存。如果 M AT L A B把一个矩 阵当作稀疏矩阵,那么只需在 m×3的矩阵中存储 m个非零项。第1列是行下标,第 2列是列下 标,第3列是非零元素值,不必保存零元素。如果存储一个浮点数要 8个字节,存储每个下标 要4个字节,那么整个矩阵在内存中存储需要 1 6×m个字节。 ■ 例9 . 1 A = e y e ( 1 0 0 0 ) ; 得到一个1 0 0 0×1 0 0 0的单位矩阵,存储它需要8 Mb空间。如果使用命令: B = s p e y e ( 1 0 0 0 ) ; 用一个 1 0 0 0×3的矩阵来代表,每行包含有一个行下标、列下标和元素本身。现在只需 1 6 K b的空间就可以存储1 0 0 0×1 0 0 0的单位矩阵,它只需要满单位矩阵的 0 . 2 %存储空间。对于 许多的广义矩阵也可这样来作。 稀疏矩阵的计算速度更快,因为 M AT L A B只对非零元素进行操作,这是稀疏矩阵的第二 个突出的优点。 ■ 例9 . 2 假设矩阵A、B和例9 . 1中的矩阵一样。计算 2*A需要一百万次的浮点运算,而计算 2*B只 需要2 0 0 0次浮点运算。 因为M AT L A B不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵,在下一节 中将给出这些命令。前面章节中的算术和逻辑运算都适用于稀疏矩阵。 9.2 创建和转换稀疏矩阵 在M AT L A B中,用命令s p a r s e来创建一个稀疏矩阵。 命令集8 7 创建稀疏矩阵 s p a r s e ( A ) 由非零元素和下标建立稀疏矩阵 A。如果A已是一个稀疏 矩阵,则返回A本身。 s p a r s e ( m , n ) 生成一个m×n的所有元素都是0的稀疏矩阵。 ■ ■
124 China-pub.com MATLAB5手册 下载 sparse (u,v,a) 生成一个由长度相同的向量u,v和a定义的稀疏矩阵。其 中u和v是整数向量,a是一个实数或者复数向量。(4,v) 对应值a,如果a中有零元素,则将这个元素排除在外。 稀疏矩阵的大小为max(m×max(v)。 sparse (u,v,a,m,n) 生成一个mXn的稀疏矩阵,(w,)对应值a。向量u,v和a 必须长度相同。 sparse (u,v,a,m,n, 生成一个m×n的含有nzmax个非零元素的稀疏矩阵。(山, nzmax)) )对应值a。nzmax的值必须大于或者等于向量u和v的长度。 find(x) 返回向量x中非零元素的下标。如果x=X是一个矩阵,那 么X的向量就作为一个长向量来考虑。 [u,v]=find(A) 返回矩阵A中非零元素的下标。 [u,v,s]=find(A) 返回矩阵A中非零元素的下标。用向量中元素的值及u和v中 相应的下标,实际上就是向量、v和s作为命令sparsel的参数。 spconvert(D) 将一个有三列的矩阵转换成一个稀疏矩阵。D中的第1列作 为行的下标,第2列作为列的下标,最后一列作为元素值。 而且可以使用命令f将稀疏矩阵转换成一个满矩阵。 命令集88 转换成满矩阵 full(S) 将稀疏矩阵S转换成一个满矩阵。 ■例9.3 (a)创建一个5×5的单位矩阵: A=eye(5) 将矩阵A转换成稀疏矩阵B: B sparse(A) B= (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1 (5,5) 1 (b)假设MATLAB中给出如下的向量: ind1=[123342]; 1nd2=[121453]; number=[012305]; 这样就有了行向量,但是也可使用列向量。运行命matrix=sparse(indl,ind2,number), 结果为: Smatrix (3,1) 2
s p a r s e ( u , v , a ) 生成一个由长度相同的向量 u,v和a定义的稀疏矩阵。其 中u和v是整数向量, a是一个实数或者复数向量。 (ui, vi) 对应值 ai,如果 a中有零元素,则将这个元素排除在外。 稀疏矩阵的大小为m a x (u)×m a x (v)。 s p a r s e ( u , v , a , m , n ) 生成一个m×n的稀疏矩阵,(ui, vi)对应值ai。向量u,v和a 必须长度相同。 s p a r s e ( u , v , a , m , n , 生成一个m×n的含有n z m a x个非零元素的稀疏矩阵。(ui, n z m a x ) vi)对应值ai。n z m a x的值必须大于或者等于向量u和v的长度。 f i n d ( x ) 返回向量x中非零元素的下标。如果 x=X是一个矩阵,那 么X的向量就作为一个长向量来考虑。 [ u , v ] = f i n d ( A ) 返回矩阵A中非零元素的下标。 [ u , v , s ] = f i n d ( A ) 返回矩阵A中非零元素的下标。用向量s中元素的值及u和v中 相应的下标,实际上就是向量u、v和s作为命令s p a r s e的参数。 s p c o n v e r t ( D ) 将一个有三列的矩阵转换成一个稀疏矩阵。 D中的第1列作 为行的下标,第2列作为列的下标,最后一列作为元素值。 而且可以使用命令f u l l将稀疏矩阵转换成一个满矩阵。 命令集8 8 转换成满矩阵 f u l l ( S ) 将稀疏矩阵S转换成一个满矩阵。 ■ 例9 . 3 (a) 创建一个5×5的单位矩阵: A = e y e ( 5 ) 将矩阵A转换成稀疏矩阵B: (b) 假设M AT L A B中给出如下的向量: 这样就有了行向量,但是也可使用列向量。运行命令S m a t r i x = s p a r s e ( i n d 1 , i n d 2 , n u m b e r ), 结果为: 1 2 4 M ATLAB 5 手册 下载
China-bub.coM 第9章稀硫矩阵 125 下载 (2,2) 1 (2,3) (3,4) 3 其中有去掉了两个零元素。将这个矩阵转换成满矩阵,输入: Fullmatrix=full(Smatrix) 得到的结果为: Fullmatrix 0 0 0 0 0 1 5 0 0 2 0 0 3 0 0 0 0 0 注意,稀疏矩阵和得到的满矩阵的大小是分别是由ind1和ind2中最大元素值确定的,即 使相应的值是零,并且在列出的稀疏矩阵中去掉这个值。 输入命令whos可得到: Name Size Bytes Class A 5x5 200 double array 5x5 84 sparse array Fullmatrix 4x5 160 double array Smatrix 4x5 96 sparse array ind1 1x6 48 double array ind2 1x6 48 double array number 1x6 48 double array Grand total is 74 elements using 684 bytes 可以看出虽然两个矩阵的大小相同,但是其中稀疏矩阵需要的存储空间更小些。 (c)在处理稀疏矩阵时find命令很有用。命令对于稀疏矩阵或者满矩阵都返回相同的结果。 返回得到的三个向量直接用来重新创建一个稀疏矩阵。令Smatrix定义在(b)中,运行命令: [ind1,ind2,number]find(Smatrix); Smaller sparse(ind1,ind2,number) 得到的结果为: Smaller (3,1) 2 (2,2) 1 (2,3) 5 (3,4) 3 用下面命令得到的矩阵和(b)中得到的矩阵是不一样的: Fullsmall full(Smaller) Fullsmall 0 0 0 O 0 0 2 ■
其中有去掉了两个零元素。将这个矩阵转换成满矩阵,输入: F u l l m a t r i x = f u l l ( S m a t r i x ) 得到的结果为: 注意,稀疏矩阵和得到的满矩阵的大小是分别是由 i n d 1和i n d 2中最大元素值确定的,即 使相应的值是零,并且在列出的稀疏矩阵中去掉这个值。 输入命令w h o s可得到: 可以看出虽然两个矩阵的大小相同,但是其中稀疏矩阵需要的存储空间更小些。 (c) 在处理稀疏矩阵时f i n d命令很有用。命令对于稀疏矩阵或者满矩阵都返回相同的结果。 返回得到的三个向量直接用来重新创建一个稀疏矩阵。令 S m a t r i x定义在( b )中,运行命令: 得到的结果为: 用下面命令得到的矩阵和( b )中得到的矩阵是不一样的: 第9章 稀 疏 矩 阵 1 2 5 下载 ■
126 MATLAB5手册 China-pub.com 下载 9.3稀疏矩阵运算 MATLAB中对满矩阵的运算和函数同样可用在稀疏矩阵中。结果是稀疏矩阵还是满矩阵, 这取决于运算符或者函数及下列的操作数: ·当函数用一个矩阵作为输入参数,输出参数为一个标量或者一个给定大小的向量时,输 出参数的格式总是返回一个满阵形式,如命令size。 ·当函数用一个标量或者一个向量作为输入参数,输出参数为一个矩阵时,输出参数的格式 也总是返回一个满矩阵,如命令eye。还有一些特殊的命令可以得到稀疏矩阵,如命令speye。 ·对于单参数的其他函数来说,通常返回的结果和参数的形式是一样的,如diag。 ·对于双参数的运算或者函数来说,如果两个参数的形式一样,那么也返回同样形式的结 果。在两个参数形式不一样的情况下,除非运算的需要,均以满矩阵的形式给出结果。 ·两个矩阵的组和[AB],如果A或B中至少有一个是满矩阵,则得到的结果就是满矩阵。 ·表达式右边的冒号是要求一个参数的运算符,遵守这些运算规则。 ·表达式左边的冒号不改变矩阵的形式。 ■例9.4 假设有: A=eye(5);B=sparse(A);h=[1;2;0;4;5]; 这是一个5×5的单位满矩阵和相应的稀疏矩阵。 (a)C=5*B,结果为: C= (1,1) 5 (2,2) 5 (3,3) 6 (4,4) (5,5) 6 这是一个稀疏矩阵。 (b)D=A+B,给出的结果为: D= 2 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 2 0 0 O 0 2 这是一个满矩阵。 (c)=B\h,结果为: X= 1 2 4 5 ■ 这是一个满向量
9.3 稀疏矩阵运算 M AT L A B中对满矩阵的运算和函数同样可用在稀疏矩阵中。结果是稀疏矩阵还是满矩阵, 这取决于运算符或者函数及下列的操作数: • 当函数用一个矩阵作为输入参数,输出参数为一个标量或者一个给定大小的向量时,输 出参数的格式总是返回一个满阵形式,如命令 s i z e。 • 当函数用一个标量或者一个向量作为输入参数,输出参数为一个矩阵时,输出参数的格式 也总是返回一个满矩阵,如命令e y e。还有一些特殊的命令可以得到稀疏矩阵,如命令s p e y e。 • 对于单参数的其他函数来说,通常返回的结果和参数的形式是一样的,如 d i a g。 • 对于双参数的运算或者函数来说,如果两个参数的形式一样,那么也返回同样形式的结 果。在两个参数形式不一样的情况下,除非运算的需要,均以满矩阵的形式给出结果。 • 两个矩阵的组和[A B],如果A或B中至少有一个是满矩阵,则得到的结果就是满矩阵。 • 表达式右边的冒号是要求一个参数的运算符,遵守这些运算规则。 • 表达式左边的冒号不改变矩阵的形式。 ■ 例9 . 4 假设有: 这是一个5×5的单位满矩阵和相应的稀疏矩阵。 (a) C = 5*B,结果为: 这是一个稀疏矩阵。 (b) D = A + B,给出的结果为: 这是一个满矩阵。 (c) x = B \ h,结果为: 这是一个满向量。 1 2 6 M ATLAB 5 手册 下载 ■
China-pub.com 第9章稀硫矩阵 127 下载 有许多命令可以对非零元素进行操作。 命令集89 矩阵的非零元素 nnz(A) 求矩阵A中非零元素的个数。它既可求满矩阵也可求稀疏矩阵。 spy(A) 画出稀疏矩阵A中非零元素的分布。也可用在满矩阵中,在 这种情况下,只给出非零元素的分布。 sPy(A,cstr,s1ze)用指定的颜色cstr(见表13-I)和在size规定的范围内画出稀疏 矩阵A中非零元素的分布。 nonzeros(A) 按照列的顺序找出矩阵A中非零的元素。 spones(A) 把矩阵A中的非零元素全换为1。 spalloc(m,n, 产生一个mXn阶只有nzmax个非零元素的稀疏矩阵。这样可以 nzmax) 有效地减少存储空间和提高运算速度。 nzmax(A) 给出为矩阵A中非零元素分配的内存数。不一定和nnz(A)得 到的数相同:参见sparse或者spalloc。 issparse(A) 如果矩阵A是稀疏矩阵,则返回1:否则返回0。 spfun(fcn,A) 用A中所有非零元素对函数fcn求值,如果函数不是对稀疏矩 阵定义的,同样也可以求值。 spfun(A) 求稀疏矩阵A的结构秩。对于所有的矩阵来说,都有 sprank(A≥rank(A)。 ■例9.5 用下面的命令定义稀疏矩阵: A=sparse(diag(ones(5,1),1))+sparse(diag(ones(5,1),-1)); 现在创建一个大矩阵: Big=kron(A,A) 这个矩阵Big是什么样子呢?Kronecker张量积给出一个大矩阵,它的元素是矩阵A的元素 之间可能的乘积。因为参量都是稀疏矩阵,所以得到的矩阵也是一个稀疏矩阵。可以用命令 whos和issparse来确认一下。 查看矩阵Big的结构图,可输入spy(Big),结构如图9-I所示。 : :8 ∷ ∷: 10 25、30 图91用spy命令显示的矩阵结构图
有许多命令可以对非零元素进行操作。 命令集8 9 矩阵的非零元素 n n z ( A ) 求矩阵A中非零元素的个数。它既可求满矩阵也可求稀疏矩阵。 s p y ( A ) 画出稀疏矩阵 A中非零元素的分布。也可用在满矩阵中,在 这种情况下,只给出非零元素的分布。 s p y ( A , c s t r , s i z e ) 用指定的颜色 c s t r(见表1 3 - 1 )和在s i z e规定的范围内画出稀疏 矩阵A中非零元素的分布。 n o n z e r o s ( A ) 按照列的顺序找出矩阵A中非零的元素。 s p o n e s ( A ) 把矩阵A中的非零元素全换为1。 s p a l l o c ( m , n , 产生一个m×n阶只有n z m a x个非零元素的稀疏矩阵。这样可以 n z m a x ) 有效地减少存储空间和提高运算速度。 n z m a x ( A ) 给出为矩阵A中非零元素分配的内存数。不一定和 n n z ( A )得 到的数相同;参见s p a r s e或者s p a l l o c。 i s s p a r s e ( A ) 如果矩阵A是稀疏矩阵,则返回1;否则返回0。 s p f u n ( f c n , A ) 用A中所有非零元素对函数 f c n求值,如果函数不是对稀疏矩 阵定义的,同样也可以求值。 s p f u n ( A ) 求稀疏矩阵 A的结构秩。对于所有的矩阵来说,都有 s p r a n k ( A≥r a n k ( A )。 ■ 例9 . 5 用下面的命令定义稀疏矩阵: 现在创建一个大矩阵: Big=kron(A, A) 这个矩阵B i g是什么样子呢?K r o n e c k e r张量积给出一个大矩阵,它的元素是矩阵 A的元素 之间可能的乘积。因为参量都是稀疏矩阵,所以得到的矩阵也是一个稀疏矩阵。可以用命令 w h o s和i s s p a r s e来确认一下。 查看矩阵B i g的结构图,可输入s p y ( B i g ),结构如图9 - 1所示。 图9-1 用s p y命令显示的矩阵结构图 第9章 稀 疏 矩 阵 1 2 7 下载