编写一个算法,计算一个用三元组表示的matlab 稀疏矩阵阵对角线之和,急求~

三元组稀疏矩阵快速转置C语言算法--《科学咨询(决策管理)》2008年03期
三元组稀疏矩阵快速转置C语言算法
【摘要】:三元组稀疏矩阵的快速转置算法在《数据结构》课程中是一个难点,这里给出三元组稀疏矩阵的转置算法详细讲解,并给出C语言算法的源程序。
【作者单位】:
【关键词】:
【分类号】:TP312.1【正文快照】:
一、前言三元组稀疏矩阵的快速转置算法在《数据结构》课程中是一个难点,处理这个知识点很费时间,在教学过程中,往往受课时限制,采取略过不讲的办法,有的教材就干脆把它省去不提。日常生产和科研过程中,数字计算中大量使用了矩阵,为了减少运算量,提高运算效率,这个算法很有用
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【共引文献】
中国期刊全文数据库
孙泽宇;赵国增;舒云星;;[J];安徽电气工程职业技术学院学报;2006年01期
方群;[J];安徽师范大学学报(自然科学版);2002年03期
郭芳;[J];安康师专学报;1999年01期
陈朋;[J];安庆师范学院学报(自然科学版);2005年02期
侯运炳,杨鹏,王银和;[J];北京科技大学学报;1999年03期
毕军,付梦印,周培德;[J];北京理工大学学报;2002年02期
邓泓;周莉;周定康;;[J];江西师范大学学报(自然科学版);2006年03期
胡学钢,张晶,周红鹃,张玉红,王德兴;[J];吉林大学学报(信息科学版);2005年S2期
芦逸云;[J];成都信息工程学院学报;2004年02期
白征东;[J];测绘科技动态;1994年02期
中国博士学位论文全文数据库
刘理峰;[D];重庆大学;2001年
冯嘉礼;[D];中国原子能科学研究院;2001年
张山山;[D];西南交通大学;2001年
庞朝阳;[D];电子科技大学;2002年
张明亮;[D];中国人民解放军国防科学技术大学;2000年
王建涛;[D];上海大学;1999年
叶焕倬;[D];武汉大学;2004年
郭军;[D];华中科技大学;2004年
陆永良;[D];东华大学;2005年
樊月珍;[D];中国农业大学;2005年
中国硕士学位论文全文数据库
蔡海云;[D];西安理工大学;2000年
李迎春;[D];西安理工大学;2000年
王志远;[D];西安理工大学;2000年
韩军;[D];天津轻工业学院;2000年
王瑜;[D];大连理工大学;2000年
张瑞琳;[D];大连理工大学;2000年
郭勇;[D];广西师范大学;2000年
梁晓东;[D];广西师范大学;2000年
王峰;[D];华北工学院;2001年
朱晓青;[D];解放军信息工程大学;2001年
【同被引文献】
中国期刊全文数据库
吴恩华;[J];软件学报;2004年10期
岳天祥,艾南山;[J];冰川冻土;1990年03期
岳天祥,杜正平,刘纪远;[J];自然科学进展;2004年03期
岳天祥,杜正平;[J];自然科学进展;2005年04期
岳天祥;杜正平;;[J];自然科学进展;2006年08期
蔡福,于贵瑞,祝青林,何洪林,刘新安,李正泉,郭学兵;[J];资源科学;2005年05期
【相似文献】
中国期刊全文数据库
蒋川群;杜奕;;[J];计算机工程与应用;2009年19期
王敏;;[J];科学技术与工程;2010年04期
王荣;;[J];现代电子技术;2008年22期
司玲玲;石磊娜;王亚楠;王保民;;[J];邯郸学院学报;2006年03期
徐光联;;[J];科学咨询(决策管理);2008年03期
郑亚芹;;[J];制造业自动化;2008年09期
黄镇建;蔡群英;;[J];计算机与数字工程;2009年11期
唐玉景,陈正宏,冯钧,崔炳军,高保康;[J];信息技术;1998年05期
魏继增;孙济洲;李小图;;[J];计算机工程;2007年10期
陈娴;;[J];电脑与电信;2009年02期
中国重要会议论文全文数据库
武继刚;乔占科;;[A];1996中国控制与决策学术年会论文集[C];1996年
苑维然;陈璞;刘凯欣;;[A];中国力学学会学术大会'2005论文摘要集(下)[C];2005年
王晓方;杜小勇;陈跃国;王琰;;[A];NDBC2010第27届中国数据库学术会议论文集(B辑)[C];2010年
徐侃;陈如山;杜磊;朱剑;杨阳;;[A];2009年全国微波毫米波会议论文集(下册)[C];2009年
蒋继娅;刘彤;柯汉平;;[A];第二十次全国计算机安全学术交流会论文集[C];2005年
谭红星;周龙骧;;[A];数据库研究进展97——第十四届全国数据库学术会议论文集(下)[C];1997年
华雯;王琰;陈跃国;陈晋川;杜小勇;;[A];NDBC2010第27届中国数据库学术会议论文集(B辑)[C];2010年
何义剑;姚青;洪晓光;;[A];第二十四届中国数据库学术会议论文集(技术报告篇)[C];2007年
肖斌;张众;张旭东;;[A];全国第三届信号和智能信息处理与应用学术交流会专刊[C];2009年
胡岸勇;柳重堪;苗俊刚;万国龙;;[A];全国第二届信号处理与应用学术会议专刊[C];2008年
中国博士学位论文全文数据库
计长安;[D];上海交通大学;2006年
沈宗俊;[D];清华大学;2007年
冉瑞生;[D];电子科技大学;2006年
何蓓;[D];中南大学;2006年
中国硕士学位论文全文数据库
李珂;[D];武汉科技大学;2012年
王鋆;[D];浙江大学;2006年
陈海占;[D];华北电力大学(北京);2006年
杨智奇;[D];电子科技大学;2009年
李学营;[D];河海大学;2007年
张英男;[D];吉林大学;2008年
孙博;[D];天津大学;2010年
李瑞玲;[D];燕山大学;2010年
胡耀国;[D];华中科技大学;2011年
潘晖;[D];天津理工大学;2007年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 知识超市公司
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备74号用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我想改变行业的未来,因为我有一颗改变世界的心
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3334)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'稀疏矩阵的三元组顺序表存储',
blogAbstract:'稀疏矩阵是其元素大部分为零的矩阵。在科学与工程领域中求解线性模型时经常出现大型的稀疏矩阵。在使用计算机存储和操作稀疏矩阵时,经常需要修改标准算法以利用矩阵的稀疏结构。由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。更为重要的是,由于过大的尺寸,标准的算法经常无法操作这些稀疏矩阵。如何进行系数矩阵的压缩存储呢?按照压缩存储的概念,只存储稀疏矩阵的非零元素。因此,除了存储非零元的值之外,还必须同时记录下它所在的行和列的位置(i,j)。反之,一个三元组(i,j',
blogTag:'矩阵,三元组,ata,col,nu',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:3,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我想改变行业的未来,因为我有一颗改变世界的心',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}数据结构-稀疏矩阵的三元组表存储方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
数据结构-稀疏矩阵的三元组表存储方法
详​细​解​说​数​据​结​构​-​-​-​稀​疏​矩​阵​的​三​元​组​表​存​储​方​法
大小:617.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢设m*n 矩阵中有t 个非零元素且t&&m*n,这样的矩阵称为稀疏矩阵。很多科学管理及工程计算中,常会遇到阶数很高的大型稀疏矩阵。如果按常规分配方法,顺序分配在计算机内,那将是相当浪费内存的。为此提出另外一种存储方法,仅仅存放非零元素。但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,所以仅存储非零元素的值是不够的,还要记下它所在的行和列。于是采取如下方法:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。下面讨论稀疏矩阵的压缩存储方法。
将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,称为三元组表,采用顺序存储方法存储该表。如图5.11 稀疏矩阵对应的三元组表为图5.12。
显然,要唯一的表示一个稀疏矩阵,还需要存储三元组表的同时存储该矩阵的行、列,为了运算方便,矩阵的非零元素的个数也同时存储。这种存储的思想实现如下:
define SMAX 1024 /*一个足够大的数*/
typedef struct
{ int i,j; /*非零元素的行、列*/
/*非零元素值*/
}SPN /*三元组类型*/
typedef struct
{ int mu,nu, /*矩阵的行、列及非零元素的个数*/
SPNode data[SMAX]; /*三元组表*/
} SPM /*三元组表的存储类型*/
这样的存储方法确实节约了存储空间,但矩阵的运算从算法上可能变的复杂些。下面我们讨论这种存储方式下的稀疏矩阵的两种运算:转置和相乘。
1.稀疏矩阵的转置
设SPMatrix A; 表示一m*n 的稀疏矩阵,其转置B 则是一个n*m 的稀疏矩阵,因此也有SPMatrix B; 由A 求B 需要:
A 的行、列转化成B 的列、行;
将A.data 中每一三元组的行列交换后转化到B.data 中;
看上去以上两点完成之后,似乎完成了B,没有。因为我们前面规定三元组的是按一行一行且每行中的元素是按列号从小到大的规律顺序存放的,因此B 也必须按此规律实现,A 的转置B 如图5.13 所示,图5.14 是它对应的三元组存储,就是说,在A 的三元组存储基础上得到B 的三元组表存储(为了运算方便,矩阵的行列都从1 算起,三元组表data 也从1 单元用起)。
算法思路:
①A 的行、列转化成B 的列、行;
②在A.data 中依次找第一列的、第二列的、直到最后一列,并将找到的每个三元组的行、列交换后顺序存储到B.data 中即可。
算法如下:
void TransM1 (SPMatrix *A)
{ SPMatrix *B;
B=malloc(sizeof(SPMatrix)); /*申请存储空间*/
B-&mu=A-& B-&nu=A-& B-&tu=A-&
/*稀疏矩阵的行、列、元素个数*/
if (B-&tu&0) /*有非零元素则转换*/
for (col=1; col&=(A-&nu); col++) /*按A 的列序转换*/
for (p=1; p&= (A-&tu); p++) /*扫描整个三元组表*/
if (A-&data[p].j==col )
{ B-&data[q].i= A-&data[p].
B-&data[q].j= A-&data[p].
B-&data[q].v= A-&data[p].v;
q++; }/*if*/
} /*if(B-&tu&0)*/
return B; /*返回的是转置矩阵的指针*/
} /*TransM1*/
算法5.1 稀疏矩阵转置
分析该算法,其时间主要耗费在col 和p 的二重循环上,所以时间复杂性为O(n*t),(设m、n 是原矩阵的行、列,t 是稀疏矩阵的非零元素个数),显然当非零元素的个数t 和m*n 同数量级时,算法的时间复杂度为O(m*n2),和通常存储方式下矩阵转置算法相比,可能节约了一定量的存储空间,但算法的时间性能更差一些。
算法5.1 的效率低的原因是算法要从A 的三元组表中寻找第一列、第二列、&,要反复搜索A 表,若能直接确定A 中每一三元组在B 中的位置,则对A 的三元组表扫描一次即可。这是可以做到的,因为A 中第一列的第一个非零元素一定存储在B.data[1],如果还知道第一列的非零元素的个数,那么第二列的第一个非零元素在B.data 中的位置便等于第一列的第一个非零元素在B.data 中的位置加上第一列的非零元素的个数,如此类推,因为A 中三元组的存放顺序是先行后列,对同一行来说,必定先遇到列号小的元素,这样只需扫描一遍A.data 即可。
根据这个想法,需引入两个向量来实现:num[n+1]和cpot[n+1],num[col]表示矩阵A中第col 列的非零元素的个数(为了方便均从1 单元用起),cpot[col]初始值表示矩阵A中的第col 列的第一个非零元素在B.data 中的位置。于是cpot 的初始值为:
cpot[1]=1;
cpot[col]=cpot[col-1]+num[col-1]; 2&col&n
例如对于矩阵图5.11 矩阵A 的num 和cpot 的值如下:
依次扫描A.data,当扫描到一个col 列元素时,直接将其存放在B.data 的cpot[col]位置上,cpot[col]加1,cpot[col]中始终是下一个col 列元素在B.data 中的位置。下面按以上思路改进转置算法如下:
SPMatrix * TransM2 (SPMatrix *A)
{ SPMatrix *B;
int i,j,k;
int num[n+1],cpot[n+1];
B=malloc(sizeof(SPMatrix)); /*申请存储空间*/
B-&mu=A-& B-&nu=A-& B-&tu=A-&
/*稀疏矩阵的行、列、元素个数*/
if (B-&tu&0) /*有非零元素则转换*/
{ for (i=1;i&=A-&i++) num[i]=0;
for (i=1;i&=A-&i++) /*求矩阵A 中每一列非零元素的个数*/
{ j= A-&data[i].j;
cpot[1]=1; /*求矩阵A 中每一列第一个非零元素在B.data 中的位置*/
for (i=2;i&=A-&i++)
cpot[i]= cpot[i-1]+num[i-1];
for (i=1; i&= (A-&tu); i++) /*扫描三元组表*/
{ j=A-&data[i].j; /*当前三元组的列号*/
k=cpot[j]; /*当前三元组在B.data 中的位置*/
B-&data[k].i= A-&data[i].
B-&data[k].j= A-&data[i].
B-&data[k].v= A-&data[i].v;
cpot[j]++;
} /*for i */
} /*if (B-&tu&0)*/
return B; /*返回的是转置矩阵的指针*/
} /*TransM2*/
算法5.2 稀疏矩阵转置的改进算法
分析这个算法的时间复杂度:这个算法中有四个循环,分别执行n,t,n-1,t 次,在每个循环中,每次迭代的时间是一常量,因此总的计算量是O(n+t)。当然它所需要的存储空间比前一个算法多了两个向量。
2.稀疏矩阵的乘积
已知稀疏矩阵A(m1& n1)和B(m2& n2),求乘积C(m1& n2)。稀疏矩阵A、B、C 及它们对应的三元组表A.data、B.data、C.data 如图5.16 所示。
由矩阵乘法规则知:
这就是说只有A(i,k)与B(k,p)(即A 元素的列与B 元素的行相等的两项)才有相乘的机会,且当两项都不为零时,乘积中的这一项才不为零。
矩阵用二维数组表示时,传统的矩阵乘法是:A 的第一行与B 的第一列对应相乘累加后得到c11,A 的第一行再与B 的第二列对应相乘累加后得到c12,&,因为现在按三元组表存储,三元组表是按行为主序存储的,在B.data 中,同一行的非零元素其三元组是相邻存放的,同一列的非零元素其三元组并未相邻存放,因此在B.data 中反复搜索某一列的元素是很费时的,因此改变一下求值的顺序,以求c11 和c12 为例,因为:
即a11 只有可能和B 中第1 行的非零元素相乘,a12 只有可能和B 中第2 行的非零元素相乘,&,而同一行的非零元是相邻存放的,所以求c11 和c12 同时进行:求a11*b11 累加到c11,求a11*b12 累加到c12,再求a12*b21 累加到c11,再求a12*b22 累加到c22.,&,当然只有aik 和bkj(列号与行号相等)且均不为零(三元组存在)时才相乘,并且累加到cij 当中去。
为了运算方便,设一个累加器:datatype temp[n+1];用来存放当前行中cij 的值,当前行中所有元素全部算出之后,再存放到C.data 中去。
为了便于B.data 中寻找B 中的第k 行第一个非零元素,与前面类似,在此需引入num和rpot 两个向量。num[k]表示矩阵B 中第k 行的非零元素的个数;rpot[k]表示第k 行的第一个非零元素在B.data 中的位置。于是有
rpot[k]=rpot[k-1]+num[k-1] 2&k&n
例如,对于矩阵B 的num 和rpot 如图5.17 所示。
根据以上分析,稀疏矩阵的乘法运算的粗略步骤如下:
⑴初始化。清理一些单元,准备按行顺序存放乘积矩阵;
⑵求B 的num,
⑶做矩阵乘法。将A.data 中三元组的列值与B.data 中三元组的行值相等的非零元素相乘,并将具有相同下标的乘积元素相加。
算法如下:
SPMatrix *MulSMatrix (SPMatrix *A, SPMatrix *B)
/*稀疏矩阵A(m1& n1)和B(m2& n2) 用三元组表存储,求A&B */
{ SPMatrix *C; /* 乘积矩阵的指针*/
int p,q,i,j,k,r;
datatype temp[n+1];
int num[B-&nu+1],rpot[B-&nu+1];
if (A-&nu!=B-&mu) return NULL; /*A 的列与B 的行不相等*/
C=malloc(sizeof(SPMatrix)); /*申请C 矩阵的存储空间*/
C-&mu=A-& C-&nu=B-&
if (A-&tu*B-&tu==0) {C-&tu=0; return C; }
for (i=1;i&= B-&i++) num[i]=0; /*求矩阵B 中每一行非零元素的个数*/
for (k=1;k&=B-&k++)
{ i= B-&data[k].i;
rpot[1]=1; /*求矩阵B 中每一行第一个非零元素在B.data 中的位置*/
for (i=2;i&=B-&i++)
rpot[i]= rpot[i-1]+num[i-1];
r=0; /*当前C 中非零元素的个数*/
p=1; /*指示A.data 中当前非零元素的位置*/
for ( i= 1;i&=A-& i++)
{ for (j=1;j&=B-&j++) temp[j]=0; /*cij 的累加器初始化*/
while (A-&data[p].i==i ) ./*求第i 行的*/
{ k=A-&data[p].j; /*A 中当前非零元的列号*/
if (k&B-&mu) t=rpot[k+1];
else t=B-&tu+1; /*确定B 中第k 行的非零元素在B.data 中的下限位置*/
for (q=rpot[k]; q&t; q++;) /* B 中第k 行的每一个非零元素*/
{ j=B-&data[q].j;
temp[j]+=A-&data[p].v * B-&data[q].v
} /* while */
for (j=1;j&=B-&j++)
if (temp[j] )
C-&data[r]={i,j,temp[j] };
} /*for i*/
}/* MulSMatrix */
算法5.3 稀疏矩阵的乘积
分析上述算法的时间性能如下:
(1)求num 的时间复杂度为O(B-&nu+B-&tu);
(2)求rpot 时间复杂度为O(B-&mu);
(3)求temp 时间复杂度为O(A-&mu*B-&nu);
(4)求C的所有非零元素的时间复杂度为O(A-&tu*B-&tu/B-&mu);
(5)压缩存储时间复杂度为O(A-&mu*B-&nu);所以总的时间复杂度为O(A-&mu*B-&nu+(A-&tu*B-&tu)/B-&nu)。
微信公众号:
各位粉丝,大家好,我是C语言中文网的站长(可以了解我),C语言中文网已经开通了微信公众号,名字是「码农宿舍」(不是C语言中文网哦),我将在这里和大家交流编程知识以及工作经验。大家可以搜索名字「码农宿舍」关注,也可以用微信扫描右边的二维码关注。
当你决定关注「码农宿舍」,你已然超越了99%的程序员!
推荐文章 TOP10关于稀疏矩阵的并行算法介绍_矩阵_中国百科网
您现在的位置: >
> 文章内容:
关于稀疏矩阵的并行算法介绍
    该文章讲述了关于稀疏矩阵的并行算法介绍.
如果在矩阵中,多数的元素为0,称此矩阵为稀疏矩阵(sparse matrix)。
存储  由于矩阵在程序中常使用二维阵列表示,二维阵列的大小
与使用的存储器空间成正比,如果多数的元素没有数据,则会造成存储器空间的浪费,为此,必须设计稀疏矩阵的阵列储存方式,利用较少的存储器空间储存完整的矩阵数据。
  二维数组Amn中有N个非零元素,若N&&m*n,则称A为稀疏矩阵。
  由于稀疏矩阵中含有很多的0元素,在计算机中存储会浪费很多的空间,因此我们通常采用压缩存储的方法。
  稀疏矩阵的计算速度更快,因为M AT L A B只对非零元素进行操作,这是稀疏矩阵的一个突出的优点.
  假设矩阵A,B中的矩阵一样.计算2*A需要一百万次的浮点运算,而计算2*B只
  需要2 0 0 0次浮点运算.
  因为M AT L A B不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵,在下一节
中将给出这些命令.前面章节中的算术和逻辑运算都适用于稀疏矩阵.
  对于一个用二维数组存储的稀疏矩阵Amn,如果假设存储每个数组元素需要L个字节,那么存储整个矩阵需要m*n*L个字节.但是,这些存储空间的大部分存放的是0元素,从而造成大量的空间浪费.为了节省存储空间,可以只存储其中的非0元素.
对于矩阵Amn的每个元素aij,知道其行号i和列号j就可以确定其位置.因此对于稀疏矩阵可以用一个结点来存储一个非0元素.该结点可以定义如下:
  [i,j,aij]
  该结点由3个域组成,i:行号,j:列号;aij元素值.这样的结点被称为三元组结点.矩阵的每一个元素Qij,由一个三元组结点(i,j,aij)唯一确定.
  例如稀疏矩阵A:
  50 0 0 0
  10 0 20 0
  0 0 0 0
  -30 0 -60 5
  其对应的三元组表为:
  0 0 50
  1 0 10
  1 2 20
  3 0 -30
  3 2 -60
稀疏矩阵的计算机存储
  一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存.如果M AT L A B把一个矩
  阵当作稀疏矩阵,那么只需在m&3的矩阵中存储m个非零项.第1列是行下标,第2列是列下
  标,第3列是非零元素值,不必保存零元素.如果存储一个浮点数要8个字
节,存储每个下标
  要4个字节,那么整个矩阵在内存中存储需要1 6&m个字节.
  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中,用命令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的稀疏矩阵.
  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转换成一个满矩阵.
  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 ),
  结果为:
  其中有去掉了两个零元素.将这个矩阵转换成满矩阵,输入:
  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 )中得到的矩阵是不一样的:
该文章讲述了稀疏矩阵运算.
稀疏矩阵运算
  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中至少有一个是满矩阵,则得到的结果就是满矩阵.
  表达式右边的冒号是要求一个参数的运算符,遵守这些运算规则.
  表达式左边的冒号不改变矩阵的形式.
  假设有:
  这是一个5&5的单位满矩阵和相应的稀疏矩阵.
  (a) C = 5*B,结果为:
  这是一个稀疏矩阵.
  (b) D = A + B,给出的结果为:
  这是一个满矩阵.
  (c) x = B \ h,结果为:
  这是一个满向量.
  有许多命令可以对非零元素进行操作.
  命令集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 r a n k( A )求稀疏矩阵A的结构秩.对于所有的矩阵来说,都有
  s p r a n k ( A)&r a n k ( A ).
  用下面的命令定义稀疏矩阵:
  现在创建一个大矩阵:
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
  可以看出B i g是一个块双对角矩阵.
该文章讲述了稀疏矩阵的特例.
稀疏矩阵的特例
  MATLAB中有四个基本稀疏矩阵,它们是单位矩阵,随机矩阵,对称随机矩阵和对角矩阵.
  命令集9 0单位稀疏矩阵
  s p e y e ( n )生成n&n的单位稀疏矩阵.
  s p e y e ( m , n )生成m&n的单位稀疏矩阵.
  命令speye(A) 得到的结果和s p a r s e ( e y e ( A ) )是一样的,但是没有涉及到满阵的存储.
  命令集9 1随机稀疏矩阵
  s p r a n d ( A )生成与A有相同结构的随机稀疏矩阵,且元素服从均匀分布.
  s p r a n d ( m , n , d e n s )生成一个m&n的服从均匀分布的随机稀疏矩阵,有d e n s&m&
  n个非零元素,0&d e n s&1.参数d e n s是非零元素的分布密度.
  s p r a n d ( m , n , d e n s ,生成一个近似的条件数为1 /rc,大小为m&n的随机稀疏矩
  r c )阵.如果rc=rc是一个长度为l&l ( m i n (m, n) )的向量,那么
  矩阵将rci作为它l个奇异值的第一个,其他的奇异值为0.
  s p r a n d n ( A )生成与A有相同结构的随机稀疏矩阵,且元素服从正态分布.
  s p r a n d n ( m , n , d e n s ,生成一个m&n的服从正态分布的随机稀疏矩阵,和sprand
  r c )一样.
  s p r a n d s y m ( S )生成一个随机对称稀疏矩阵.它的下三角及主对角线部分
  与S的结构相同,矩阵元素服从正态分布.
  s p r a n d s y m ( n , d e n s )生成一个m&n的随机对称稀疏矩阵.矩阵元素服从正态
  分布,分布密度为d e n s.
  s p r a n d s y m ( n , d e n s ,生成一个近似条件数为1 /rc的随机对称稀疏矩阵.元素以0
  r c )对称分布,但不是正态分布.如果rc=rc是一个向量,则矩
  阵有特征值rci.也就是说,如果rc是一个正向量,则矩阵
  是正定矩阵.
  s p r a n d s y m ( n , d e n s ,生成一个正定矩阵.如果k= 1,则矩阵是由一正定对称矩
  r c , k )阵经随机J a c o b i旋转得到的,其条件数正好等于1 /如
  果k= 2,则矩阵为外积的换位和,其条件数近似等于1 /rc.
  s p r a n d s y m ( S , d e n s ,生成一个与矩阵S结构相同的稀疏矩阵,近似条件数为1 /rc.
  r c , 3 )参数d e n s被忽略,但是这个参数在这个位置以便函数能确认
  最后两个参数的正确与否.
  (a) 假设有矩阵A:
  输入R a n d o m = s p r a n d n ( A ),可得到随机稀疏矩阵:
  矩阵中随机数的位置和矩阵A中非零元素的位置相同.
  (b) 对于( a )中的矩阵A,输入:
  B = s p r a n d s y m ( A )
  结果为:
  这是一个用矩阵A的下三角及主对角线部分创建的对称矩阵,在非零元素的位置用随机数
  作为元素值.
  用命令s p d i a g s可以取出对角线元素,并创建带状对角矩阵.假设矩阵A的大小为m&n,
在p个对角线上有非零元素.B的大小为m i n (m&n)&p,它的列是矩阵A的对角线.向量d的长
  度为p,其整型分量给定了A的对角元:
  di0 主对角线上的对角线
  命令集9 2对角稀疏矩阵
  [ B , d ] = s p d i a g s ( A )求出A中所有的对角元,对角元保存在矩阵B中,它们的
  下标保存在向量d中.
  s p d i a g s ( A , d )生成一个矩阵,这个矩阵包含有矩阵A中向量d规定的对角元.
  s p d i a g s ( B , d , A )生成矩阵A,用矩阵B中的列替换d定义的对角元.
  A = s p d i a g s ( B , d , m , n )用保存在由d定义的B中的对角元创建稀疏矩阵A.
  例11 . 4给出了如何使用s p d i a g s命令来解普通微分方程组.
线性方程组
在许多实际应用中要保留稀疏矩阵的结构,但是在计算过程中的中间结果会减弱它的稀疏性,如L U分解.这就会导致增加浮点运算次数和存储空间.为了避免这种情况发生,在第稀疏矩阵1 2 9
  M AT L A B中用命令对矩阵进行重新安排.这些命令都列在下面的命令集9 3中.通过h e l p命令
  可以得到每个命令更多的帮助信息,也可见h e l p d e s k.
  命令集9 3矩阵变换
  c o l m m d ( A )返回一个变换向量,使得矩阵A列的秩为最小.
  s y m m m d ( A )返回使对称矩阵秩为最小的变换.
  s y m r c m ( A )矩阵A的C u t h i l l - M c K e e逆变换.矩阵A的非零元素在主对角线附近.
  c o l p e r m ( A )返回一个矩阵A的列变换的向量.列按非零元素升序排列.有时这
  是L U因式分解前有用的变换:lu(A(:, j)).如果A是一个对称矩
  阵,对行和列进行排序,这有利于C h o l e s k y分解:chol(A(j, j)).
  r a n d p e r m ( n )给出正数1,2,. . .,n的随机排列,可以用来创建随机变换矩阵.
  d m p e r m ( A )对矩阵A进行D u l m a g e - M e n d e l s o h n分解,输入help dmperm可得更多信息.
  创建一个秩为4的变换矩阵,可输入:
  一旦运行p e r m = r a n d p e r m ( 4 ),就会得到:
  给出的变换矩阵为:
  如果矩阵A为:
  输入命令:
  运行结果为:
  有两个不完全因式分解命令,它们是用来在解大线性方程组前进行预处理的.用h e l p d e s k命令可得更多信息.命令集9 4不完全因式分解c h o l i n c ( A , o p t )进行不完全C h o l e s k y分解,变量o p t取下列值之一:
  d r o p t o l指定不完全分解的舍入误差,0给出完全分解.
  m i c h o l如果m i c h o l = 1,则从对角线上抽取出被去掉的元素.
  r d i a g用s q r t ( d r o p t o l*n o r m ( X ( : , j ) ) )代替上三角分
  解因子中的零元素,j为零元素所在的列.
  [ L , U , P ]=返回矩阵X的不完全分解得到的三个矩阵L,U和P,变量o p t取
  l u i n c ( X , o p t )下列值之一:
  d r o p t o l指定分解的舍入误差.
  m i l u改变分解以便从上三角角分解因子中抽取被去掉的列元素.
  u d i a g用d r o p t o l值代替上三角角分解因子中的对角线上的
  零元素.
  t h r e s h中心极限.
  解稀疏线性方程组既可用左除运算符解,也可用一些特殊命令来解.
  命令集9 5稀疏矩阵和线性方程组
  s p p a r m s ( k e y s t r , o p )设置稀疏矩阵算法的参数,用help spparms可得详细信息.
  s p a u g m e n t ( A , c )根据[ c*l A; A' 0 ]创建稀疏矩阵,这是二次线性方程组的最
  小二乘问题.参见7 . 7节.
  s y m b f a c t ( A )给出稀疏矩阵的C h o l e s k y和L U因式分解的符号分解因子.
  用help symbfact可得详细信息.
  稀疏矩阵的范数计算和普通满矩阵的范数计算有一个重要的区别.稀疏矩阵的欧几里德
  范数不能直接求得.如果稀疏矩阵是一个小矩阵,则用n o r m ( f u l l ( A ) )来计算它的范数;
  但是对于大矩阵来说,这样计算是不可能的.然而M AT L A B可以计算出欧几里德范数的近似
  值,在计算条件数时也是一样.
  命令集9 6稀疏矩阵的近似欧几里德范数和条件数
  n o r m e s t ( A )计算A的近似欧几里德范数,相对误差为1 0-6.
  n o r m e s t ( A , t o l )计算A的近似欧几里德范数,设置相对误差t o l,而不用缺省时
  的1 0-6.
  [ n r m , n i t ] =计算近似n r m范数,还给出计算范数迭代的次数n i t.
  n o r m e s t ( A )
  c o n d e s t ( A )求矩阵A条件数的1 -范数中的下界估计值.
  [ c , v ]=求矩阵A的1 -范数中条件数的下界估计值c和向量v,使得
  c o n d e s t ( A , t r )| |Av| | = ( | |A| | | |v| | ) / c.如果给定t r,则给出计算的过程.t r= 1,
  给出每步过程;t r=-1,给出商c / r c o n d ( A ).
  假设给出:
  用n o r m A p p r o x = n o r m e s t ( S p r s )计算出:
  用t h e N o r m = n o r m ( f u l l ( S p r s ) )得:
  为了找到它们之间的差别,计算d i f f e r e n c e = t h e N o r m - n o r m A p p r o x,得:
  在许多应用中,n o r m e s t计算得到的近似值是一个很好的近似欧几里德范数,它的计算
  步数要比n o r m要少得多;可参见7 . 6节.
  用e t r e e命令来找到稀疏对称矩阵的消元树,用向量f来描述消元树,还可用
  e t r e e p l o t命令画出来.元素fi是矩阵的上三角C h o l e s k y分解因子中i行上第1非零元素的列下
  标.如果有非零元素,则fi= 0.消元树可以这样来建立:
  节点i是fi的孩子,或者如果fi= 0,则节点i是树的根节点.
  命令集9 7矩阵的消元树
  e t r e e ( A )求A的消元树向量f,这个命令有可选参数;输入h e l p
  e t r e e获取帮助.
  e t r e e p l o t ( A )画出向量f定义的消元树图形.
  t r e e p l o t ( p , c , d )画出指针向量p的树图形,参数c和d分别指定节点的颜色
  和分支数.e t r e e p l o t可以调用这个命令.
  t r e e l a y o u t显示树的结构,t r e e p l o t可以调用这个命令.
  假设有对称稀疏矩阵B:
  运行命令b t r e e = e t r e e ( B ),结果为:
  开始的数字2不难理解,它是矩阵的第1列上第1个非零元素的行数,它决定了在C h o l e s k y
  分解因子的第1行第2列处有一个非零元素.当缩减第1列的元素时就得到第2列的数字5.B在
  缩减后,在( 5 , 2 )位置的元素是非零的,这样消元树向量中第2个元素的值为5.
  s p y ( c h o l ( B ) )给出了C h o l e s k y分解因子的结构图,如图9 - 2所示:
  图9-2 Cholesky分解结构图
  图9-3 矩阵B的消元树
  这个向量消元树可以这样来建立:上三角中只有一行有非零元素,节点8,因此这就是树
该文章讲述了稀疏矩阵.
唯一的根.节点1是节点2的孩子,节点2和3是节点5的孩子,而节点5是节点6的孩子.节点4和6是节点7的孩子,而节点7又是节点8的孩子,即根的孩子.
  命令e t r e e p l o t ( B )给出了树的结构图,如图9 - 3所示.   消元树的形状取决于列和行序,它可以用来分析消元过程.   用g p l o t命令可以画出坐标和矩阵元素间的联系图形.必须在n&2的矩阵中给出n个坐标,   矩阵的每一行作为一个点.这样就创建出点点之间连接的n&n矩阵,如果点4连接到点8,则   (4, 8)的值为1.由于是一个大矩阵,而且非零元素较少,所以它应该被建成稀疏矩阵.   这个图可以说明网络问题,如传递问题.它还包含有线性方程组中未知量之间的相关信息.   
命令集9 8网络图形
  g p l o t ( A , K )如果矩阵A的a(i, j)不为0,则将点ki连接到点kj.K是一个n&   2的坐标矩阵,A是一个n&n的关联矩阵.   g p l o t ( A , K , s t r )用字符串s t r给定的颜色和线型画出的同上图形.字符串s t r的   取值参见表1 3 - 1.   [ X , A ] = u n m e s h ( E )求网格边界矩阵E的L a p l a c e矩阵A和网格点的坐标矩阵X.
  假设有下面的坐标矩阵K和关联矩阵A:
  矩阵A在稀疏化后,用命令g p l o t ( A , K )画出图9 - 4,给出了点(0, 1)和点(4, 1)之间所有可能的路径.
Mail: Copyright by ;All rights reserved.}

我要回帖

更多关于 matlab 稀疏矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信