稀疏矩阵相乘三元组
更新时间:2024-05-30 19:50:01 阅读量: 综合文库 文档下载
稀疏矩阵相乘(三元组)
# include <stdio.h> # include <stdlib.h> # define NULL 0 # define OK 1 # define ERROR 0
# define MAXSIZE 100 /* 矩阵中非零元的最大值 */
# define MAXRC 10 /* 矩阵的最大行值 */
typedef int status ;
/********** 稀疏矩阵的行逻辑链接的顺序表存储表示 **********/
typedef struct /* 非零元的三元组 */ {
int i, j ; /* 非零元的行下标和列下标 */ int e ;
}Triple;
typedef struct /* 稀疏矩阵的行逻辑链接的顺序表 */ {
Triple data[MAXSIZE+1]; /* 非零三元组表,data[0]未用,以下定义的数组都是从1开始 */
int rpos[MAXRC+1]; /* 代表各行第一个非零元的序号表,其值为data的下标 */
int mu,nu,tu; /* 矩阵的行数、列数、非零元的个数 */ }RLSMatrix; /* R:row L:logic S:sequence */
/********* 基本操作的函数原型的声明 *********/
status CreateSMatrix_RL(RLSMatrix *matrix); // 创建一个稀疏矩阵;
// 输入行数、列数,支持乱序输入三元组,并计数;
// 以行为主序进行重新排列,并记录每行起始位置于matrix->rpos[row]; // 若非零元超过 MAXSIZE或行数超过MAXRC,则返回ERROR,否则OK;
void PrintSMatrix_RL(RLSMatrix *matrix);
// 输入矩阵,打印出矩阵的行数、列数、非零元个数,以及整个矩阵;
status MultSMatrix_RL(RLSMatrix *M,RLSMatrix *N,RLSMatrix * Q);
// 输入两个稀疏矩阵M和N,并初始化Q,然后计算M*N的值赋给Q;
// 如果M->mu!=N->nu或列数大于MAXRC或者计算出的非零元个数大于MAXSIZE,都返回ERROR,否则OK; // 计算过程如下:
// 1. 由于矩阵M和Q的行数相等并且C语言以行为主序进行存储,所以以M进行逐行的扫描。
// 2. 使Q的此行逻辑表的序号等于其非零元个数Q.tu+1,以表示其行的首个元素的序号。
// 3. 从行中找到M的非零元,并以它的列值为N的行号,对N进行行的扫描,若存在,则依次计算它们,并把其值累加到一个以N中这个对应非零元的列值为序号的临时数组ctemp[ccol]中。
// 4. 在M的当前行完成扫描后,将ctemp[ccol]不为0的值,压入到Q矩阵的三元组,累加++Q.tu,若Q.tu大于了MAXSIZE,这返回ERROR。
/************ main( ) 函数对矩阵乘法的实现 ************/ void main() {
RLSMatrix * M,* N,* Q;
if(!(M=(RLSMatrix *)malloc(sizeof(RLSMatrix)))) exit(ERROR);
if(!(N=(RLSMatrix *)malloc(sizeof(RLSMatrix)))) exit(ERROR);
if(!(Q=(RLSMatrix *)malloc(sizeof(RLSMatrix)))) exit(ERROR);
CreateSMatrix_RL(M); PrintSMatrix_RL
(M); /* 打印出M */ CreateSMatrix_RL(N);
printf("\\n矩阵N:\\n");
PrintSMatrix_RL(N); /* 打印出N */ if(M->mu!=N->nu)
printf("M的行数与N的列数不匹配\\n"); else {
printf("\\n\\n\\n M * N :\\n");
PrintSMatrix_RL(Q); /* 计算结果 */ } }
/*********** 基本操作的算法描述 ****************/
status CreateSMatrix_RL(RLSMatrix *matrix) // 创建一个稀疏矩阵;
// 输入行数、列数,支持乱序输入三元组,并计数; {
int num=0,p,q,min,temp; // 中间变量; int row;
printf("请输入总行数和列数:\\n");
scanf("%d%d",&matrix->mu,&matrix->nu); // 输入行数、列数;
if(matrix->mu>MAXRC) return ERROR;
printf("行 列 元\\n");
scanf("%d%d%d",&matrix->data[num+1].i,&matrix->data[num+1].j,&matrix->data[num+1].e);
while(matrix->data[num+1].i) // 乱序输入三元组; {
if(++num>MAXSIZE) return ERROR;
scanf("%d%d%d",&matrix->data[num+1].i,&matrix->data[num+1].j,&matrix->data[num+1].e); }
matrix->tu=num; // num的值即为此矩阵的非零元个数; for(p=1;p<=matrix->tu-1;++p) // 按行为主序依次重新排列非零元 {
min=p; // 使较小的行数、列数的元的序号min为当前值p; for(q=p+1;q<=matrix->tu;++q) // 开始依次比较; {
if(matrix->data[min].i>matrix->data[q].i||(matrix->data[min].i==matrix->data[q].i&&matrix->data[min].j>matrix->data[q].j))
min=q; // 在乱序的三元表中,始终保证min是较小的行列数的序号 }
temp=matrix->data[min].i; // 交换行值; matrix->data[min].i=matrix->data[p].i; matrix->data[p].i=temp;
temp=matrix->data[min].j; // 交换列值; matrix->data[min].j=matrix->data[p].j; matrix->data[p].j=temp;
temp=matrix->data[min].e; // 交换元素值; matrix->data[min].e=matrix->data[p].e; matrix->data[p].e=temp; }
for(row=1,num=0;row<=matrix->mu;++row) // 记录matrix->rpos[row];
{
matrix->rpos[row]=num+1;
while(matrix->data[num+1].i==row) ++num; }
return OK; }
// 时间复杂度分析:
// 1. 输入非零元:O(tu); 2. 重新排列(最坏情况下);O(tu*
(tu-1)) ; 3. 记录行逻辑表:O(mu) void PrintSMatrix_RL(RLSMatrix *matrix)
// 输入矩阵,打印出矩阵的行数、列数、非零元个数,以及整个矩阵; {
int row,col; int num=0; printf("\\n行:%d 列:%d 元素值:%d\\n",matrix->mu,matrix->nu,matrix->tu); for(row=1;row<=matrix->mu;++row) {
for(col=1;col<=matrix->nu;++col) {
if(num+1<=matrix->tu&&matrix->data[num+1].i==row&&matrix->data[num+1].j==col) {
++num;
printf("M",matrix->data[num].e); /* 当扫描到非零元的行列值与之相等时,输出其值 */ } else
printf("M",NULL); /* 没有非零元的地方补0 */ }
printf("\\n"); /* 每行输入完毕后,换行 */ } }
// 时间复杂度:O(mu*nu).
status MultSMatrix_RL(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q)
// 输入两个稀疏矩阵M和N,并初始化Q,然后计算M*N的值赋给Q
{
int arow,brow,ccol;
int * ctemp; /* 以N的列值为序号的临时数组 */ int tp,p,tq,q; /* 中间变量 */ if(M->nu!=N->mu) return ERROR;
Q->mu=M->mu; /* 初始化Q */ Q->nu=N->nu; Q->tu=0;
if(!(ctemp=(int *)malloc((N->nu+1)*sizeof(int)))) /* 动态建立累加器 */ exit(ERROR);
if(M->tu*N->tu!=0) /* Q是非零矩阵 */ {
for(arow=1;arow<=M->mu;++arow) /* 逐行扫描 */ {
for(ccol=1;ccol<=N->nu;++ccol)
ctemp[ccol]=0; /* 初始化累加器 */ Q->rpos[arow]=Q->tu+1; if(arow<M->mu)
tp=M->rpos[arow+1]; /* tp是M下一行的序号 */ else
tp=M->tu+1;
for(p=M->rpos[arow];p<tp;++p) /* 从M的当前行找到元素 */ {
brow=M->data[p].j; /* 对应元在N中的行号 */ if(brow<N->mu)
tq=N->rpos[brow+1]; /* tq是N下一行的行号 */ else
tq=N->tu+1;
for(q=N->rpos[brow];q<tq;++q) /* 以M的对应元的列号为N的行号进行扫描 */ {
ccol=N->data[q].j;
/* 提取对应元的列号 */ ctemp[ccol]+=M->data[p].e*N->data[q].e;
/* 两个对应元的值相乘并累加到以列号为序号的累加器中 */ } }
for(ccol=1;ccol<=Q->nu;++ccol) /* 将此行非零元压缩入Q中 */ {
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; }
// 时间复杂度:O(M->mu*(N->nu+M->nu*N->nu+N->nu));
{
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; }
// 时间复杂度:O(M->mu*(N->nu+M->nu*N->nu+N->nu));
正在阅读:
稀疏矩阵相乘三元组05-30
教学常规检查情况小结07-31
苏轼黄州词的艺术成就09-26
施工现场交叉作业安全专项施工方案07-07
语文s版五年级下册第四单元同步练习01-27
秋天的怀念教学反思02-21
鲁教版初中六年级上册数学第四单元第三节练习题1 - 图文04-23
体育《原地双手胸前传接球》试讲稿02-23
工程施工企业成本核算06-11
影响二语习得效果的学习者个体差异研究04-18
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 三元
- 相乘
- 稀疏
- 矩阵
- 拆除班组协议书
- 2018-2023年中国茶多酚行业竞争现状及投资前景预测报告(目录)
- 中学班主任开学第一周工作计划参考
- 2012上半年“双千”总结
- 证券投资资产配置决策探究
- 综合目标责任书考核汇报
- 美的集团多元化发展分析开题报告
- 公需科目“一带一路”全题库
- 浅析私营企业期间费用控制存在的问题及对策
- 未签定劳动合同补偿案例分析
- 机械CADCAM试题(期末)
- 正丁烷法顺酐现状及发展
- 宁夏六盘山高级中学2017-2018学年高三第五次模拟考试文综地理试
- 辽宁省沈阳二中2014-2015学年高一下学期期末考试 物理
- 开发农村社区妇女人力资源促进社会和谐发展 doc
- 高中语文散文部分第4单元如真似幻的梦境森林中的绅士试题新人教
- 1#职工宿舍(09—10年)甘肃崇信实验台帐 - 图文
- 八年级物理反馈练习卷2014
- 雨、污水管道改迁专项施工方案 - 图文
- 2016工程咨询继续教育考试(PPP政策解析及制度建设试卷)117分