数据结构+课程设计+稀疏矩阵的操作(2)

2018-12-19 21:42

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


数据结构+课程设计+稀疏矩阵的操作(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电大《公共政策概论》(新版)形成性考核册参考答案4(新)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: