- 1、本文档共62页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工程科技]第五章 数组和广义表
习惯上,用大写字母表示广义表的名称,小写字母表示原子 如何求转置矩阵? 用常规的二维数组表示时的算法 大量的零元素参与转换 其时间复杂度为: O(mu×nu) for (col=1; col=nu; ++col) for (row=1; row=mu; ++row) T[col][row] = M[row][col]; 用“三元组”表示时如何实现? 1 2 14 1 5 -5 2 2 -7 3 1 36 3 4 28 2 1 14 5 1 -5 2 2 -7 1 3 36 4 3 28 方法1: p q p p p p p q p q Status TransposeSMatrix(TSMatrix M, TSMatrix T){ T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; //求出T的行数,列数,非零元个数 if (T.tu) { //存在非零元 q=1; //q是非零元在T的三元组中的序号, T中第q个非零元 for (col=1; col=M.nu; ++col) for(p=1; p=M.tu; ++p) if(M.data[p].j==col) {//每个三元组的i和j互换 T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e= M.data[p].e; ++q;} } Return OK; }//TransposeSMatrix 如果能预先确定矩阵M中每一列(即T中每一行)的第一个非零元在三元组中的位置,则转置时,便可直接放到恰当位置。 方法2: 转置前,应先求得M的每一列中非零元个数,进而求得每一列第一个非零元在b.data中应有的位置。 1 2 14 1 5 -5 2 2 -7 3 1 36 3 4 28 2 1 14 5 1 -5 2 2 -7 1 3 36 4 3 28 cpot[1] = 1 cpot[col] = cpot[col-1] + num[col-1] 附设两个向量:num和cpot. num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中的恰当位置,显然有 1 2 14 1 5 -5 2 2 -7 3 1 36 3 4 28 2 1 14 5 1 -5 2 2 -7 1 3 36 4 3 28 矩阵的向量cpot的值 Status FastTransposeSMatrix(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) num[col] = 0;//赋初值 for (t=1; t=M.tu; ++t) ++num[M.data[t].j]; //求M中每一列含非零元的个数 cpot[1] = 1; for (col=2; col=M.nu; ++col) cpot[col] = cpot[col-1] + num[col-1]; // 求第col列第一个非零元在三元组中的序号 cpot[1] = 1 cpot[col] = cpot[col-1] + num[col-1] for (p=1; p=M.tu; ++p) { col = M.data[p].j; //对每个非零元,求他们的列坐标j q = cpot[col]; //求第col列第一个非零元在三元组中的序号 T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; //三元组中的i, j互换 T.data[q].e = M.data[p].e; //非零元赋值 ++cpot[col];//求同一列下一个非零元的序号,更新cpot } //for } // if return OK; } // FastTransposeSMatrix 非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。然而,若需按行号存取某一行中的非零元,则需从头开始进行查找。 三元组顺序表(有序的双下标法)特点: 当矩阵的非零元个数和位置在操作过程
文档评论(0)