热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MATLAB编程与应用系列第3章矩阵运算(6)

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。出版社:人民邮电出版社,页数:525。本系列教程目前基

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。

本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

3.4 稀疏矩阵

在实际应用中经常会使用这样的矩阵,该矩阵中包含的很多元素值为0,这样的矩阵被称为稀疏矩阵(Sparse Matrix)。因为稀疏矩阵大部分的元素都是0,所以只需要储存非零元素的下标和元素值,这种特殊的存储方式可以节省大量的存储空间和不必要的运算。MATLAB提供了多个对稀疏矩阵进行操作的函数。

如果全元素矩阵不经过专门的定义是不能产生稀疏矩阵的,最简单的创建稀疏矩阵的函数为sparse,可以将全元素矩阵转化为稀疏矩阵;与之相反,可以调用函数full将稀疏矩阵转变为全元素矩阵。下面将介绍稀疏矩阵的一些相关操作。

3.4.1 稀疏矩阵的创建

MATLAB提供了几个函数来创建稀疏矩阵,具体调用格式如表3.8所示。
表3.8 稀疏矩阵的创建函数

函数名功能
S = sparse(A)将矩阵A转化为稀疏矩阵形式,即由A的非零元素和下标构成稀疏矩阵S。若A本身为稀疏矩阵,则返回A本身
S = sparse(m,n)生成一个m×n的所有元素都是0的稀疏矩阵
S = sparse(i,j,s)生成一个由长度相同的向量i、j和s定义的稀疏矩阵S,其中i、j是整数向量,定义稀疏矩阵的元素位置(i,j),s是一个标量或与i,j长度相同的向量,表示在(i,j)位置上的元素
S = sparse(i,j,s,m,n)生成一个m×n的稀疏矩阵,(i,j)对应位置元素为si,m = max(i)且n =max(j)
S= sparse(iiI,j,s,m,n,nzmax)生成一个m×n的含有nzmax个非零元素的稀疏矩阵S,nzmax的值必须大于或者等于向量i和j的长度
[B,d] = spdiags(A)从矩阵A中提取所有非零对角元素,这些元素保存在矩阵B中,向量d表示非零元素的对角线位置
B = spdiags(A,d)从A中提取由d指定的对角线元素,并存放在B中
A = spdiags(B,d,A)用B中的列替换A中由d指定的对角线元素,输出稀疏矩阵
A=spdiags(D,k,m,n)矩阵D的每一列代表矩阵的对角线向量;k代表对角线的位置(0代表主对角线,-1代表向下位移一单位的次对角线,1代表向上位移一单位的次对角线,依此类推);m、n分别代表矩阵的行、列维数

【例3.42】产生稀疏矩阵
首先在MATLAB命令行窗口中输入以下命令,创建一个5阶的单位对角阵:
>> a=eye(5) %生成5阶的单位对角阵
按照以下命令行修改矩阵a中最后一行的元素值:
>> a(6,:)=[2 0 0 3 0] %修改矩阵a中最后一行的元素值
使用函数sparse将上面的矩阵a转化为稀疏矩阵,在命令窗口输入:
>> b=sparse(a) %使用函数sparse将上面的矩阵a转化为稀疏矩阵
结果如下:
b = (1,1) 1 (6,1) 2 (2,2) 1 (3,3) 1 (4,4) 1 (6,4) 3 (5,5) 1

3.4.2 将稀疏矩阵转化为全元素矩阵

可以使用full函数可以将稀疏矩阵转化为全元素矩阵,该函数的调用格式如下:

① A=full(S) S为稀疏矩阵,A为全元素矩阵

【例3.46】将稀疏矩阵转化为全元素矩阵
>> a=eye(6) %生成6阶的对角阵
使用函数sparse将矩阵a转化为稀疏矩阵,在命令窗口中输入以下内容:
>> b=sparse(a) % 使用函数sparse将矩阵a转化为稀疏矩阵
如将稀疏矩阵b转化为原来的全元素矩阵,可以使用函数full,在命令窗口输入:
>> full(b) % 将稀疏矩阵b转化为原来的全元素矩阵

3.4.3 矩阵中非零元素的查找

对任意一个矩阵,使用函数find可以查找出非零元素的位置及其值。该函数的调用格式如下:

① k = find(X)
② [i,j] = find(X)
③ [i,j,v] = find(X)

其中,命令①按行检索X中非零元素的点,若没有非零元素,将返回空矩阵,命令②检索X中非零元素所对应的行标号i和列标号j;命令③检索X中非零元素所对应的行标号i和列标号j以及位置(i, j)对应的元素值v。

【例3.47】矩阵中非零元素的查找
首先在命令窗口中输入以下内容,将单位矩阵a转化为稀疏矩阵b。
>> a=eye(6); %创建6阶的对角单位阵
>> b=sparse(a) %讲单位阵转化为稀疏矩阵
①若检索稀疏矩阵b中非零元素的行标i和列标j以及对应的元素值v,在命令窗口输入:
>> [i,j,v]=find(b)
②若检索全元素矩阵a中非零元素的行标i和列标j以及对应元素值v,在命令窗口输入:
>> [i,j,v]=find(a)

3.3.4 其他稀疏矩阵的创建方法

MATLAB除了上面介绍的基本创建稀疏矩阵的方法外,还提供了几个函数可以直接创建特殊的稀疏矩阵,具体调用格式如表3.9所示。

表3.9 稀疏矩阵的其他创建函数

函数名功能
S = speye(m,n)生成m×n的单位稀疏矩阵
S = speye(n)生成n×n的单位稀疏矩阵
R = sprand(S)生成与S具有相同稀疏结构的均匀分布随机矩阵
R = sprand(m,n,density)生成一个m×n的服从均匀分布的随机稀疏矩阵,非零元素的分布密度是density
R = sprand(m,n,density,rc)生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵
R = sprandn(S)生成与S具有相同稀疏结构的正态分布随机矩阵
R = sprandn(m,n,density)生成一个m×n的服从正态分布的随机稀疏矩阵,非零元素的分布密度是density
R = sprandn(m,n,density,rc)生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵
R = sprandsym(S)生成稀疏对称随机矩阵,其下三角和对角线与S具有相同的结构,其元素服从均值为0、方差为1的标准正态分布
R = sprandsym(n,density)生成n×n的稀疏对称随机矩阵,矩阵元素服从正态分布,分布密度为density
R = sprandsym(n,density,rc)生成近似条件数为1/rc的稀疏对称随机矩阵
R= sprandsym(n,density,rc,kind)生成一个正定矩阵,参数kind取值为kind=1表示矩阵由一正定对角矩阵经随机Jacobi旋转得到,其条件数正好为1/rc;kind=2表示矩阵为外积的换位和,其条件数近似等于1/rc;kind=3表示生成一个与矩阵S结构相同的稀疏随机矩阵,条件数近似为1/rc ,density被忽略

【例3.48】其他稀疏矩阵的创建
①使用函数sparse创建行数从2至16,列数从3至17,值为4至18的稀疏矩阵。在命令窗口输入以下内容:
>> S=sparse(2:16,3:17,4:18) %创建行数从2至16,列数从3至17,值为4至18的稀疏矩阵
②如要生成与矩阵S具有相同稀疏结构的均匀分布随机矩阵,可以使用函数sprand。在命令窗口输入:
>> R = sprand(S)
③若要生成与S具有相同稀疏结构的正态分布随机矩阵,可以使用函数sprandn。在命令窗口输入:
>> G = sprandn(S)
④若要生成稀疏对称随机矩阵,其下三角和对角线与S具有相同的结构,其元素服从均值为0、方差为1的标准正态分布,可以使用函数sprandsym。在命令窗口输入:
>> F = sprandsym(S)
⑤若要生成n×n的单位稀疏矩阵,可以使用函数speye。在命令窗口输:
>> K = speye(6)

注意:由上例可以看出,此查找语句适合于稀疏矩阵,也适合于一般矩阵。

3.4.5 稀疏矩阵中非零元素信息的查看

前面介绍了使用find函数可以查看全元素矩阵和稀疏矩阵的非零元素的位置及值,对于稀疏矩阵来说,MATLAB还提供了其他几个函数用来查看稀疏矩阵中的信息,具体调用格式如表3.10所示。

表3.10 稀疏矩阵的信息查看函数

函数名功能
n = nnz(X)返回矩阵X中非零元素的个数
s = nonzeros(A)返回矩阵A中非零元素按列顺序构成的列向量
k = nzmax(A)返回分配给稀疏矩阵中所有非零元素存储单元的个数
S = spalloc(m,n,nzmax)产生一个m×n阶只有nzmax个非零元素的稀疏矩阵,这样可以有效减少存贮空间和提高运算速度
f = spfun('function',S)用函数’function’对S中非零元素求值,如果’function’不是对稀疏矩阵定义的,同样可以求值
R = spones(S)将稀疏矩阵S中的非零元素全换为1

【例3.49】稀疏矩阵中非零元素信息的查看
>> S=sparse(2:16,3:17,4:18) %创建行数从2至16,列数从3至17,值为4至18的稀疏矩阵
①若要查看矩阵S中非零元素的个数,可在命令窗口输入:
>> n = nnz(S)
②若要返回矩阵S中非零元素按列顺序构成的列向量,可在命令窗口输入:
>> s = nonzeros(S)
③若要返回分配给稀疏矩阵中所有非零元素存储单元的个数,可在命令窗口输入:
>> k=nzmax(S)
④用函数’exp’对S中非零元素求值,在命令窗口输入:
>> f= spfun('exp',S)

3.4.6 用图形方式查看稀疏矩阵的信息

将稀疏矩阵中非零元素的分布用图形方式显示,特别适用于较大的稀疏矩阵及图形处理过程中的分析。MATLAB的函数spy提供了一个用图形显示稀疏矩阵非零元素的模板,图形中的每个点表示稀疏矩阵中非零元素的位置。该函数的调用格式如下:

①spy(S)
②spy(S,markersize) markersize为整数,指定点阵大小,其他参数与上相同
③spy(S,'LineSpec')
④spy(S,'LineSpec',markersize)

其中①画出稀疏矩阵S中非零元素的分布图形,S也可以是全元素矩阵;②命令中markersize为整数,指定点阵大小,其他参数与①相同;③’LineSpec’指定绘图标记和颜色。

【例3.50】用图形方式查看稀疏矩阵的信息
>> load west0479 %向工作空间导入west0479数据
>> A=west0479;
>> spy(A) %画出稀疏矩阵A中非零元素的分布图
结果如图3.1所示。

《MATLAB编程与应用系列-第3章 矩阵运算(6)》 图3-1.png

>> spy(A,20) %修改点的大小
结果如图3.2所示。

《MATLAB编程与应用系列-第3章 矩阵运算(6)》 图3-2.png

3.4.7 矩阵排序

稀疏矩阵多用于较大的矩阵,MATLAB因此提供了几个矩阵排序函数,有些可以达到降低计算时间的效果,具体调用格式如表3.11所示。
表3.11 稀疏矩阵的排序函数

函数名功能
p = colamd(S)返回稀疏矩阵S的列的近似最小度排序向量p
p = colmmd(S)返回稀疏矩阵S的列的最小度排序向量p,按p排列后的矩阵为S(: , p)
j = colperm(S)返回一个稀疏矩阵S的列变换的向量。列按非0元素升序排列。有时这是LU分解前有用的变换:LU(S(:,j))。如果S是一个对称矩阵,对行和列进行排序,有利于Cholesky分解:chol(S(j,j))
p = dmperm (A)返回A的行排列向量p,这样,如果A满列秩,就使得A(p,:)是具有非0对角线元素的方阵
[p,q,r] = dmperm(A)A为方阵,p为行排列向量,q为列排列向量,使得A(p,q)是上三角块形式,r为索引向量
[p,q,r,s] = dmperm(A)A不是方阵,p,q,r含义与前面相同,s也是索引向量
p = randperm (n)对正整数1,2,3,…,n的随机排列,可以用来创建随机变换矩阵
p = symamd(S)S为对称正定矩阵,返回排列向量p
r = symrcm (S)返回S的对称逆Cuthill-McKee排序r,使S的非0元素集中在主对角线附近
p = symmmd(S)返回S的对称最小度排列向量p,S为对称正定矩阵

【例3.51】比较稀疏矩阵S与排序后的矩阵p
>> load west0479; %导入数据
>> S=west0479;
>> p=colmmd(S); %稀疏矩阵S的列的最小度排序向量p,按p排列后的矩阵为S(: , p)
>> spy(S(:,p)) %画出稀疏矩阵S(: , p)中非零元素的分布图

《MATLAB编程与应用系列-第3章 矩阵运算(6)》 图3-3.png

【例3.52】比较稀疏矩阵S与排序后的矩阵p
>> A=sprandsym(200,0.03)+100*speye(200,200) %生成系数矩阵
>> p=symmmd(A) %计算矩阵A的对称最小度排列向量p
>> spy(A) %画出稀疏矩阵A中非零元素的分布图
结果如图3.4所示。

《MATLAB编程与应用系列-第3章 矩阵运算(6)》 图3-4.png

>> spy(A(p,p)) %画出排序后稀疏矩阵A中非零元素的分布图
结果如图3.5所示。

《MATLAB编程与应用系列-第3章 矩阵运算(6)》 图3-5.png

注意:指令symmmd采用最小度排序算法,其中心思想是根据消元的每个阶段和选取可能的主元,获得填充项和运算次数的最小化,因而列高斯消元法能够与最小度算法较好地结合。

3.5 本章小结

本章重点介绍了矩阵的相关运算,包括矩阵的基本运算、矩阵的各种分解运算、稀疏矩阵的相关运算以及线性方程组的求解。

矩阵的基本运算部分使用大量的实例介绍了矩阵的四则运算、矩阵的乘方、矩阵的转置以及一些矩阵函数的使用方法,同时将矩阵和数组的运算进行比较,以便加深读者对矩阵和数组运算的区别的理解。另外该部分还使用实例介绍了矩阵的关系操作和逻辑操作。

矩阵的分解部分使用大量的实例介绍了经常使用的MATLAB提供的矩阵的各种分解函数的使用,包括矩阵的LU分解、奇异值分解、特征值分解、Cholesky分解、QR分解、Schur分解等。矩阵的分解是矩阵运算的重要部分,在实际的工程应用中经常会使用,因此掌握矩阵分解对解决实际问题是很有帮助的。

线性方程组的求解是解决线性问题时经常遇到的问题,本章使用实例对该线性方程组的求解方法进行了系统的介绍,重点介绍了使用矩阵LU分解、Cholesky分解和QR分解来求解线性方程组的方法。在求解大型方程组时使用矩阵分解的方法来求解方程组解很有用,其优点是运算速度快、可以节省磁盘空间、节省内存。

最后本章介绍了稀疏矩阵的相关操作,包括稀疏矩阵的创建、稀疏矩阵的元素信息的查看、稀疏矩阵的排序等。使用大量的实例介绍了稀疏矩阵创建函数的使用以及稀疏矩阵的元素相关信息的查看函数的使用等内容。

作者:德特数据
联系方式:156204968@qq.com


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
mobiledu2502909533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有