scanf(\ if(m<1||m>M.mu||n<1||n>M.nu)
{printf(\行或列超出范围\
M.data[i].i=m; M.data[i].j=n; M.data[i].e=e;
} return OK;
}
4.3 求矩阵的转置
cpos为存放每列的第一个非零元素的地址,temp为中间变量对cpos对初始化,判断初值为0则为cpos赋值,然后进行转置。
void TransposeSMatrix(RLSMatrix M,RLSMatrix &T) {//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
int q,p;
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { {
T.data[q].i=M.data[p].j;
q=1;
for(int col=1;col<=M.nu;++col) for(p=1;p<=M.tu;++p)
if(M.data[p].j==col)
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++q;
} return ;
}
}//TransposeRLSMatrix
4.4 矩阵的相乘
设置两个数组,分别存储M,N的第一个非零元位置,然后进行进行比较,得出相乘后的新矩阵非零元。
第 7 页 共26页
对于M中的每个元素M.data[p](p=1,2,?,M.tu)找到N中所有满足条件
M.data[p].j=N.data[q].i的元素N.data[q],球的M.data[p],求得M.data[p]和N.data[q]的乘积。乘积矩阵Q中每个元素的值是个累计和,这个乘积M.data[p] X N.data[q]只是Q[i][j]中的一部分,为便于操作,对应每个元素设一累计和的变量,其初置为零,然后扫描数组M,球的相应元素的乘积并累加到适当的求累计和的变量上
int MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) {//求矩阵乘积Q=MxN,采用行逻辑链接存储表示
int arow, tp, p, brow, t, q, ccol; int ctemp[MAXSIZE],num[MAXSIZE]; if(M.nu!=N.mu) return ERROR;
Q.mu=M.mu; Q.nu=N.nu; Q.tu=0; // Q 初始化 for(ccol=1;ccol<=M.nu;++ccol) num[ccol]=0;
for(t=1;t<=M.tu;++t) ++num[M.data[t].j]; //求M中每一列含非零元个数 M.rpos[1]=1;
for(ccol=2;ccol<=M.nu;++ccol)
M.rpos[ccol]=M.rpos[ccol-1]+num[ccol-1];
for(ccol=1;ccol<=N.nu;++ccol) num[ccol]=0;
for(t=1;t<=N.tu;++t) ++num[N.data[t].j]; //求N中每一列含非零元个数 N.rpos[1]=1;
for(ccol=2;ccol<=N.nu;++ccol)
N.rpos[ccol]=N.rpos[ccol-1]+num[ccol-1];
if(M.tu * N.tu != 0) {//Q是非零矩阵
for(arow=1;arow<=M.mu;++arow) {//处理M的每一行
for(ccol=1;ccol<=N.nu;ccol++)
ctemp[ccol]=0; //当前行各元素累加器清零
Q.rpos[arow]=Q.tu+1;
if(arow for(p=M.rpos[arow];p brow=M.data[p].j; //找到对应元在N中的行号 if(brow else {t=N.tu+1;} for(q=N.rpos[brow]; q ccol=N.data[q].j; //乘积元素在Q中列号 第 8 页 共26页 ctemp[ccol]+=M.data[p].e*N.data[q].e; }// for q }// 求得Q中第crow( =arow)行的非零元 for(ccol=1; ccol<=Q.nu; ++ccol) //压缩存储该行非零元 if(ctemp[ccol]) { if(++Q.tu>MAXSIZE) return ERROR; Q.data[Q.tu].i=arow; Q.data[Q.tu].j=ccol; Q.data[Q.tu].e=ctemp[ccol]; }// if }// for arow }// if return OK; }// MultSMatrix 4.5 矩阵的相加 编写一个求两个对称矩阵相加运算的函数。设对称矩阵的数据元素为整数类型,对称矩阵采用压缩存储方法存储,要求和矩阵采用非压缩方法存储。设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元计算各行第一个非零元素在存储数组中的位置,若该行无非零元,则rpos[]值为零。 void HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求和函数 int row; if((*M).mu!=(*N).mu||(*M).nu!=(*N).nu) {printf(\不满足矩阵相加的条件!\ int k=1; triple *p,*q; //设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相 加后的新矩阵非零元 p=&(*M).data[1]; q=&(*N).data[1]; while(p<(*M).data+(*M).tu+1&&q<(*N).data+(*N).tu+1) 第 9 页 共26页 if((*p).i<=(*q).i) if((*p).i<(*q).i){ (*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; } else if((*p).j<=(*q).j) if((*p).j<(*q).j){ (*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; } else { (*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e+(*q).e; k++;p++;q++; } else { (*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; } else { (*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; 第 10 页 共26页 } if(p<=(*M).data+(*M).tu) while(p<=(*M).data+(*M).tu){ (*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; } if(q<=(*N).data+(*N).tu) while(q<=(*N).data+(*N).tu){ (*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1; (*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; } //计算各行第一个非零元素在存储数组中的位置 //若该行无非零元,则rpos[]值为零 for(row=1;row<=(*Q).mu;row++){ if(cpot[row]<=(*Q).tu) if((*Q).data[cpot[row]].i==row){ (*Q).rpos[row]=cpot[row]; for(k=1;k<=(*Q).tu;k++) ++num[(*Q).data[k].i]; int num[MAXROW + 1];int cpot[MAXROW + 1]; num[(*Q).mu+1],row,cpot[(*Q).mu+1]; cpot[1]=1; for(k=1;k<=(*Q).mu;k++) num[k]=0; for(row=2;row<=(*Q).mu;row++) cpot[row]=cpot[row-1]+num[row-1]; 第 11 页 共26页