cpos为存放每列的第一个非零元素的地址,temp为中间变量对cpos对初始化,判断初值为0则为cpos赋值,然后进行转置。
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */ int i,m,*cpos,*temp,k=0; T->mu=M.nu; T->nu=M.mu; T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int)); if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int)); if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */ *(cpos+1)=0;
for(i=1;i<=M.nu;i++) {
for(m=1;m<=M.tu;m++) {
if(M.data[m].j==i) k++;
}
temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */ if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */ {T->data[*(cpos+M.data[i].j)].i=M.data[i].j; T->data[*(cpos+M.data[i].j)].j=M.data[i].i; T->data[*(cpos+M.data[i].j)].e=M.data[i].e; (*(cpos+M.data[i].j))++;} free(cpos); }
7.3矩阵的相乘
设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元。
定义Qe为矩阵Q的临时数组,矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0,结果累加到Qe,*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零,当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素,M的第
i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j。
multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T) {
int i,j,Qn=0; int *Qe;
if(M.nu!=N.mu)
{printf(\两矩阵无法相乘\ T->mu=M.mu;
T->nu=N.nu;
Qe=(int *)malloc(M.mu*N.nu*sizeof(int)); /* Qe为矩阵Q的临时数组*/
for(i=1;i<=M.mu*N.nu;i++)
*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0 */ for(i=1;i<=M.tu;i++) /* 结果累加到Qe */ for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */
for(j=1;j<=N.nu;j++) /*当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素;…… */
if(*(Qe+(i-1)*N.nu+j)!=0) /*……当M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j */
{
Qn++;//非零元个数加一
T->data[Qn].e=*(Qe+(i-1)*N.nu+j); T->data[Qn].i=i; T->data[Qn].j=j; }
free(Qe); T->tu=Qn; return ; }
7.4矩阵的相加
编写一个求两个对称矩阵相加运算的函数。设对称矩阵的数据元素为整数类型,对称矩阵采用压缩存储方法存储,要求和矩阵采用非压缩方法存储。设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元计算各行第一个非零元素在存储数组中的位置,若该行无非零元,则rpos[]值为零。
HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求和函数
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)
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++; }
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).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }
(*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1;
//计算各行第一个非零元素在存储数组中的位置 //若该行无非零元,则rpos[]值为零 }
int num[(*Q).mu+1],row,cpot[(*Q).mu+1]; cpot[1]=1;
for(k=1;k<=(*Q).mu;k++)
num[k]=0;
for(k=1;k<=(*Q).tu;k++) ++num[(*Q).data[k].i];
for(row=2;row<=(*Q).mu;row++)
cpot[row]=cpot[row-1]+num[row-1];
for(row=1;row<=(*Q).mu;row++){ if(cpot[row]<=(*Q).tu) if((*Q).data[cpot[row]].i==row){ }
(*Q).rpos[row]=cpot[row]; }
else (*Q).rpos[row]=0; else (*Q).rpos[row]=0;
8.系统运行结果
图1输入第一个矩阵A