⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 123.txt

📁 稀疏矩阵
💻 TXT
字号:
稀疏矩阵运算问题

作者 : 安庆大学 汤军 2006.06.10
#include   <stdio.h>
#include   <stdlib.h>
#include   "iostream.h"
#define   ERROR -1
#define   OK   1
#define   MAXRC   20
#define   MAXSIZE   1250
typedef   int     ElemType ;
typedef   int     Status   ;

typedef struct {
    int     i,j;
    ElemType   e;
} Triple;

typedef struct {
    Triple data[MAXSIZE+1];
    int   rpos[MAXRC+1];
    int   mu,nu,tu;
    } RLSMatrix;

Status MultSMatrix( RLSMatrix M,RLSMatrix N,RLSMatrix &Q)
{ 
int k,arow,tp,p,brow,t,q,ccol,ctemp[MAXRC+1];
if(M.nu!=N.mu) return ERROR;
Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;
if (M.tu*N.tu!=0)
  { for (arow=1; arow<=M.mu; ++arow) {
    for (k=1;k<=Q.nu;k++) ctemp[k]=0;     
    Q.rpos[arow]=Q.tu+1;
    if (arow<M.mu) tp=M.rpos[arow+1];
      else tp=M.tu+1;
    for(p=M.rpos[arow];p<tp;++p)
      { brow=M.data[p].j;
        if(brow<N.mu) t=N.rpos[brow+1]; 
          else t=N.tu+1;
          for (q=N.rpos[brow]; q<t; ++q) 
            { ccol=N.data[q].j;
            ctemp[ccol]+= M.data[p].e * N.data[q].e;
            }
      }
  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];
        }
  }
  }
  return OK;
}


Status AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &A)
{
int t,c,k;
t=1; c=1; k=1;
while((t<=M.tu) && (c<=N.tu))
    if(M.data[t].i==N.data[c].i)
      if(M.data[t].j<N.data[c].j)
        { A.data[k].i=M.data[t].i;
          A.data[k].j=M.data[t].j;   
          A.data[k].e=M.data[t].e;
          k++;   
          t++;
        }
      else if(M.data[t].j>N.data[c].j)
          { A.data[k].i=N.data[c].i;
            A.data[k].j=N.data[c].j;   
            A.data[k].e=N.data[c].e;
            k++;   
            c++;
          }
          else
            { A.data[k].i=M.data[t].i;
              A.data[k].j=M.data[t].j;   
              A.data[k].e= M.data[t].e + N.data[c].e;
              if(A.data[k].e) k++;
              t++;
              c++;
              }
    else if(M.data[t].i<N.data[c].i)
          { A.data[k].i=M.data[t].i;
            A.data[k].j=M.data[t].j;   
            A.data[k].e=M.data[t].e;
            k++;   
            t++;
          } 
        else 
          {   A.data[k].i=N.data[c].i;
            A.data[k].j=N.data[c].j;   
            A.data[k].e=N.data[c].e;
            k++;   
            c++;
          }
while(t<=M.tu)
    { A.data[k].i=M.data[t].i;
      A.data[k].j=M.data[t].j;   
      A.data[k].e=M.data[t].e;
      k++;   
      t++;
      } 
while(c<=N.tu)
    { A.data[k].i=N.data[c].i;
      A.data[k].j=N.data[c].j;   
      A.data[k].e=N.data[c].e;
      k++;   
      c++;
      }     
A.mu=M.mu;
A.nu=M.nu;
A.tu=k-1;
return OK;
}

Status SubSMatrix(RLSMatrix M,RLSMatrix &N,RLSMatrix &S)
{ int c;
  for(c=1;c<=N.tu;c++)
    N.data[c].e = 0-N.data[c].e;
  AddSMatrix(M,N,S);
  return OK;
}

int CreateRLSMatrix(RLSMatrix &M)
{ int k,t;
printf("please input M.mu,M.nu,M.tu:\n");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu);
printf("please order the hang rule input M:\n");
for(k=1;k<=M.tu;k++)
  { printf("please input di %d ge shu,i j e:\n",k);
    scanf("%d%d%d",&M.data[k].i,&M.data[k].j,&M.data[k].e);
    printf(" M.data[k].i=%d,M.data[k].j=%d,M.data[k].e=%d\n",M.data[k].i,M.data[k].j,M.data[k].e);
    }
printf("please input rpos[]:\n");
for (t=1;t<=M.mu;t++)
  { printf("M.rpos[%d]= ",t);
    scanf("%d",&M.rpos[t]);
    } 
return OK;
}

void Print( RLSMatrix &M)
{ int k,t;/*,c=1;*/
printf("hang shu : %d\nlie shu : %d\nfei lin yuan ge shu : %d\n",M.mu,M.nu,M.tu);

/*for(k=1 ; k<=M.mu ; k++)                     //试试按行列打印????
  { if(k==M.data[c].i)
   { for(t=1;t<=M.nu;t++)
      if(t==M.data[c].j)
       printf(" %d ",M.data[c++].e);
        else printf(" 0 ");
    printf("\n");
    }
    else {
      for(t=1;t<=M.nu;t++) printf(" 0 ");
      printf("\n");
      }
  }*/

  for(k=1;k<=M.tu;k++)
  printf(" M.data[k].i=%d,M.data[k].j=%d,M.data[k].e=%d\n",M.data[k].i,M.data[k].j,M.data[k].e);
  printf("\n");
}


void main()
{ RLSMatrix M,N,Q,A,S;
printf("please input M:\n");
CreateRLSMatrix(M);
printf("M:\n");
Print(M);
printf("please input N:\n");
CreateRLSMatrix(N);
printf("N:\n");
Print(N);
MultSMatrix(M,N,Q);
printf("M * N :\n");
Print(Q);
AddSMatrix(M,N,A);
printf("M + N :\n");
Print(A);
printf("M - N :\n");
SubSMatrix(M,N,S);       //注意N已改变了,请看SubSMatrix()函数!!!
Print(S);   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -