数据结构与算法分析课程设计:稀疏矩阵的应用
1.设计题目与功能需求分析
1.1设计题目
《稀疏矩阵应用》
要求:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。
1.2功能需求分析
(1)设计函数建立稀疏矩阵,初始化值。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。
(4)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。
(5)构造函数进行稀疏矩阵的转置,并输出结果。
(6)退出系统。
2.概要设计
2.1功能模块设计
从系统的功能需求分析,得到系统主要包括以下几大功能模块,分别是建立主函数、创建三元组表、创建矩阵、矩阵相加减、矩阵转置等。其功能模块图如下图所示:
图1 系统功能模块图
2.2模块简介
依据程序的功能模块划分,各模块定义如下:
(1)定义稀疏矩阵框架
模块名:struct OLNode
模块描述:通过此模块可以定义矩阵内部元素类型及指针类型。
(2)创建稀疏矩阵信息
模块名:void Create(CrossList &M)
模块描述:根据文字提示,输入稀疏矩阵的行、列、非零元的全部信息。
(3)输出符合上述步骤中信息的稀疏矩阵
模块名:void Print(CrossList M)
模块描述:以矩阵的显示方式显示稀疏矩阵。
(4)进行稀疏矩阵的加运算
模块名:void Add(CrossList M,CrossList N,CrossList &Q)
模块描述:根据文字提示,如果两个矩阵不是同类型的,程序返回给操作系统的返回码是OVERFLOW;如果两个矩阵是同类型的,相加程序运行。
(5)进行稀疏矩阵的转置运算
模块名:void Trans(CrossList M,CrossList &N)
模块描述:定义结点,扫描矩阵,进行矩阵的转置运算。
(6)进行稀疏矩阵的乘运算
模块名:void Mult(CrossList M,CrossList N,CrossList &Q)
模块描述:判断矩阵M的总列数是否等于矩阵N的总行数,若是,程序运行,否则,提示出错。
3.详细设计
3.1数据结构
本程序采用结构体数组,对稀疏矩阵中非零元素的行、列、值以及指针。
1 struct OLNode 2 { 3 int i,j; 4 ElemType e; 5 OLNode *right,*down; 6 }; 7 typedef OLNode *OLink; 8 struct CrossList 9 { 10 OLink *rhead,*chead; 11 int mu,nu,tu; 12 };
3.2主函数的算法设计
首先显示菜单及运用菜单选择实现相应功能,输入稀疏矩阵行、列以及非零元,系统菜单调用采用while循环,在循环体中用switch语句调用各个功能函数,最后退出程序。
主函数的程序流程图如下图所示:
图2 函数流程图
3.3程序代码实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream.h> 4 #include<process.h> 5 #define OK 1 6 #define ERROR 0 7 #define OVERFLOW -2 8 typedef int ElemType; 9 10 //------------------------------------------------------------------------------------------------ 11 12 struct OLNode 13 { 14 int i,j; //非零元所在行、列 15 ElemType e; //非零元值 16 OLNode *right,*down; //定义向右域和向下域 17 }; 18 19 typedef OLNode *OLink; 20 21 struct CrossList 22 { 23 OLink *rhead,*chead; //行、列表头的头节点 24 int mu,nu,tu; //矩阵的行、列和非零元个数 25 }; 26 27 28 //------------------------------------------------------------------------------------------------ 29 30 31 void Create(CrossList &M) //矩阵的创建 32 { 33 int i,j,k,m,n,t; 34 ElemType e; //用于存放非零元值 35 OLNode *p,*q; 36 printf("Please input the rows 、columns and the values of the matrix:"); 37 scanf("%d%d%d",&m,&n,&t); //输入稀疏矩阵的行、列、非零元个数 38 M.mu=m; //把矩阵的总行数存入M.mu 39 M.nu=n; //把矩阵的总列数存入M.nu 40 M.tu=t; //把矩阵的非零元个数存入M.tu 41 M.rhead=(OLink*)malloc((m+1)*sizeof(OLink)); //给对象M的行分配m+1个结点大小的空间用行头指针M.rhead指向第一个行结点 42 if(!M.rhead) //假如头结点分配成功 43 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 44 M.chead=(OLink*)malloc((n+1)*sizeof(OLink)); //给对象M的列分配n+1个结点大小的空间用列头指针M.chead指向第一个列结点 45 if(!M.chead) //假如头结点分配成功 46 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 47 for(k=1;k<=m;k++) //初始化行头指针 48 M.rhead[k]=NULL; 49 for(k=1;k<=n;k++) //初始化列头指针 50 M.chead[k]=NULL; 51 printf("Please input %d data:\n",M.tu); 52 for(k=0;k<t;k++) 53 { 54 scanf("%d%d%d",&i,&j,&e); //输入t个非零元的信息 55 if(i>m||j>n) //假如输入的元素不在矩阵中 56 { 57 printf("Please input again:\n"); 58 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 59 } 60 else //假如输入的元素在矩阵中 61 { 62 p=(OLNode*)malloc(sizeof(OLNode)); //为p分配一个结点大小的空间 63 if(!p) //假如p不存在 64 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 65 p->i=i; //把非零元的行值赋给p->i 66 p->j=j; //把非零元的列值赋给p->j 67 p->e=e; //把非零元的值赋给p->e 68 if(M.rhead[i]==NULL||M.rhead[i]->j>j) //如果第i行的第一个结点为空或者要插入的非零元的列值小于第i行的第一个结点的列值 69 { 70 //p插入该行第一节点处 71 p->right=M.rhead[i]; //p的向右域指向没有插入前的第i行的第一个结点 72 M.rhead[i]=p; //p指向没有插入前的第i行的第一个结点 73 } 74 else 75 { 76 //否则寻找行表插入位置 77 for(q=M.rhead[i];q->right&&q->right->j<j;q=q->right);//这里的;表示对这个循环不执行任何操作 78 p->right=q->right; //p的右向域指向q的右向域 79 q->right=p; //p指向q的右向域 80 } //完成行插入 81 if(M.chead[j]==NULL||M.chead[j]->i>i) //假如第一个列结点为空或者第j列的第一个结点的行值大于要插入的行值 82 { 83 //p插入该列第一节点处 84 p->down=M.chead[j]; //p的向下域指向没有插入前的第j列的第一个结点 85 M.chead[j]=p; //p指向没有插入前的第j列的第一个结点 86 } //完成列插入 87 else 88 { 89 //否则寻找列表插入位置 90 for(q=M.chead[j];q->down&&q->down->i<i;q=q->down);//这里的;表示对这个循环不执行任何操作 91 p->down=q->down; //p的向下域指向q的向下域 92 q->down=p; //p指向q的向下域 93 } //完成列插入 94 } 95 } 96 } 97 98 99 //------------------------------------------------------------------------------------------------ 100 101 void Print(CrossList M) //矩阵的输出 102 { 103 int i,j,k; 104 OLink p; //定义结点指针p 105 int array[100][100]; //定义二元数组array[100][100] 106 for(i=1;i<=M.mu;i++) //行循环 107 { 108 for(j=1;j<=M.nu;j++) //列循环 109 { 110 array[i][j]=0; //初始化数组所需部分 111 } 112 } 113 for(k=1;k<=M.nu;k++) //将所有非零元的值存入对应的数组中 114 { 115 p=M.rhead[k]; //p指向第k行的第一个结点 116 while(p) 117 { 118 //将第k行的非零元存入数组中 119 array[p->i][p->j]=p->e; //将这个结点的非零元存入数组中 120 p=p->right; //p指向下一个向右域 121 } 122 } 123 for(i=1;i<=M.mu;i++) //行循环 124 { 125 for(j=1;j<=M.nu;j++) //列循环 126 { 127 if(j==M.nu) 128 cout<<array[i][j]<<endl; //如果是行的最后一个结点则换行 129 else 130 cout<<array[i][j]<<" "; //以矩阵的显示方式显示稀疏矩阵 131 } 132 } 133 } 134 135 136 //------------------------------------------------------------------------------------------------ 137 138 139 void Add(CrossList M,CrossList N,CrossList &Q) //矩阵M和矩阵N相加并存入矩阵Q 140 { 141 int i,k; 142 OLink p,pq,pm,pn; 143 OLink *col; 144 if(M.mu!=N.mu||M.nu!=N.nu) //如果两个矩阵不是同类型的 145 { 146 printf("The two matrixes is not of the same type!/n"); 147 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 148 } 149 //对Q进行初始化 150 Q.mu=M.mu; //矩阵Q的总行数和矩阵M的总数相同 151 Q.nu=M.nu; //矩阵Q的总列数和矩阵M的总数相同 152 Q.tu=0; //将矩阵Q的非零元个数初始化为零 153 Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink)); //给对象Q的行分配Q.mu+1个结点大小的空间用行头指针Q.rhead指向第一个行结点 154 if(!Q.rhead) //如果行分配空间成功 155 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 156 Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink)); //给对象Q的列分配Q.nu+1个结点大小的空间用列头指针Q.chead指向第一个列结点 157 if(!Q.chead) //如果列分配空间成功 158 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 159 for(k=1;k<=Q.mu;k++) //初始化行 160 Q.rhead[k]=NULL; 161 for(k=1;k<=Q.nu;k++) //初始化列 162 Q.chead[k]=NULL; 163 col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));//生成指向列的起始节点的指针 164 if(!col) //如果分配空间成功 165 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 166 for(k=1;k<=Q.nu;k++) //赋初始值 167 col[k]=NULL; 168 for(i=1;i<=M.mu;i++) //按行序相加 169 { 170 pm=M.rhead[i]; //pm指向矩阵M的第i行的头结点 171 pn=N.rhead[i]; //pn指向矩阵N的第i行的头结点 172 while(pm&&pn) //如果pm和pn都存在 173 { 174 if(pm->j<pn->j) //矩阵M当前结点的列小于矩阵N当前结点的列 175 { 176 //生成Q的结点 177 p=(OLink)malloc(sizeof(OLNode)); //给p分配一个结点大小的空间 178 if(!p) //如果分配空间不成功 179 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 180 Q.tu++; //矩阵Q的非零元个数加1 181 p->i=i; //把非零元的行赋给p->i 182 p->j=pm->j; //把矩阵M中当前结点列的值赋给p->j 183 p->e=pm->e; //把矩阵M中当前结点的元素值赋给p->e 184 p->right=NULL; //p的向右域为空 185 pm=pm->right; //pm右移 186 } 187 else if(pm->j>pn->j) //矩阵M当前结点的列大于矩阵N当前结点的列 188 { 189 p=(OLink)malloc(sizeof(OLNode));//给p分配一个结点大小的空间 190 if(!p) //如果分配空间不成功 191 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 192 Q.tu++; //矩阵Q的非零元个数加1 193 p->i=i; //把矩阵当前非零元的行赋给p->i 194 p->j=pn->j; //把矩阵N中当前结点列的值赋给p->j 195 p->e=pn->e; //把矩阵N中当前结点的元素值赋给p->e 196 p->right=NULL; //p的向右域为空 197 pn=pn->right; //pn右移 198 } 199 else if(pm->e+pn->e) //M,N当前结点的列相同并且两元素之和非零 200 { 201 p=(OLink)malloc(sizeof(OLNode));//给p分配一个结点大小的空间 202 if(!p) //如果分配空间不成功 203 exit(OVERFLOW); //退出程序,程序返回给操作系统的返回码是OVERFLOW 204 Q.tu++; //矩阵Q的非零元个数加1 205 p->i=i; //把矩阵当前非零元的行赋给p->i 206 p->j=pn->j; //把矩阵当前非零元的列赋给p->j 207 p->e=pm->e+pn->e; //把矩阵M当前非零元的值和矩阵N当前非零元的值相加赋给p->e 208 p->right=NULL; //p的向右域为空 209 pm=pm->right; //pm右移 210 pn=pn->right; //pn右移 211 } 212 else //两元素相加为零 213 { 214 pm=pm->right; //pm右移 215 pn=pn->right; //pn右移 216 continue; //不执行下面的程序,回到循环 217 } 218 if(Q.rhead[i]==NULL) //如果当前行的头结点为空 219 Q.rhead[i]=pq=p; //把p结点中的数据赋给pq结点和结点Q.rhead[i],pq结点用来保存当前的位置 220 else //如果当前的头结点不为空 221 { 222 pq->right=p; //pq的向右域指向p 223 pq=pq->right; //pq指向pq的向右域 224 } //完成行插入 225 if(Q.chead[p->j]==NULL) //如果当前列的头结点为空 226 Q.chead[p->j]=col[p->j]=p; //把p结点中的数据赋给结点col[p->j]和当前列的头结点Q.chead[p->j] 227 else 228 { 229 //如果当前结点不为空,则插入p结点 230 col[p->j]->down=p; 231 col[p->j]=col[p->j]->down; 232 } 233 } 234 while(pm) //如果矩阵M中的结点还没有插完,将矩阵M该行的剩余元素插入矩阵Q 235 { 236 p=(OLink)malloc(sizeof(OLNode)); //给结点p分配空间 237 if(!p) 238 exit(OVERFLOW); 239 Q.tu++; //矩阵非零元个数加1 240 p->i=i; //把当前结点的行、列、和值插入p中 241 p->j=pm->j; 242 p->e=pm->e; 243 p->right=NULL; //p的向右域为空 244 pm=pm->right; //pm右移 245 if(Q.rhead[i]==NULL) //如果当前行头结点为空,直接插入p结点 246 Q.rhead[i]=pq=p; 247 else //如果当前行头结点不为空,插入p结点 248 { 249 pq->right=p; 250 pq=pq->right; 251 } 252 if(Q.chead[p->j]==NULL) //如果当前列头结点为空,直接插入p结点 253 Q.chead[p->j]=col[p->j]=p; 254 else //如果当前列头结点不为空,插入p结点 255 { 256 col[p->j]->down=p; 257 col[p->j]=col[p->j]->down; 258 } 259 } 260 while(pn) //如果矩阵N中的结点还没有插完,将矩阵N该行的剩余元素插入矩阵Q 261 { 262 p=(OLink)malloc(sizeof(OLNode)); //给结点p分配空间 263 if(!p) 264 exit(OVERFLOW); 265 Q.tu++; //矩阵非零元个数加1 266 p->i=i; //把当前结点的行、列、和值插入p中 267 p->j=pn->j; 268 p->e=pn->e; 269 p->right=NULL; //p的向右域为空 270 pn=pn->right; //pn右移 271 if(Q.rhead[i]==NULL) //如果当前行头结点为空,直接插入p结点 272 Q.rhead[i]=pq=p; 273 else //如果当前行头结点不为空,插入p结点 274 { 275 pq->right=p; 276 pq=pq->right; 277 } 278 if(Q.chead[p->j]==NULL) //如果当前列头结点为空,直接插入p结点 279 Q.chead[p->j]=col[p->j]=p; 280 else //如果当前列头结点不为空,插入p结点 281 { 282 col[p->j]->down=p; 283 col[p->j]=col[p->j]->down; 284 } 285 } 286 } 287 for(k=1;k<=Q.nu;k++) //使得每一列的最后一个结点的向下域为空 288 if(col[k]) 289 col[k]->down=NULL; 290 free(col); //释放col的空间 291 } 292 293 //------------------------------------------------------------------------------------------------ 294 295
推荐阅读
-
TopK 算法在大数据重复性数据分析中的应用与挑战
-
探索二叉树、红黑树、递归树、堆和堆排序的数据结构与算法(第四部分),以及堆的实际应用
-
Python和Django打造美食管理与推荐系统:协同过滤算法的实战应用——计算机课程设计项目的优秀选择
-
【摩尔线程+Colossal-AI强强联手】MusaBert登上CLUE榜单TOP10:技术细节揭秘 - 技术实力:摩尔线程凭借"软硬兼备"的技术底蕴,让MusaBert得以从底层优化到顶层。其内置多功能GPU配备AI加速和并行计算模块,提供了全面的AI与科学计算支持,为AI推理和低资源条件下的大模型训练等场景带来了高效、经济且环保的算力。 - 算法层面亮点:依托Colossal-AI AI大模型开发系统,MusaBert在训练过程中展现出了卓越的并行性能与易用性,特别在预处理阶段对DataLoader进行了优化,适应低资源环境高效处理海量数据。同时,通过精细的建模优化、领域内数据增强以及Adan优化器等手段,挖掘和展示了预训练语言模型出色的语义理解潜力。基于MusaBert,摩尔线程自主研发的MusaSim通过对比学习方法微调,结合百万对标注数据,MusaSim在多个任务如语义相似度、意图识别和情绪分析中均表现出色。 - 数据资源丰富:MusaBert除了自家高质量语义相似数据外,还融合了悟道开源200GB数据、CLUE社区80GB数据,以及浪潮公司提供的1TB高质量数据,保证模型即便在较小规模下仍具备良好性能。 当前,MusaBert已成功应用于摩尔线程的智能客服与数字人项目,并广泛服务于语义相似度、情绪识别、阅读理解与声韵识别等领域。为了降低大模型开发和应用难度,MusaBert及其相关高质量模型代码已在Colossal-AI仓库开源,可快速训练优质中文BERT模型。同时,通过摩尔线程与潞晨科技的深度合作,仅需一张多功能GPU单卡便能高效训练MusaBert或更大规模的GPT2模型,显著降低预训练成本,进一步推动双方在低资源大模型训练领域的共享目标。 MusaBert荣登CLUE榜单TOP10,象征着摩尔线程与潞晨科技联合研发团队在中文预训练研究领域的领先地位。展望未来,双方将携手探索更大规模的自然语言模型研究,充分运用上游数据资源,产出更为强大的模型并开源。持续强化在摩尔线程多功能GPU上的大模型训练能力,特别是在消费级显卡等低资源环境下,致力于降低使用大模型训练的门槛与成本,推动人工智能更加普惠。而潞晨科技作为重要合作伙伴,将继续发挥关键作用。
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
理解PHP中的递归函数:探索数据结构与算法的核心应用
-
目标检测与跟踪 AI 算法模型及边缘计算智能分析网关 V4 的算法应用
-
位置隐私保护方法的研究与应用-融合位置和对称加密传输的隐私保护算法及性能分析-结论
-
包婷婷 (201550484)作业一 统计软件简介与数据操作-SPSS(Statistical Product and Service Solutions),"统计产品与服务解决方案"软件。最初软件全称为"(SolutionsStatistical Package for the Social Sciences),但是随着SPSS产品服务领域的扩大和服务深度的增加,SPSS公司已于2000年正式将英文全称更改为"统计产品与服务解决方案",标志着SPSS的战略方向正在做出重大调整。为IBM公司推出的一系列用于统计学分析运算、数据挖掘、预测分析和决策支持任务的软件产品及相关服务的总称SPSS,有Windows和Mac OS X等版本。 1984年SPSS总部首先推出了世界上第一个统计分析软件微机版本SPSS/PC+,开创了SPSS微机系列产品的开发方向,极大地扩充了它的应用范围,并使其能很快地应用于自然科学、技术科学、社会科学的各个领域。世界上许多有影响的报刊杂志纷纷就SPSS的自动统计绘图、数据的深入分析、使用方便、功能齐全等方面给予了高度的评价。 R统计软件介绍 R是一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输出,可实现分支、循环,用户可自定义功能。 与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。 该语言的语法表面上类似 C,但在语义上是函数设计语言(functional programming language)的变种并且和Lisp 以及 APL有很强的兼容性。特别的是,它允许在"语言上计算"(computing on the language)。这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。 R是一个免费的*软件,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免费下载和使用的。在R主页那儿可以下载到R的安装程序、各种外挂程序和文档。在R的安装程序中只包含了8个基础模块,其他外在模块可以通过CRAN获得。 二、R语言 R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个*、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。 R作为一种统计分析软件,是集统计分析与图形显示于一体的。它可以运行于UNIX,Windows和Macintosh的操作系统上,而且嵌入了一个非常方便实用的帮助系统,相比于其他统计分析软件,R还有以下特点: 1.R是*软件。这意味着它是完全免费,开放源代码的。可以在它的网站及其镜像中下载任何有关的安装程序、源代码、程序包及其源代码、文档资料。标准的安装文件身自身就带有许多模块和内嵌统计函数,安装好后可以直接实现许多常用的统计功能。[2] 2.R是一种可编程的语言。作为一个开放的统计编程环境,语法通俗易懂,很容易学会和掌握语言的语法。而且学会之后,我们可以编制自己的函数来扩展现有的语言。这也就是为什么它的更新速度比一般统计软件,如,SPSS,SAS等快得多。大多数最新的统计方法和技术都可以在R中直接得到。[2] 3. 所有R的函数和数据集是保存在程序包里面的。只有当一个包被载入时,它的内容才可以被访问。一些常用、基本的程序包已经被收入了标准安装文件中,随着新的统计分析方法的出现,标准安装文件中所包含的程序包也随着版本的更新而不断变化。在另外版安装文件中,已经包含的程序包有:base一R的基础模块、mle一极大似然估计模块、ts一时间序列分析模块、mva一多元统计分析模块、survival一生存分析模块等等.[2] 4.R具有很强的互动性。除了图形输出是在另外的窗口处,它的输入输出窗口都是在同一个窗口进行的,输入语法中如果出现错误会马上在窗口口中得到提示,对以前输入过的命令有记忆功能,可以随时再现、编辑修改以满足用户的需要。输出的图形可以直接保存为JPG,BMP,PNG等图片格式,还可以直接保存为PDF文件。另外,和其他编程语言和数据库之间有很好的接口。[2] 5.如果加入R的帮助邮件列表一,每天都可能会收到几十份关于R的邮件资讯。可以和全球一流的统计计算方面的专家讨论各种问题,可以说是全世界最大、最前沿的统计学家思维的聚集地.[2] R是基于S语言的一个GNU项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行。 R的语法是来自Scheme。R的使用与S-PLUS有很多类似之处,这两种语言有一定的兼容性。S-PLUS的使用手册,只要稍加修改就可作为R的使用手册。所以有人说:R,是S-PLUS的一个“克隆”。 但是请不要忘了:R是免费的(R is free)。R语言源代码托管在github,具体地址可以看参考资料。[3] 。 R语言的下载可以通过CRAN的镜像来查找。 R语言有域名为.cn的下载地址,有六个,其中两个由Datagurn,由 中国科学技术大学提供的。R语言Windows版,其中由两个下载地点是Datagurn和 USTC提供的。 三、stata Stata 是一套提供其使用者数据分析、数据管理以及绘制专业图表的完整及整合性统计软件。它提供许许多多功能,包含线性混合模型、均衡重复反复及多项式普罗比模式。用Stata绘制的统计图形相当精美。 新版本的STATA采用最具亲和力的窗口接口,使用者自行建立程序时,软件能提供具有直接命令式的语法。Stata提供完整的使用手册,包含统计样本建立、解释、模型与语法、文献等超过一万余页的出版品。 除此之外,Stata软件可以透过网络实时更新每天的最新功能,更可以得知世界各地的使用者对于STATA公司提出的问题与解决之道。使用者也可以透过Stata. Journal获得许许多多的相关讯息以及书籍介绍等。另外一个获取庞大资源的管道就是Statalist,它是一个独立的listserver,每月交替提供使用者超过1000个讯息以及50个程序。 四、PYTHON
-
数据结构与算法分析课程设计:稀疏矩阵的应用