早教吧作业答案频道 -->其他-->
高手帮忙做下“两个稀疏矩阵相乘Q=M*N过程求精”
题目详情
高手帮忙做下“两个稀疏矩阵相乘Q=M*N过程求精”
▼优质解答
答案和解析
#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);
}
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; arowtu+1; //给Q->rpos[]数组赋值
Mlim = arowtu].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; imu; i++){
M->rpos[i]=M->tu+1; //每计算完一行,给rpos[]赋值
for( j=1; jnu; 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
#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);
}
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; arowtu+1; //给Q->rpos[]数组赋值
Mlim = arowtu].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; imu; i++){
M->rpos[i]=M->tu+1; //每计算完一行,给rpos[]赋值
for( j=1; jnu; 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
看了 高手帮忙做下“两个稀疏矩阵相...的网友还看了以下:
设n阶方阵A满足A^3+2A-3E=0,证明矩阵A可逆,并写出A的逆矩阵的表达式.帮下忙啊,呵呵 2020-04-05 …
所有的人都认为这是件好事:改为反问句:改为双重否定句:and 每个人读了这个故事都会受感动.改为反 2020-05-14 …
如图,从矩形ABCD中的一个顶点C向对角线BD做垂线CE,垂足是E,若BE=3DE,两对角线的交点 2020-05-16 …
八年级矩形几何题,我实在做不出了,哪位可以帮个忙累?已知abcd为矩形,ae平分角bad,cg垂直 2020-05-21 …
需要老外做问卷,请大家帮个忙请老外做调查,路上跑了很多但没什么老外肯做,请大家帮个忙,是一份有关老 2020-06-06 …
九宫格解法…做了好久,找不到规律…哪位高人帮下忙,**9***12**3*********65*7 2020-06-10 …
请大家帮个忙,遇到了难题不会做了,所以找高手帮帮忙,急!三个互不相识的人,初次见面时各自介绍自己的姓 2020-11-27 …
英语翻译他无疑是想帮忙,但是事实上是帮倒忙.(nodoubt)上火车的时候,注意脚下.(分词做状语) 2020-12-05 …
各路英雄路过的帮个忙看看:用神经网络求解TSP问题中权矩阵和偏置电流如何得出?看过一些资料,说是将能 2020-12-31 …
请网友帮下忙!汉译英:1:红白喜事2:黄袍加身3:黄毛丫头4:白做5:黑白不分6:白手...请网友帮 2021-01-12 …