首页 新闻 会员 周边

c语言:两个数组相乘的问题

0
悬赏园豆:20 [已解决问题] 解决于 2015-07-07 17:05
#include
#include
#define OK 1
#define ERROR 0
#define MAXSIZE 100 //最多非0元素的个数
#define MAXR 50 //rpos所能处理的最大行数
#define MAXC 50 //系数矩阵相乘时,保留临时列结果的数组temp[MAXC]
typedef struct NODE{ //定义稀疏矩阵结点

int i;

int j;

int data;
} Node;
typedef struct MATRIX{ //定义稀疏矩阵(可以快速访问)

int mu, nu, tu;

Node matrix[MAXSIZE+1];

int rpos[MAXR+1];
} Matrix;
int CreatSMatrix( Matrix* M ); //创建一个矩阵(由用户输入原始矩阵,转化为稀疏矩阵方式储存)
int Print( Matrix M ); //打印一个稀疏矩阵
int Mul_SMatrix( Matrix M, Matrix N, Matrix *Q); //两个稀疏矩阵相乘
main(){

Matrix A1, A2, A3; //定义矩阵

CreatSMatrix( &A1 );

CreatSMatrix( &A2 );
if( A1.nu==A2.mu ){ //判断能否相乘

Mul_SMatrix( A1, A2, &A3 );

printf("两矩阵相乘得:\n"); Print(A3);

}
else printf("两矩阵不能相乘");

system("pause");

return 0;
}
//稀疏矩阵相乘
int Mul_SMatrix( Matrix M, Matrix N, Matrix *Q)
{
int i,Mj;
int arow, Mlim, Nlim, Mcol, Nrow;
int ctemp[MAXC];
Q->tu=0;
//初始化Q
Q->mu=M.mu; Q->nu=M.nu;
if(M.tu*N.tu!=0){
//非零矩阵 
for(arow=1; arow<=M.mu; arow++){

for(i=1; i<=M.nu; i++)//清空累加器

ctemp[i]=0;

Q->rpos[arow]=Q->tu+1; //给Q->rpos[]数组赋值

Mlim = arow //M中第arow行在结点数组中的范围 
for( Mcol=M.rpos[arow]; Mcol //遍历M中第arow行的每一个j 
Mj=M.matrix[Mcol].j; 
Nlim = Mj for( Nrow=N.rpos[Mj]; Nrow ctemp[N.matrix[Nrow].j] += M.matrix[Mcol].data * N.matrix[Nrow].data; 
} 
for(i=1; inu; i++){//列号对应元素不为零,赋值

if( ctemp[i] ){

if( ++Q->tu > MAXSIZE )

return 0;

Q->matrix[Q->tu].i = arow;

Q->matrix[Q->tu].j = i;

Q->matrix[Q->tu].data = ctemp[i];

}

}
}
}
return 1;
}
//构建稀疏矩阵
int CreatSMatrix( Matrix* M ){

int temp, i,j;

printf("输入矩阵的行列数:");

scanf("%d%d", &M->mu, &M->nu);

M->tu=0;

printf("按行序输入矩阵:\n");

for( i=1; i<=M->mu; i++){

M->rpos[i]=M->tu+1; //每计算完一行,给rpos[]赋值

for( j=1; j<=M->nu; j++){

scanf("%d",&temp );

if( temp ){ //非0值保存

M->matrix[M->tu+1].i= i;

M->matrix[M->tu+1].j= j;

M->matrix[M->tu+1].data=temp;

M->tu++;

}

}

}

return OK;
}
//打印稀疏矩阵
int Print( Matrix M){
int i;
if(M.tu==0){ 
printf("空矩阵\n\n"); 
return ERROR;
}
printf("i\tj\tdata\n");
for( i=1; i<=M.tu; i++ ) 
printf("%d\t%d\t%d\n", M.matrix[i].i,M.matrix[i].j,M.matrix[i].data);
return OK;
}

int rpos[MAXR+1]这个是干啥用的啊?

奈何桥下的主页 奈何桥下 | 初学一级 | 园豆:3
提问于:2015-07-07 16:54
< >
分享
最佳答案
0

rpos[i]用于存储矩阵M的第i行的行号(第几行),并且这个下标是i+1;
由于数组是从0开始的,对于一个n行的矩阵,它的第1行存在数组里的下标是0;
这个程序就写成第一行下标就是1,第二行下标就是2,并且将这些下标存在一个数组里

收获园豆:20
请叫我头头哥 | 大侠五级 |园豆:9382 | 2015-07-07 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册