《三元组顺序表矩阵表示.ppt》由会员分享,可在线阅读,更多相关《三元组顺序表矩阵表示.ppt(67页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据结构数据结构第5章 数组与广义表第第5章章 数组和广义表数组和广义表 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的存储结构 5.6 m元多项式的表示 5.7 广义表的递归算法5.1 数组的定义数组的定义ADT Array ADT Array 数据对象:数据对象:DDaaj1 j1,j2,.,j2,.,ji ji ,.,.jn jn|j ji i=0,.,b=0,.,bi-1i-1,i=1,2,.,n,i=1,2,.,n,称称 n(0)n(0)为数组的维数,为数组的维数,b bi i为数组第为数组第 i i 维的长度,维的长
2、度,j ji i为数为数组元素的第组元素的第i i维下标,维下标,a aj1,.,j1,.,jn jn ElemSetElemSet 数据关系:数据关系:R RRR1 1,R,R2 2,.,.,RnRn,RiRia|0j 0jk kbbk k-1,1kn-1,1kn 且且k i,k i,0j 0ji ibbi i-2,-2,a aj1,.,j1,.,ji ji,.,.,jn jn,a,aj1,.ji+1,.,j1,.ji+1,.,jn jn D,i=2,.,n D,i=2,.,n 5.1 数组的定义数组的定义基本操作:基本操作:InitArray(&AInitArray(&A,n,bound1
3、,.,n,bound1,.,boundnboundn)操作结果:若维数操作结果:若维数 n n 和各维长度合法,则构造相应的数组和各维长度合法,则构造相应的数组 A A。DestroyArray(&ADestroyArray(&A)初始条件:数组初始条件:数组 A A 已经存在。已经存在。操作结果:销毁数组操作结果:销毁数组 A A。Value(AValue(A,&e,index1,.,&e,index1,.,indexnindexn)初始条件:初始条件:A A 是是 n n 维数组,维数组,e e 为元素变量,随后是为元素变量,随后是 n n 个下标值。个下标值。操作结果:若各下标不超界操作
4、结果:若各下标不超界,则则e e赋值为所指定的赋值为所指定的A A的元素值的元素值,并返并返回回OKOK。Assign(&AAssign(&A,e,index1,.,e,index1,.,indexnindexn)初始条件:初始条件:A A 是是 n n 维数组,维数组,e e 为元素变量,随后是为元素变量,随后是 n n 个下标值。个下标值。操作结果:若下标不超界,则将操作结果:若下标不超界,则将 e e 的值赋给的值赋给A A中指定下标的元素。中指定下标的元素。ADT Array ADT Array5.2 数组的顺序表示和实现数组的顺序表示和实现n n由于数组类型不作插入和删除的操作,因此
5、只需要通过顺序映象得到它的存储结构,即借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系。n n通常有两种映象方法:即“以行(序)为主(序)“row-major的映象方法和”以列(序)为主(序)“column-major 的映象方法。n n将多维数组映射到一维数组的方法 representations of a multidimensional array5.2 数组的顺序表示和实现数组的顺序表示和实现n n以二维数组 a m,n为例,其在内存中的映像n n既可以如下排列(行优先):a00,a01,a0,n-1,a10,a11,a1,n-1,am-1,0,am-1,n-1n n也可以
6、如下排列(列优先):a00,a10,am-1,0,a01,a11,am-1,1,a0,n-1,am-1,n-11112131415162122232425263132333435364142434445461112131415162122232425263132333435364142434445461121314112223242132333431424344415253545162636465.2 数组的顺序表示和实现数组的顺序表示和实现n n假设二维数组 Rmn 中每个数据元素占L个存储地址,并以 LOC(i,j)表示下标为(i,j)的数据元素的存储地址,则该数组中任何一对下标(i,j)
7、对应的数据元素在以行为主的顺序映象中的存储地址为:n nLOC(i,j)=LOC(0,0)+(i*n+j)*L在以列为主的顺序映象中的存储地址为:n nLOC(i,j)=LOC(0,0)+(j*m+i)*L其中 LOC(0,0)是二维数组中第一个数据元素(下标为(0,0))的存储地址,称为数组的 基地址 或基址。5.2 数组的顺序表示和实现数组的顺序表示和实现n n类似地,假设三维数组类似地,假设三维数组 RpmnRpmn 中每个数据元素中每个数据元素占占 L L 个存储地址,并以个存储地址,并以 LOC(i,j,kLOC(i,j,k)表示下标为表示下标为(i,j,ki,j,k)的数据元素的存
8、储地址,则该数组中任的数据元素的存储地址,则该数组中任何一对下标何一对下标(i,j,ki,j,k)对应的数据元素在对应的数据元素在 以行为主以行为主 的顺序映象中的存储地址为:的顺序映象中的存储地址为:LOC(i,j,kLOC(i,j,k)=)=LOC(0,0,0)+(LOC(0,0,0)+(imnimn+jn+k)Ljn+k)L5.2 数组的顺序表示和实现数组的顺序表示和实现templatetemplateclass Array1D class Array1D friend friend ostreamostream&operator (&operator (ostreamostream&,
9、const Array1D&);&,const Array1D&);public:public:Array1D(int size=0);Array1D(int size=0);Array1D(const Array1D&v);/copy constructor Array1D(const Array1D&v);/copy constructor Array1D()delete element;Array1D()delete element;T&T&operator(intoperator(int i)const;i)const;intint Size()return size;Size()re
10、turn size;Array1D&operator=(const Array1D&v);Array1D&operator=(const Array1D&v);Array1D operator+()const;/unary+Array1D operator+()const;/unary+Array1D Array1D operator+(constoperator+(const Array1D&v)const;Array1D&v)const;Array1D operator-()const;/unary minus Array1D operator-()const;/unary minus A
11、rray1D operator-(const Array1D&v)const;Array1D operator-(const Array1D&v)const;Array1D operator*(const Array1D&v)const;Array1D operator*(const Array1D&v)const;Array1D&operator+=(const T&x);Array1D&operator+=(const T&x);Array1D&Array1D&ReSize(intReSize(int szsz););private:private:intint size;size;T*e
12、lement;/1D array T*element;/1D array;Sahniarray1d.hCode from the book:Sartaj Sahni,Data Structures,Algorithms,and Applications in C+后面有后面有大字版本大字版本5.2 数组的顺序表示和实现数组的顺序表示和实现templateclass Array1D friend ostream&operator (ostream&,const Array1D&);public:Array1D(int size=0);Array1D(const Array1D&v);/copy
13、constructor Array1D()delete element;T&operator(int i)const;int Size()return size;Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现templateclass Array1D.Array1D&operator=(const Array1D&v);Array1D operator+()const;/unary+Array1D operator+(const Array1D&v)const;Array1D operator-()const;/unary minus Array1D operat
14、or-(const Array1D&v)const;Array1D operator*(const Array1D&v)const;Array1D&operator+=(const T&x);Array1D&ReSize(int sz);private:int size;T*element;/1D array;Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.template2.2.Array1D:Array1D(int sz)3.3./Constructor for one-dimensional arrays.4.4.if(sz 0)throw BadIn
15、itializers();5.5.size=sz;6.6.element=new Tsz;7.7.Sahniarray1d.h构造函数5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.template2.2.Array1D:Array1D(const Array1D&v)3.3./Copy constructor for one-dimensional arrays.4.4.size=v.size;5.5.element=new Tsize;/get space6.6.for(int i=0;i size;i+)/copy elements7.7.elementi=v.elementi;
16、8.8.Sahniarray1d.h构造函数5.2 数组的顺序表示和实现数组的顺序表示和实现重载 1.1.template2.2.T&Array1D:operator(int i)const3.3./Return reference to element i.4.4.if(i=size)throw OutOfBounds();5.5.return elementi;6.6.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现重载重载 赋值运算赋值运算1.1.templatetemplate2.2.Array1D&Array1D:operator=(const Array
17、1D&v)Array1D&Array1D:operator=(const Array1D&v)3.3./Overload assignment operator./Overload assignment operator.4.4.if(this!=&v)/not self-assignment if(this!=&v)/not self-assignment5.5.size=size=v.sizev.size;6.6.delete element;/free old space delete element;/free old space7.7.element=new element=new
18、TsizeTsize;/get right amount;/get right amount8.8.for(for(intint i=0;i size;i+)/copy elements i=0;i size;i+)/copy elements9.9.elementielementi=v.elementiv.elementi;10.10./if /if11.11.return*this;return*this;12.12.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.templatetemplate2.2.Array1D Array1D:Array1D A
19、rray1D:3.3.operator+(constoperator+(const Array1D&v)const Array1D&v)const4.4./Return w=(*this)+v./Return w=(*this)+v.5.5.if(size!=if(size!=v.sizev.size)throw)throw SizeMismatchSizeMismatch();();6.6./create result array w /create result array w7.7.Array1D Array1D w(sizew(size););8.8.for(for(intint i=
20、0;i size;i+)i=0;i size;i+)9.9.w.elementiw.elementi=elementielementi+v.elementiv.elementi;10.10.return w;return w;11.11.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.templatetemplate2.2.Array1D Array1D:Array1D Array1D:3.3.operator-(const Array1D&v)const operator-(const Array1D&v)const4.4./Return w=(*this
21、)-v./Return w=(*this)-v.5.5.if(size!=if(size!=v.sizev.size)throw)throw SizeMismatchSizeMismatch();();6.6./create result array w /create result array w7.7.Array1D Array1D w(sizew(size););8.8.for(for(intint i=0;i size;i+)i=0;i size;i+)9.9.w.elementiw.elementi=elementielementi-v.elementiv.elementi;10.1
22、0.return w;return w;11.11.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.template2.2.Array1D Array1D:operator-()const3.3./Return w=-(*this).4.4./create result array w5.5.Array1D w(size);6.6.for(int i=0;i size;i+)7.7.w.elementi=-elementi;8.8.return w;9.9.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.templatet
23、emplate2.2.Array1D Array1D:operator*(const Array1D&v)Array1D Array1D:operator*(const Array1D&v)constconst3.3./Return w=(*this)*v./Return w=(*this)*v.PairwisePairwise multiply.multiply.4.4.if(size!=if(size!=v.sizev.size)throw)throw SizeMismatchSizeMismatch();();5.5./create result array w /create resu
24、lt array w6.6.Array1D Array1D w(sizew(size););7.7.for(for(intint i=0;i size;i+)i=0;i size;i+)8.8.w.elementiw.elementi=elementielementi*v.elementiv.elementi;9.9.return w;return w;10.10.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.template2.2.Array1D&Array1D:operator+=(const T&x)3.3./Add x to each elemen
25、t of(*this).4.4.for(int i=0;i size;i+)5.5.elementi+=x;6.6.return*this;7.7.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.template2.2.ostream&operator(ostream&out,3.3.const Array1D&x)4.4./Put the elements of x into the stream out.5.5.for(int i=0;i x.size;i+)6.6.out x.elementi ;7.7.return out;8.8.Sahniarra
26、y1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1.template2.2.Array1D&Array1D:ReSize(int sz)3.3./Change the size to sz.4.4./Do not copy array elements to new space.5.5.if(sz 0)throw BadInitializers();6.6.delete element;7.7.size=sz;8.8.element=new T size;9.9.return*this;10.10.Sahniarray1d.h5.2 数组的顺序表示和实现数组的顺序表示和实现1.1
27、.#include#include 2.2.#include array1d.h#include array1d.h3.3.void void main(voidmain(void)4.4.try try 5.5.Array1D Array1D X(10),Y,Z;X(10),Y,Z;6.6.for(for(intint i=0;i 10;i+)i=0;i 10;i+)XiXi=i;=i;7.7.coutcout X3=X3 X3=X3 endlendl;8.8.coutcout X is X X is X endlendl;9.9.Y=X;Y=X;coutcout Y is Y Y is Y
28、 endlendl;10.10.X+=2;X+=2;coutcout X incremented by 2 is X X incremented by 2 is X endlendl;11.11.Z=(Y+X)*Y;Z=(Y+X)*Y;12.12.coutcout (Y+X)*Y is Z (Y+X)*Y is Z endlendl;13.13.coutcout -(Y+X)*Y is -Z -(Y+X)*Y is -Z endlendl;14.14.15.15.catch(.)catch(.)16.16.cerrcerr An exception has occurred An except
29、ion has occurred endlendl;17.17.Sahniarray1d.cpp5.2 数组的顺序表示和实现数组的顺序表示和实现SahniSahni书一维数组实现的代码:书一维数组实现的代码:codecode增加了增加了C+C+一般数组中缺乏的数组下标检验,数组整体的一般数组中缺乏的数组下标检验,数组整体的输出,赋值,算术运算等功能。输出,赋值,算术运算等功能。复杂性:复杂性:n n构造和析构构造和析构 n n (1)(1),如果,如果T T是是C+C+内部数据类型内部数据类型n n (size)(size),如果,如果T T是用户定义的类是用户定义的类n n下标下标 ,(1)
30、(1)n n其它,其它,O(size)O(size)Sahni5.2 数组的顺序表示和实现数组的顺序表示和实现类似地,可以定义类似地,可以定义二维数组二维数组。Sahni5.2 数组的顺序表示和实现数组的顺序表示和实现教材上有任意维数组实现的例子数组:A维数:dim各维长度(界):bounds则Ai0,i1,idim-1的地址为:A首地址+idim-1+idim-2*boundsdim-1+i1*boundsdim-1*bounds2+i0*boundsdim-1*bounds2*bounds15.2 数组的顺序表示和实现数组的顺序表示和实现一般性的问题:二维数组A,每个元素占字节数b,元素A
31、i1j1 地址为a1,Ai2j2地址为a2,则Ai3j3的地址是?行优先/列优先?5.2 数组的顺序表示和实现数组的顺序表示和实现n n用用vectorvector表示矩阵表示矩阵vector vector vectorvector matrix;matrix;template template class matrixclass matrixpublic:public:matrix(int numRows=1,int numCols=1,const T&initVal=T();matrix(int numRows=1,int numCols=1,const T&initVal=T();vec
32、tor&operator(vector&operator(intint i);i);const vector&const vector&operator(intoperator(int i)const;i)const;intint rows()const;rows()const;intint cols()const;cols()const;void void resize(intresize(int numRowsnumRows,intint numColsnumCols););private:private:intint nRowsnRows,nColsnCols;vectorvectorv
33、ectorvector mat;mat;5.2 数组的顺序表示和实现数组的顺序表示和实现template matrix:matrix(int numRows,int numCols,const T&initVal):nRows(numRows),nCols(numCols),mat(numRows,vector(numCols,initVal)5.2 数组的顺序表示和实现数组的顺序表示和实现template template Tvector&matrix:operator(vector&matrix:operator(intint i)i)if(i=if(i=nRowsnRows)throw
34、throw indexRangeErrorindexRangeError(matrix:invalid row index,i,(matrix:invalid row index,i,nRowsnRows););return return matimati;template template Tconst vector&matrix:operator(const vector&matrix:operator(intint i)const i)const if(i=if(i=nRowsnRows)throw throw indexRangeError(matrixindexRangeError(
35、matrix:invalid row index,i,:invalid row index,i,nRowsnRows););return return matimati;5.2 数组的顺序表示和实现数组的顺序表示和实现template template Tintint matrix:rows()const matrix:rows()const return return nRowsnRows;template template Tintint matrix:cols()const matrix:cols()const return return nColsnCols;5.2 数组的顺序表示和实
36、现数组的顺序表示和实现template template Tvoid matrix:void matrix:resize(intresize(int numRowsnumRows,intint numColsnumCols)intint i;i;/handle case of no size change with a return /handle case of no size change with a return if(if(numRowsnumRows=nRowsnRows&numColsnumCols=nColsnCols)return;)return;/assign the ne
37、w matrix size /assign the new matrix size nRowsnRows=numRowsnumRows;nColsnCols=numColsnumCols;/resize to /resize to nRowsnRows rows rows mat.resize(nRowsmat.resize(nRows););/resize each row to have /resize each row to have nColsnCols columns columns for(i=0;i for(i=0;i nRowsnRows;i+);i+)mati.resize(
38、nColsmati.resize(nCols););5.3 矩阵的压缩存储矩阵的压缩存储n n5.3.1 特殊矩阵的压缩存储方法n n5.3.2 稀疏矩阵的压缩存储方法5.3.1 特殊矩阵的压缩存储方法特殊矩阵的压缩存储方法n n1.1.对称矩阵对称矩阵ai,jai,j=aj,iaj,i 1=1=i,j i,j=n=ji=jk=i(i-1)/2+j-1k=i(i-1)/2+j-1ijijk=j(j-1)/2+i-1k=j(j-1)/2+i-15.3.1 特殊矩阵的压缩存储方法特殊矩阵的压缩存储方法n n2.2.三角矩阵三角矩阵上三角矩阵中上三角矩阵中aijaij和和saksak 之间的对应关系
39、之间的对应关系K=?K=?5.3.1 特殊矩阵的压缩存储方法特殊矩阵的压缩存储方法n n3.3.对角矩阵对角矩阵:若若n n阶方阵中的非零值元都集中在以阶方阵中的非零值元都集中在以主对角线为中心的主对角线为中心的(由由k k条对角线组成的条对角线组成的)带状区域带状区域中,则称为中,则称为k k对角矩阵。对角矩阵。K=K=f(i,jf(i,j),f=?),f=?5.3.1 特殊矩阵的压缩存储方法特殊矩阵的压缩存储方法由于特殊矩阵中的非零值元素在矩阵中的分布有着由于特殊矩阵中的非零值元素在矩阵中的分布有着一定的规律,则可将这些非零值元连续存储在一一定的规律,则可将这些非零值元连续存储在一个一维数
40、组中。即矩阵中的任何一个元和它们在个一维数组中。即矩阵中的任何一个元和它们在一维数组中的位置之间存在着某种一维数组中的位置之间存在着某种 转换关系转换关系,并且这种转换关系可以用数学公式表示之。并且这种转换关系可以用数学公式表示之。5.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法n n如果矩阵中只有少量的非零值元,并且这些非零值元在矩阵中的分布没有一定规律,则称为随机稀疏矩阵,简称为稀疏矩阵(Sparse matrix)。至于矩阵中究竟含多少个零值元才被称为是稀疏矩阵,一般没有一个确切的定义。假设在 m*n 的矩阵中有 t 个非零值元,称=t/(m*n)为矩阵的稀疏因子,通常认定0.0
41、5的矩阵为稀疏矩阵。5.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法一、三元组顺序表一、三元组顺序表const MAXTERMS=12500;const MAXTERMS=12500;/假设非零元个数的最大值为假设非零元个数的最大值为1250012500typedeftypedef structstruct intint i,j;i,j;/该非零元的行号和列号该非零元的行号和列号ElemTypeElemType e;e;/该非零元的值该非零元的值 Triple;Triple;/三元组三元组typedeftypedef structstruct Triple Triple dataMAX
42、TERMSdataMAXTERMS+1;/+1;/非零元三元组表,非零元三元组表,data0 data0 未用未用intint rows,cols,terms;rows,cols,terms;/矩阵的行数、列数和非零元的个数矩阵的行数、列数和非零元的个数 TSMatrixTSMatrix;/三元组顺序表三元组顺序表在在在在datadata域中表示非零元的三元组是以行序为主序顺序排列的,这域中表示非零元的三元组是以行序为主序顺序排列的,这域中表示非零元的三元组是以行序为主序顺序排列的,这域中表示非零元的三元组是以行序为主序顺序排列的,这将有利于进行某些矩阵运算。将有利于进行某些矩阵运算。将有利于
43、进行某些矩阵运算。将有利于进行某些矩阵运算。5.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法三元组顺序表示例:转置运算b.dataije13-3161521122518319342446-76314a.dataije121213931-3361443245218611564-7?5.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法Status Status TransposeSMatrixTransposeSMatrix(const(const TSMatrixTSMatrix&M,&M,TSMatrixTSMatrix&T)&T)/采用三元组表存储表示,求稀疏矩阵采用三元组表存储
44、表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵MM的转置矩阵的转置矩阵的转置矩阵的转置矩阵T T T.rowsT.rows=M.colsM.cols;T.colsT.cols=M.rowsM.rows;T.termsT.terms=M.termsM.terms;if(0 if(0 T.termsT.terms)q=1;q=1;for(for(colcol=1;=1;colcol=M.colsM.cols;colcol+)+)for(p=1;p=for(p=1;p=M.termsM.terms;p+);p+)if(M.datap.jif(M.datap.j=co
45、lcol)T.dataq.iT.dataq.i=M.datap.jM.datap.j;T.dataq.jT.dataq.j=M.datap.iM.datap.i;T.dataq.eT.dataq.e=M.datap.eM.datap.e;q+;q+;return OK;return OK;/TransposeSMtrixTransposeSMtrix后面有后面有大字版本大字版本5.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法Status Status TransposeSMatrixTransposeSMatrix(TSMatrixTSMatrix M,M,TSMatrixTSMatr
46、ix&T)&T)/采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵MM的转置矩阵的转置矩阵的转置矩阵的转置矩阵T T T.rowsT.rows=M.colsM.cols;T.colsT.cols=M.rowsM.rows;T.termsT.terms=M.termsM.terms;if(0 if(0 T.termsT.terms)q=1;q=1;for(for(colcol=1;=1;colcol=M.colsM.cols;colcol+)+)/code in next page/code in next page
47、 return OK;return OK;/TransposeSMtrixTransposeSMtrix5.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法Status Status TransposeSMatrixTransposeSMatrix(TSMatrixTSMatrix M,M,TSMatrixTSMatrix&T)&T)/采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵MM的转置矩阵的转置矩阵的转置矩阵的转置矩阵T T for(for(colcol=1;=1;colcol=M.colsM.cols
48、;colcol+)+)for(p=1;p=for(p=1;p=M.termsM.terms;p+);p+)if(M.datap.jif(M.datap.j=colcol)T.dataq.iT.dataq.i=M.datap.jM.datap.j;T.dataq.jT.dataq.j=M.datap.iM.datap.i;T.dataq.eT.dataq.e=M.datap.eM.datap.e;q+;q+;/TransposeSMtrixTransposeSMtrix其时间复杂度为O(cols*terms)当稀疏因子接近1时,为O(rows*cols2)如何修改使其时间复杂度为O(rows*c
49、ols)教材P100,算法5.25.3.2 稀疏矩阵的压缩存储方法稀疏矩阵的压缩存储方法n n快速转置快速转置Status Status FastTransposeSMatrix(constFastTransposeSMatrix(const TSMatrixTSMatrix&M,&M,TSMatrixTSMatrix&T)&T)T.rowsT.rows=M.colsM.cols;T.colsT.cols=M.rowsM.rows;T.termsT.terms=M.termsM.terms;if(0 if(0 T.termsT.terms)for(colfor(col=1;col=1;col=
50、M.cols;colM.cols;col+)+)numcolnumcol=0;=0;for(tfor(t=1;t=1;t=M.terms;tM.terms;t+)+)numM.datat.jnumM.datat.j+;+;cpot1=1;cpot1=1;for(colfor(col=2;col=2;col=Mu.col;colMu.col;col+)+)cpotcolcpotcol=cpotcol-1+numcol-1;=cpotcol-1+numcol-1;/q=1;/q=1;/for(/for(colcol=1;=1;colcol=M.colsM.cols;colcol+)+)for(p=