稀疏矩阵三元组快速转置(转poklau123写的很清楚)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

稀疏矩阵三元组快速转置(转poklau123写的很清楚)
关于稀疏矩阵的快速转置法,⾸先得明⽩其是通过对三元表进⾏转置。

如果误以为是对矩阵进⾏转置,毫⽆疑问就算你想破脑袋也想不出个所以然,别陷⼊死胡同了!
对于⼀个三元表,⾏为i,列为j,值为v。

需将其i与j的值对调才能得到新的三元表,但是如果直接进⾏转换,得到的新的三元表的顺序是混乱的,不符合三元表的规则。

所以,课本⾸先介绍了⼀个⽤扫描来转置的算法(这个算法⽐较容易,在这⾥我就不说了),但是这个转置算法的时间复杂度太⾼,于是就有了接下来的快速转置算法。

要你对⼀个三元表进⾏步骤最少的转置,你可能会想,如果知道三元表中每⼀项在转置后的新的三元表中的位置,然后直接放进去,岂不是极⼤的缩⼩了时间复杂度?没错!快速转置法正是基于这种思想⽽设计的。

那么如何知道三元表中某⼀项的位置呢?在课本98页的a.data这个三元表可以看到,j为列号,在转置后即为新的三元表的⾏号,三元表正是按照⾏序进⾏排列的,⽽j=1有2个、j=2有2个、j=3有2个、j=4有1个、j=6有1个。

根据这些数据按照从⼩到⼤排列,j=1的项在新的三元表中应占据第1、2位,j=2的项在新的三元表中应占据第3、4位,j=3的项在新的三元表中应占据第5、6位,j=4应占据第7位,j=6应占据第8位。

接下来就轻松多了,转置的时候直接从第⼀项读起,读取其j值,⽐如课本中a.data这个三元表的第⼀项的j值为2,因为j=2占据第3、4位,所以应该从第三位开始放,接下来如果读取的某⼀项的j值也是2,就放在第4位。

因为j=2的项只有两个,所以第5位绝对不会被j=2的项占据,第5、6项本来就是留给j=3的。

再⽐如当读到j=6的那项时,第8位是留给它的,就可以直接放进第8位了。

这样,读取每⼀项,都能在三元表中找到相应的位置,这就是稀疏矩阵快速转置的原理。

当然,上⾯只是快速转置的原理,要实现它,就要设计算法来实现了。

⾸先,我们需要两个变量。

第⼀个num[col]⽤于记录原三元表中列数为col的项的数⽬,例如col=3时,num[col]=2;第⼆个cpot[col]⽤于记录原三元表中列数为col的项在新三元表中的⾸位置,例如col=3时,cpot[col]=5。

你可以打开书本第99页,我想你现在应该是能看懂表5.1了吧。

接下来说⼀说快速转置算法的具体事项,在课本的100页代码如下:
逐句解释:
①此函数名为FastTransposeSMatrix,形参有原三元表TSMatrix M,作⽤是传⼊三元表;三元表TSMatrix &T,采⽤引⽤以返回⼀个三元表。

②三元表T可能没有初始化,这句的意思是将矩阵M的⾏数,列数,以及⾮零元个数传给矩阵T,使其初始化。

③ T.tu为真时,即矩阵M中⾄少存在⼀个⾮零元。

④初始化数组num
⑤书中的注释是求M中每⼀列含⾮零元的个数。

具体来说,当原三元表M中某两项或多项的j值相同时,M.data[t].j的值是相等的,因此这个循环完成后,⽐如说num[3]的值就是原三元表M列数为3的个数。

⑥书中的注释标错位置了,应该是第⼀个for循环的后⾯。

Cpot[1]=1的⽤处是第⼀列的在新三元表T的第⼀个插⼊位置为1。

Cpot[0]是留给储存三元表⾏列数和⾮零元个数的。

⑦这句话是⽤来求除第⼀列外其它每⼀列的第⼀个⾮零元在新三元表T中的位置。

第col列第⼀个⾮零元的位置为第col-1列第⼀个⾮零元的位置加上第col-1列⾮零元的个数,这是个⾮常简单的数学问题,没必要多说了。

⑧ M.tu的值是原三元表M的⾮零元个数,这个循环是⽤来遍历原三元表M的每⼀项。

⑨ Col=M.data[p].j的作⽤是得到循环当前项p的列数值j,赋给col,cpot[col]的值即为第col列的第⼀个插⼊位置,如果你问为什么,请看第七句。

q=cpot[col]作⽤是⽤q来记录当前第col列的插⼊位置(当然你也可以不⽤这个赋值,只需把接下来出现的q都改为cpot[col]就⾏)。

⑩将原三元表M的当前第p项的i,j值进⾏交换后给新三元表T的第q项,这样第p项就转置后正确的插⼊到新三元表的正确位置。

将当前原三元表的第p项的⾮零元的值给新三元表的第p项。

后⼀句++cpot[col]这个⾃增语句是使列数位col的项在新三元表的插⼊位置移动⼀位,下次再碰到列数位col的列时,插⼊位置即为此次插⼊位置的下⼀个。

相关文档
最新文档