算法4-- 矩阵的转置_第1页
算法4-- 矩阵的转置_第2页
算法4-- 矩阵的转置_第3页
算法4-- 矩阵的转置_第4页
算法4-- 矩阵的转置_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、矩阵的转置2 本节主要内容本节主要内容 1. 1. 矩阵的转置算法矩阵的转置算法2. 2. 改进的快速转置算法改进的快速转置算法3稀疏矩阵的压缩存储稀疏矩阵的压缩存储对于元素分布都有一定的规律,我们都将其压缩存储到一维数组中,并找到每个矩阵元素在数组中的对应关系。稀疏矩阵:若非零元很少,而且分布没有一定的规律,如何来存储呢?非零元较零元少,且分布没有一定规律。稀疏因子: 假设假设 m 行行 n 列列的矩阵含的矩阵含 t 个非零元素个非零元素,则称,则称nmt通常认为 0.05 的矩阵为稀疏矩阵。非零元素个数总元素个数稀疏因子4稀疏矩阵的压缩存储稀疏矩阵的压缩存储1、三元组顺序表2、行逻辑链接的

2、顺序表3、十字链表5稀疏矩阵的压缩存储稀疏矩阵的压缩存储1、三元组顺序表00070015000001800000240001400003000000000009120M可由三元组表(1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7)和矩阵维数(6,7)唯一确定 6稀疏矩阵的压缩存储稀疏矩阵的压缩存储1、三元组顺序表 #define MAXSIZE 12500 typedef struct int i, j; /该非零元的行标和列标 ElemType e; / 该非零元的值 Triple; / 三元组类型ty

3、pedef struct Triple dataMAXSIZE + 1; / data0未用 int mu, nu, tu; / 矩阵的行数、列数及非零元个数 TSMatrix; / 稀疏矩阵类型7稀疏矩阵的压缩存储稀疏矩阵的压缩存储例如:00070015000001800000240001400003000000000009120Mstruct TSMatrix M;ije121213931-3361443245218611564-7M.mu=6;M.nu=7;M.tu=8;M.data4M.data5M.data6M.data7M.data8M.data0M.data1M.data2M.d

4、ata38稀疏矩阵的压缩存储稀疏矩阵的压缩存储2、行逻辑链接的顺序表为了便于对矩阵中任意一行非零元素进行操作,对三元组顺序表结构进行修改,增加一个量来记录每一行非零元在三元组表中的位置,这种“带行链接信息”的三元组表称为行逻辑链接的顺序表。typedef struct Triple dataMAXSIZE + 1; int rposMAXRC + 1; / 各行第一个非零元的位置表 int mu, nu, tu; RLSMatrix; / 行逻辑链接顺序表类型9稀疏矩阵的压缩存储稀疏矩阵的压缩存储00070015000001800000240001400003000000000009120M例

5、如:ije121213931-3361443245218611564-7M.data4M.data5M.data6M.data7M.data8M.data0M.data1M.data2M.data3struct RLSMatrix M; 行行0123456rpos133567M.mu=6;M.nu=7;M.tu=8;10 矩阵的转置矩阵的转置00070015000001800000240001400003000000000009120M00000000014000000007000000024009018000121500300T如何实现?如果矩阵未采用压缩存储方式,采用二维数组作为存储结构:

6、那么,转置算法为:行,列元素相交换。 for (col=1; col=列数; +col) for (row=1; row=行数; +row) Tcolrow = Mrowcol;时间复杂度为:(行数*列数)11 矩阵的转置矩阵的转置 #define MAXSIZE 12500 typedef struct int i, j; /该非零元的行标和列标 ElemType e; / 该非零元的值 Triple; / 三元组类型typedef struct Triple dataMAXSIZE + 1; / data0未用 int mu, nu, tu; / 矩阵的行数、列数及非零元个数 TSMatr

7、ix; / 稀疏矩阵类型若矩阵采用压缩存储-三元组顺序表作为存储结构,如何实现矩阵的转置?12 矩阵的转置矩阵的转置00070015000001800000240001400003000000000009120Mije121213931-3361443245218611564-7M.data4M.data5M.data6M.data7M.data8M.data0M.data1M.data2M.data3M.mu=6;M.nu=7;M.tu=8;struct TSMatrix M;13 矩阵的转置矩阵的转置ije121213931-3361443245218611564-7T.data8T.da

8、ta7T.data5T.data6T.data4T.data0T.data1T.data2T.data3M.data8M.data7M.data5M.data6M.data4M.data0M.data1M.data2M.data3ije211231913-3631434242518161546-7i和j相交换实现转置,这样实现是否正确?14 矩阵的转置矩阵的转置为了便于实现矩阵的各类算法,通常采用三元组顺序表对矩阵进行存储时,都将元素按照i值(行值)排列为非递减序列。因此,矩阵的转置(假设矩阵M转置为矩阵T):1、将矩阵M的行值赋给矩阵T的列值,M的列值赋给T的行值;2、将M的每个元素三元组中

9、的i值给T的每个元素三元组中的j值;M的每个元素三元组中的j值给T的每个元素三元组中的i值。3、应让T的三元组元素按照i值(行值)重新排序。通常有两种方法:1、压缩转置算法:核心思想:按照T.data中三元组的次序依次在M.data中找到相应的三元组进行转置。2、压缩快速转置算法:核心思想:按照M.data中三元组的次序进行转置,并将转置后的三元组置入T中恰当的位置上。15 压缩转置算法压缩转置算法1、压缩转置算法:核心思想:按照T.data中三元组的次序依次在M.data中找到相应的三元组进行转置。ije121213931-3361443245218611564-7M.data8M.data

10、7M.data5M.data6M.data4M.data0M.data1M.data2M.data3M.mu=6;M.nu=7;M.tu=8T.mu=7; T.nu=6;T.tu=8;ijeT.data8T.data7T.data5T.data6T.data4T.data0T.data1T.data2T.data3q=1按照从1到M.nu,反复查看M矩阵的三元组表中j值,按照递增的顺序重置入T中。col=1p=1M.datap.j=col;p=2p=313-3p=4q=2p=5p=6p=71615q=3p=8col=221122518319342446-7631416 压缩转置算法压缩转置算法

11、Status TransPoseSMatrix(TSMatrix M, TSMatrix &T) /用三元组表存放稀疏矩阵M,求M的转置矩阵TT.mu=M.nu; T.nu=M.mu; T.tu=M.tu; /nu是列数,mu是行数,tu是非零元素个数if (T.tu) q=1; /q是转置矩阵T的结点编号 for(col=1; col=M.nu; col+) /对每个列值均扫描一次 for(p=1; p=M.tu; p+) /p是M三元表中结点编号 if (M.datap.j=col) T.dataq.i=M.datap.j; T.dataq.j=M.datap.i; T.dataq

12、.e=M.datap.e; q+; return OK; /TranposeSMatrix算法描述:17 压缩转置算法压缩转置算法压缩转置算法时间复杂度:O(nu*tu)-即与M的列数及非零元的个数的乘积成正比。当非零元数量tu和mu*nu同数量级时,算法的时间复杂度就为O(mu*nu*nu)可见,比不压缩存储的矩阵转置的时间复杂度O(mu*nu)还要高。虽然,节省了存储空间,但时间复杂度提高了。压缩转置算法仅适于非零元很少(tumu*nu)的情况下。18 压缩快速转置算法压缩快速转置算法2、压缩快速转置算法:核心思想:按照M.data中三元组的次序进行转置,并将转置后的三元组置入T中恰当的位

13、置上。如果不用多次扫描M三元组表,而是在一次扫描中就将每个元素置入T中该元素所应该在的位置上,就可以大大提高时间复杂度了。关键问题在于如何确定每个元素在T中的位置。ije121213931-3361443245218611564-7ije p=1MT2112p=2319p=313-319 压缩快速转置算法压缩快速转置算法为了确定这些位置,在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在T中应在的位置。需要附设两个数组:numcol:表示矩阵M中第col列中非零元的个数。cpotcol:指示M中第col列的第一个非零元在T.data 中的恰当位置。显然两者的关系为: c

14、pot11cpotcol cpotcol-1 + numcol-120 压缩快速转置算法压缩快速转置算法00070015000001800000240001400003000000000009120Mije121213931-3361443245218611564-7 col1234567numcolcpotcolfor(col=1;col=M.nu;+col) numcol=0;0000000for(t=1;t=M.tu;+t) +numM.datat.j;111 22211 cpot11;for(col=2;col=M.nu;+col) cpotcol cpotcol-1 + numcol

15、-1135788921 压缩快速转置算法压缩快速转置算法ije121213931-3361443245218611564-7 col 1 2 3 4 5 6 7numcol2221010cpotcolijeMTfor(p=1;p=M.tu;+p)col=M.datap.j; q=cpotcol;M的p位置数据拷贝到T的q位置上; +cpotcol; p=1col=2q=3211213578894p=2col=3q=53916p=3col=1q=113-32p=4col=6q=863149p=5col=3q=6342401234567822 压缩快速转置算法压缩快速转置算法Status Fast

16、TransposeSMatrix(TSMatrix M, TSMatrix &T) T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; if (T.tu) for (col=1; col=M.nu; +col) numcol = 0; for (t=1; t=M.tu; +t) +numM.datat.j; cpot1 = 1; / 求求M中每列非零元素个数中每列非零元素个数 for (col=2; col=M.nu; +col) cpotcol = cpotcol-1 + numcol-1; for (p=1; p=M.tu; +p) 元素放入恰当位置; / if return OK; / FastTransposeSMatrix col =M.data p . j ; q =cpot col ; T.dataq.i = M.datap. j; T.dataq.j = M.datap. i; T.dataq.e = M.datap.e; 23 压缩快速转置算法压缩快速转置算法算法的效率分析:时间上: 算法中主要的基本操作为:该算法的时间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论