稀疏矩阵

稀疏矩阵
稀疏矩阵

攀枝花学院

学生课程设计(论文)课程名称

设计题目

学生姓名:学号:

所在院(系):

专业:

班级:

指导教师:职称:

年月日

攀枝花学院教务处制

注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表

摘要

本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘等操作,最后输出运算后的结果。考虑到难易程度,先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘等操作的方法,再在十字链表下实现。程序通过调试运行,结果与预期一样,初步实现了设计目标。

关键词:程序设计,稀疏矩阵,三元组,十字链表

目录

摘要........................................................................ I 绪论 (1)

1.设计目的与要求 (2)

1.1题目名称:稀疏矩阵的操作 (2)

1.2设计要求 (2)

1.3设计涉及知识 (2)

2、功能设计 (2)

2.1需求分析 (2)

2.2总体设计 (3)

2.3数据结构 (3)

3.功能模块图 (3)

3.1概要设计 (4)

3.2 系统流程图 (5)

3.3 菜单函数 (6)

4.稀疏矩阵的操作的源代码及说明 (7)

4.1 矩阵的声明与结构体定义 (7)

4.2 矩阵的输出函数模块 (7)

4.3 两矩阵相加 (8)

4.4 矩阵的转置 (9)

4.5 创建矩阵 (10)

4.6 主函数模块 (12)

5程序运行结果 (13)

5.1 经过调试,无错误,无警告 (13)

5.2创建矩阵并显示登录页面即主菜单 (13)

5.3 运行操作 (14)

5.4转置矩阵A (14)

5.5转置矩阵B (15)

5.6输出矩阵R (15)

5.7退出程序 (15)

6编程中遇到的困难及解决方法 (16)

7总结心得及良好建议 (17)

8致谢 (18)

9参考文献 (19)

绪论

培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个稀疏矩阵A 和B的和为矩阵R,并输出R;求出A的转置为矩,输R。

设计目的与要求和功能设计

1.设计目的与要求

1.1题目名称:稀疏矩阵的操作

1.2设计要求

①实现矩阵的输入,并用并采用三元组表示。

②实现两个矩阵(A,B)的加法。

③实现对任意一个矩阵(A,B)的转置。

④可以输出任意矩阵(A,B,R)。

1.3设计涉及知识

注意合理地设计三元组或者十字链表,结合稀疏矩阵的压缩存储方式和特点,将每一功能模块以函数形式分别实现。在此基础上用C/C++实现其操作。

2、功能设计

以三元组、十字链表为存储形式,分别实现两个稀疏矩阵的加法运算、两个稀疏矩阵的乘法运算,以及对任意稀疏矩阵的转置运算。稀疏矩阵要求可为键盘录入的任意矩阵。

2.1需求分析

根据题目要求应提供键盘式菜单实现功能选择,还应提供信息的输入操作,可以在程序中提供矩阵相加,转置矩阵和矩阵输出等操作。本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。

首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩阵。在对稀疏矩阵

功能设计和功能模块图

进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。

2.2总体设计

根据上面的需求分析,可以将这个系统的设计分为1矩阵相加,2 矩阵转置,3 输出矩阵。

2.3数据结构

数据结构采用三元组存储的结构体(包括两个结构体),第一个结构体包括行列下标和非零元素的值,第二个结构体包括非零元素个数的最大值与矩阵的行列值。

3.功能模块图

本系统设计的函数是由一个主函数几个子函数组成的。首先构思大局编出一个主函数,然后根据要实现的功能逐步细分设计,分别解决矩阵相加,矩阵转置,矩阵输出的子函数编程中遇到的问题。首先通过结构体的定义,确定矩阵的大小和非零元素的个数。首先通过创建函数创建矩阵,输入矩阵信息,然后再逐步编写和验证其它功能。显示函数的设计利用C语言的循环功能(while,do_while)依次输出信息。矩阵相加是通过判断非零元素是否存在而进行下一步操作,转置是通过交换非零元素的行列下标实现。

3.1概要设计

系统功能模块图如图1所示:

图1 功能模块

3.2 系统流程图

3.3 菜单函数

菜单函数首先标出稀疏矩阵运算器,然后给出用户可选择的项目,用户可以通过选择该项前的代码来实现想要实现的功能,其流程图如图3所示:

图3 菜单函数流程图

4.稀疏矩阵的操作的源代码及说明4.1 矩阵的声明与结构体定义

#include

#include

#define MAXSIZE 100 //非零元素的最大个数是100

#define MAXRC 100

typedef struct{//定义非零元素的结构体的行,列下标与非零元素的值

int i,j;//行,列下标

int e; //非零元素的值

}Triple;//定义结构体变量

typedef struct//定义矩阵的行,列,及非零元素的个数的结构体

{

Triple data[MAXSIZE+1];//定义非零元素的最大个数

int mu,nu,tu;//矩阵的行,列和非零元素的个数

}RLSMatrix;//定义结构体变量

4.2 矩阵的输出函数模块

void Printf(RLSMatrix *A) //输出函数模块

{ //用于输出开始定义时的矩阵

int arow,i=1,col;//定义循环变量

int z=0;//定义输出零元素的变量

//循环输出矩阵

for(arow=1;arow<=A->mu;arow++)

{

printf("\n");//矩阵换行

for(col=1;col<=A->nu;col++)

{

if(A->data[i].i==arow&&A->data[i].j==col&&i<=A->tu)//判断是否是非零元素

printf("%-4d",A->data[i++].e);//输出非零元素

else printf("%-4d",z); //输出零元素

}

}

printf("\n");

}

4.3 两矩阵相加

void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *R) //两矩阵加法实现函数

{

int x=1;//控制列下标

int y=1;//控制行下标

int z=1;//记录R中的非零元素的个数

R->tu=0;//先将非零元个数设置为零

R->mu=A->mu;//设置R的行数

R->nu=A->nu;//设置R的列数

if(A->mu!=B->mu || A->nu!=B->nu){//判断矩阵是否合法

printf("******你输入的矩阵不能相加,请重新开始输入合格的矩阵\n*****");

exit(0);

}

if((A->mu<=1&&A->nu<=1)&&(B->mu<=1&&B->nu<=1)){

printf("你输入的A,B矩阵都不对\n");

exit(0);

}else if(A->mu<=1&&A->nu<=1){

printf("你输入的A矩阵不对\n");

exit(0);

}else if(B->mu <=1&&B->nu <=1){

printf("你输入的B矩阵不对\n");

exit(0);

}

for(int i=1;i<=A->mu;i++)//循环赋值

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

R->data[z].i=i;

R->data[z].j=j;

if(A->data[x].i==i&&A->data[x].j==j&&B->data[y].i==i&&B->data[y].j==j){//判断A,B是否都是非零项

R->data[z].e=A->data[x].e+B->data[y].e;

x++; y++;

}

else if(A->data[x].i==i&&A->data[x].j==j){//判断A是否是非零项

R->data[z].e=A->data[x].e; x++;

}

else if(B->data[y].i==i&&B->data[y].j==j){//判断B是否是非零项

R->data[z].e=B->data[y].e; y++;

}

else {

R->data[z].e=0;//非零项赋值为零

}

z++;

}

R->tu=z;

printf("矩阵A为:\n"); //输出矩阵A

Printf(A);

printf("矩阵B为:\n"); //输出矩阵B

Printf(B);

printf("矩阵相加结果为:\n"); //输出相加矩阵

Printf(R);

}

4.4 矩阵的转置

void TSM(RLSMatrix *M,RLSMatrix T){//求稀疏矩阵的转置矩阵 T.mu=M->nu;//将M矩阵的元素附给T矩阵

T.nu=M->mu;

T.tu=M->tu;

if(M->mu<=1&&M->nu<=1){//判断矩阵是否合法

printf("你输入的A矩阵不对\n");

exit(0);

}

if(T.tu){//看矩阵是否有非零项

int q=1;

for(int col=1;col<=M->nu;++col)

for(int p=1;p<=M->tu;++p){

if(M->data[p].j==col){

T.data[q].i=M->data[p].j;

T.data[q].j=M->data[p].i;

T.data[q].e=M->data[p].e;

++q;

}

}

}

printf("转置矩阵是:\n");

Printf(&T);//通过Printf函数将转置矩阵输出

}

/*void FTS(RLSMatrix *M,RLSMatrix T){//转置矩阵函数

if((A->mu==1&&A->nu==1)&&(B->mu==1&&B->nu==1)){//判断矩阵是否合法

printf("你输入的A,B矩阵都不对\n");

exit(0);

}else if(A->mu==1&&A->nu==1){

printf("你输入的A矩阵不对\n");

exit(0);

}else {

printf("你输入的B矩阵不对\n");

exit(0);

}

int num[MAXSIZE],cpot[MAXSIZE],q=0;

T.mu=M->nu; T.nu=M->mu; T.tu = M->tu;//给T矩阵的变量附值

if(T.tu){//判断是否有非零元素,如有就进行转置

for(int col=1;col<=M->nu;++col)

num[col]=0;

for(int t=1;t<=M->tu;++t)

++num[M->data[t].j];//求M中每列含非零元素的个数

cpot[1]=1;

//求第col列中第一个非零元素在b.data中的序号

for(col=2;col<=M->nu;++col)cpot[col]=cpot[col-1]+num[col-1];

for(int p=1;p<=M->tu;p++){

col=M->data[p].j ;

q=cpot[col];

T.data[q].i=M->data[p].j ;

T.data[q].j = M->data[p].i;

T.data[q].e = M->data[p].e;

++cpot[col];

}

}

Printf(&T);

}*/

4.5 创建矩阵

void creatjuzheng(RLSMatrix *A,RLSMatrix *B,RLSMatrix *R){

int i,j,k,c,num[MAXRC];//定义变量

char choice,l='y';//定义控制循环的变量

do{

printf("请输入A矩阵的行数,列数和非零元个数,如(mu,nu,tu):"); //构造A 矩阵

scanf("%d %d %d",&A->mu,&A->nu,&A->tu);//输入行列下标和非零元个数

printf("请输入A矩阵中非零元的行下标,列下标和值,如(i,j,e):\n");//输入矩阵A的非零元素的数据

for(k=1;k<=A->tu;k++) //输入矩阵A的数据

scanf("%d %d %d",&A->data[k].i,&A->data[k].j,&A->data[k].e);

for(k=1;k<=A->mu;k++)

num[k]=0;//开始定义非零元三元组表

for(k=1;k<=A->tu;k++)

++num[A->data[k].i];

printf("请输入B矩阵的行数,列数和非零元个数,如(mu,nu,tu):");//输入矩阵B的数据

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

printf("请输入B矩阵中非零元的行下标,列下标和值,如(i,j,e):\n");//输入矩阵B的非零元素的数据

for(k=1;k<=B->tu;k++)

scanf("%d %d %d",&B->data[k].i,&B->data[k].j,&B->data[k].e);

for(k=1;k<=B->mu;k++)

num[k]=0; //开始定义非零元三元组表

for(k=1;k<=B->tu;k++)

++num[B->data[k].i];

while(l=='y'||l=='Y'){//循环操作稀疏矩阵

getchar();

while(c!='A'&&c!='B'&&c!='C'){

printf("输入编号有误,请重新输入:");

c=getchar();

}

printf("请输入要进行的操作编号: A:加法 B转置 C 输出矩阵\n");//运行提示语

c=getchar();

switch(c){

case 'A':

printf("*****************正在进行矩阵的加法运算****************\n");

ADD(A,B,R);

break;

case 'B':

printf("输入你要转换的矩阵编号:(A<1>,B<2>): ");

scanf("%d",&j);

i=1;

printf("****************正在进行矩阵的转置****************\n");

while(i==1){

if(j==1){

TSM(A,*R); i=0;

//FTS(A,*R);i=0;

}else if(j==2){

TSM(B, *R); i=0;

//FTS(A,*R);

}else{

printf("输入有错误!!!");

}

}

break;

case 'C':

printf("输入你要输出的矩阵编号(A<1>,B<2>,R<3>): ");

scanf("%d",&i);

j=1;

while(j==1){

if(i==1){

Printf(A); j=0;

}else if(i==2){

Printf(B); j=0;

}else{

Printf(R); j=0;

}

}

break;

default:{

printf("你的输入不正确!!!"); i=0;

}

}

printf("\n按Y或者y继续操作: ");

scanf("%s",&l);

}

printf(" \n按Y或者y继续输入新矩阵: ");

scanf("%s",&choice);

}

while(choice=='Y'||choice=='y');

}

4.6 主函数模块

void main() //主函数代码块

{

RLSMatrix *A,*B,*R;//定义三个结构体变量

printf("******************稀疏矩阵运算器*******************\n");//运算器提

示语

printf("\n");

A=(RLSMatrix*)malloc(sizeof(RLSMatrix)); // 给矩阵A分配空间 B=(RLSMatrix*)malloc(sizeof(RLSMatrix)); //给矩阵B分配空间 R=(RLSMatrix*)malloc(sizeof(RLSMatrix)); //给矩阵R分配空间

creatjuzheng(A,B,R);

}

5程序运行结果

5.1 经过调试,无错误,无警告

5.2创建矩阵并显示登录页面即主菜单

5.3 运行操作

5.4转置矩阵A

5.5转置矩阵B

5.6输出矩阵R

5.7退出程序

基于约束非负矩阵分解的图像表示

对于图像的约束非负矩阵分解 摘要:非负矩阵分解(NMF)对于寻找非负数据的块基础和线性表示是一个常用的方法。它已经广泛的应用于各种应用,比如模式识别,信息检索,计算机视觉。但是,NMF本质上是一个非监督方法,不能利用标签信息。在本文中,我们提出一种新的半监督矩阵分解方法,叫约束非负矩阵分解(CNMF),将标签作为附加约束合并进来。特别地,本文显示出结合标签信息能非常简洁地提高矩阵分解的识别能力。我们利用两个函数公式和提供的相应优化问题的更新解决方法来研究所提出的CNMF方法。通过实际数据的评估,我们所提出的方法和最先进的方法相比更有效。 索引词:非负矩阵分解,半监督学习,降维,聚类

1.简介 许多数据分析中一个基础的问题就是寻找一个合适的表示数据[1],[2],[3],[4],[5],[6],[7],[8]。可以应用一个非常有效的方法表示数据之间的潜在结构。矩阵分解技术作为这类数据表示的基础工具已经得到越来越多的注意。运用不同的标准已经得到了大量不同的方法。最流行的技术包括主成分分析(PCA)[9],奇异值分解(SVD)[10],和向量量化[11]。矩阵分解的中心是找到两个或者更多的因子产生原始数据的一个好的逼近。在实际应用中,分解之后的矩阵维数通常远远小于原始数据的维数。这就引起了数据的压缩表示,促进了其他研究比如聚类和分类。 在矩阵分解方法中,非负矩阵分解(NMF)有一个限制即所有的矩阵因子都必须是非负的,即所有的因子必须大于等于零。这个非负性约束使NMF从感觉上只能对原始数据进行加操作不能减。因此,对于图像处理,人脸识别[2][12],文件聚类[13][14]是一个理想的降维方法,它们就是由部分组成整体的。 NMF是一个非监督学习方法。NMF不能应用于许多实际的问题当专家认为是可行的有限知识中。但是许多机器语言的研究发现未标签的数据当与一些少量的标签数据相结合时在研究精确度上会产生相当大的提高[15][16][17]。全标签训练集的处理过程可能会很昂贵,然而少量的标签数据的获得相对便宜。在这种情况下,半监督学习方法就有很大的实用价值。因此,用半监督学习方法研究NMF 很有意义。 最近,蔡登等人提出了一种图表正则化NMF(GNMF)方法来编码数据空间的几何信息。GNMF构建一个最近邻图表模拟多种结构。当标签信息可行时,它自然地应用到图表结构中。特别地,如果两个数据点使用同一个标签,大的权重会被分配到边缘连接它们。如果两个数据点使用不同的标签,相应的权重都是0。这就引起了半监督GNMF。这个方法的最大缺点是相同类别的数据点将会一起映射到一个新的表示空间,而且怎样有原则的选取权重并不清晰,这一观点没有理论保证。 本文中,我们提出一种新的矩阵分解方法,叫约束非负矩阵分解(CNMF),将标签信息作为附加的约束。我们算法的中心是相同类别的数据可以在一个新的表示空间中合并。这样,已经获得的部分表示就有和原始数据一致的标签,因此就有多的识别能力。我们方法的另一个优点是参数自由,避免了参数调试来获得更好的结果。这就使我们的算法更容易方便的应用于真实世界应用中。我们还讨论了怎样高效的解决相应的最优化问题。给出最优化收敛性证明。本文贡献如下:1.标准NMF是一个非监督学习算法不需要结合标签信息。本文中,我们将它扩展为半监督学习算法。此外,我们将标签信息作为约束;这样一来,有相同标签

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include #define uchar unsigned char #define uint unsigned int sbit duan=P 2八6; sbit wei=P 2八7; sbit bee=P 2八3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablewe[]={ 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp; unsigned char key; unsigned char i,j;

unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ //63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 4 64580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 5 65297 ,// 超高音:1 }; // 音调数据表可改 void delay(uchar x) uchar y,z; for(y=x;y>0;y--) for(z=0;z<110;z++); void init() TMOD=0x01; ET0=1; EA=1; void display() { for(i=0;i<2;i++)

稀疏矩阵的计算概论

#include #include #include typedef int ElemType;// 稀疏矩阵的十字链表存储表示 typedef struct OLNode { int i,j; // 该非零元的行和列下标 ElemType e; // 非零元素值 struct OLNode *right,*down; // 该非零元所在行表和列表的后继链域}OLNode, *OLink; typedef struct// 行和列链表头指针向量基址,由CreatSMatrix_OL()分配{ OLink *rhead, *chead; int mu, nu, tu; // 稀疏矩阵的行数、列数和非零元个数 }CrossList; // 初始化M(CrossList类型的变量必须初始化,否则创建、复制矩阵将出错) int InitSMatrix(CrossList *M) { (*M).rhead=(*M).chead=NULL; (*M).mu=(*M).nu=(*M).tu=0; return 1; } // 销毁稀疏矩阵M int DestroySMatrix(CrossList *M) { int i; OLNode *p,*q; for(i=1;i<=(*M).mu;i++) // 按行释放结点 { p=*((*M).rhead+i); while(p) { q=p; p=p->right; free(q); } } free((*M).rhead); free((*M).chead); (*M).rhead=(*M).chead=NULL; (*M).mu=(*M).nu=(*M).tu=0; return 1; }

稀疏矩阵的建立与转置

实验2 稀疏矩阵的建立与转置 一、实验目的 掌握特殊矩阵的存储和操作算法。 二、实验内容及问题描述 实现用三元组保存稀疏矩阵并实现矩阵转置的算法。 三、实验步骤 1. 定义稀疏矩阵的三元组形式的存储结构。 2. 实现三元组矩阵的传统转置算法。 3. 实现三元组矩阵的快速转置算法。 4. 输入矩阵非零元素,测试自己完成的算法。 四、程序流程图

五、概要设计 矩阵是很多的科学与工程计算中研究的数学对象。在此,我们感兴趣的是,从数学结构这门学科着眼,如何存储矩阵的元从而使矩阵的各种运算有效的进行。本来,用二维数组存储矩阵,在逻辑上意义是很明确的,也很容易理解,操作也很容易和方便。但是在数值分析中经常出现一些阶数很高的矩阵,同时,在矩阵中又有很多值相同或者都为零的元素,可以对这种矩阵进行压缩存储:对多个值相同的元素只分配一个存储空间;对零元素不分配空间。稀疏矩阵的定义是一个模糊的定义:即非零元个数较零元个数较少的矩阵。例如下图所示的矩阵 为一个稀疏矩阵。为了实现稀疏矩阵的这种存储结构,引入三元组这种数据结构。三元组的线性表顺存储形式如下图: 六、详细设计 sanyuanzu.h 头文件 #define max 100 typedef struct { int row,col; int e; }Triple;//定义三元组 typedef struct { Triple data[max]; int mu,nu,tu; }TSMatrix;///*定义三元组的稀疏矩阵*/ void creat( TSMatrix &M) ; void fasttrans(TSMatrix A,TSMatrix &B);

矩阵键盘电路设计

课程设计 题目矩阵键盘电路设计教学院计算机学院 专业计算机应用技术班级 姓名 指导教师 2010 年01 月12 日

前言.................................................................... 第一章需求分析......................................................... 功能描述......................................................... 功能分析......................................................... 第二章系统的原理及分析................................................. 用到的知识点的介绍,知识点使用的总体思路 第三章详细设计......................................................... 硬件设计 系统结构图,元器件的选择等 软件设计 所设计的软件关键模块的程序流程 第四章测试............................................................ 运行结果分析等 第五章总结............................................................. 参考文献................................................................ 附录 关键程序代码........................................................

2019年注册会计师考试辅导考前精准押题预测卷2完整版

预测试题二 一、单项选择题(本题型共24小题,每小题1分,共24分。每小题只有一个正确答案,请从每小题的备选答案中选出一个你认为正确的答案,用鼠标点击相应的选项。) 1.甲公司评估战略备选方案时,主要考虑选择的战略是否发挥了企业优势,克服了劣势,是否利用了机会,将威胁削弱到最低程度,是否有助于企业实现目标。甲公司评估战略备选方案使用的标准是()。 A.适宜性标准 B.外部性标准 C.可行性标准 D.可接受性标准 『正确答案』A 『答案解析』适宜性标准,考虑选择的战略是否发挥了企业的优势,克服了劣势,是否利用了机会,将威胁削弱到最低程度,是否有助于企业实现目标。 2.下列选项中,不属于企业战略变革的主要任务的是()。 A.调整企业理念 B.企业战略重新进行定位 C.重新构建企业文化 D.重新设计企业的组织结构 『正确答案』C 『答案解析』企业战略变革的主要任务包括:(1)调整企业理念;(2)企业战略 重新进行定位;(3)重新设计企业的组织结构。 3.甲公司所处产业属于互联网金融信息服务产业,用户对资讯产品的品牌依赖度较 大。只有建立起一定的市场知名度和美誉度,方能取得客户的信任,相关产品和服务的推出、升级、更新换代才能被市场快速接受。甲公司给潜在进入者设置的进入障碍是()。 A.规模经济 B.资金需求 C.现有企业的市场优势 D.现有企业对关键资源的控制 『正确答案』C 『答案解析』现有企业的市场优势主要表现在品牌优势上。用户对资讯产品的品牌 依赖度较大。只有建立起一定的市场知名度和美誉度,方能取得客户的信任,相关 产品和服务的推出、升级、更新换代才能被市场快速接受。甲公司给潜在进入者设 置的进入障碍属于现有企业的市场优势。 4.下列选项中,适宜采用市场开发战略的是()。 A.甲公司发现邻国市场上对本企业生产的同类产品需求旺盛,但是当地的供应量不 足 B.乙公司在现有行业中经营多年,竞争优势明显,但该行业被称为“夕阳行业” C.丙公司从自身实际出发,决定将经营重心集中在现有产品和现有市场领域 D.丁公司希望避免资金投入和开发风险,以及资源重新配置和组合的成本 『正确答案』A 『答案解析』选项A适宜采用市场开发战略;选项B适宜采用相关(同心)多元化 战略;选项C适宜采用市场渗透战略;选项D适宜采用稳定战略。

MATLAB数值计算功能(向量、矩阵、数组、稀疏矩阵)

数值计算功能 向量及其运算 1、向量生成 (1)、直接输入 向量元素用“[]”括起来,用空格或逗号生成行向量,用分号生成列向量 a1=[11141718] a2=[11,14,17,18] a2=[11;14;17;18] %列向量 用“’”可以进行向量转置 a1=[11 14 1718] a4=a1'??%a1行向量,a4列向量 也可以用组合方法: A=[1 2 3]; B=[7 8 9]; C=[A 4ones(1,2)B] (2)、等差元素向量生成 冒号生成法:Vec=Vec0:n:Vecn,其中Vec表示生成的向量,Vec0表示第一个元素,n表示步长,Vecn表示最后一个元素 使用linespace函数:Vec=linespace(Vec0,n,Vecn),其中Vec表示生成的向量,Vec0表示第一个元素,n表示生成向量元素个数(默认n=100),Vecn表示最后一个元素 vec1=10:5:50 vec2=50:-5:10 vec3=linspace(10,50,6) 2、向量的基本运算 (1)、向量与数的四则运算 向量中每个元素与数的加减乘除运算(除法运算时,向量只能作为被除数,数只能作为除数)vec1=linspace(10,50,6) vec1+100 vec2=logspace(0,10,6)??%对数等分向量 vec2/100 (2)、向量与向量之间的加减运算 向量中的每个元素与另一个向量中相对应的元素的加减运算 vec1=linspace(10,50,6) vec2=logspace(0,2,6) vec3=vec1+vec2 (3)、点积、叉积和混合机 点积:dot函数,注意向量维数的一致性 x1=[11 22 33 44] x2=[1 2 3 4]

数据结构课程设计之稀疏矩阵实现与应用1

数据结构课程设计报告 题目:十字链表成为存储结构,实现稀疏矩阵的求和运算 学生姓名:张旋 班级:软件三班学号:201213040304 指导教师: 吴小平

一、需求分析 1.问题描述: 要求:十字链表下的稀疏矩阵的加、转、乘的实现。 2.基本功能 实现十字链表下的转置,乘法,加法运算。 3.输入输出 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (5)构造函数进行稀疏矩阵的转置,并输出结果。 (6)退出系统。 二、概要设计 1.设计思路: 本实验要求在三元组,十字链表下实现稀疏矩阵的加、转、乘。首先要进行矩阵的初始化操作,定义三元组和十字链表的元素对象。写出转置,加法,乘法的操作函数。通过主函数调用实现在一个程序下进行矩阵的运算操作。 2.数据结构设计: 抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{ 数据对象:D={aij | i=1,2,…,m; j=1,2,..,n; aij∈Elemset, m和n分别称为矩阵的行数和列数。} 数据关系:R={Row,Col} Row={ | 1<=i<=m, 1<=j<=n-1} Col= { | 1<=i<=m-1, 1<=j<=n} 基本操作: CreateSMatrix(&M); 操作结果:创建稀疏矩阵M。 DestroySMatrix(&M); 初始条件:稀疏矩阵M存在。操作结果:销毁稀疏矩阵M。 PrintSMatrix(M); 初始条件:稀疏矩阵M存在。操作结果:输出稀疏矩阵M。 AddSMatrix(M,N,&Q); 初始条件:稀疏矩阵M与N的行数和列数对应相等操作结果:求稀疏矩阵的和Q=M+N。 MultSMatrix(M,N,&Q); 初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵乘积Q=M*N。 TransposeSMatrix(M,&T); 初始条件:稀疏矩阵M存在。操作结果:求稀疏矩阵M的转置矩阵T。 }ADT SparseMatrix 3.软件结构设计:

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

稀疏矩阵在迭代求解线性方程组中的运用

稀疏矩阵在迭代求解线性方程组中的运用 学院:自动化院 专业:电力系统及其自动化 姓名:张庆磊 学号:111101112 指导老师:杨伟

摘要:对于稀疏矩阵的稀疏存储技术进行了研究,研究了按行存储的检索方式,以便于迭代计算,分别对雅克比法和高斯—赛特法的算法进行理论研究和程序实现,并且比较了两种方法的优劣。 关键词:系数技术;线性方程;迭代 大型稀疏矩阵线性化方程组的求解问题,在电力系统中有着广泛的的运用。由于电力网本身的结构限制,节点导纳矩阵节点繁多,而仅有少量的非零元,稀疏度很高,若采用传统存储计算方式,会占用大量的存储空间,并且降低运算效率。在迭代计算中,由于无法分辨零元素,也会无谓地浪费运算时间。因此稀疏技术在求解方程组中的运用显得尤为重要。 1.稀疏矢量与稀疏矩阵的存储 稀疏矢量与稀疏矩阵的存储特点是排零存储,即只存储其中的非零元和有关的检索信息.存储的目的是为了在计算中方便的访问和运用,这就要求既节省内存,又便于搜索。论文采用了按行存储格式。 按行顺序依次存储A 中的非零元,同一行元素依次排列在一起,存储格式: V A ——按行存储矩阵A 中的非零元ij a ,共τ个; JA ——按行存储矩阵A 中的非零元的列号,共τ个; IA ——记录A 中每行第一个非零元在V A 中的位置,共n 个。 2.迭代法求解线性方程 设n n n n R b R A ∈∈?,,考虑线性方程组 Ax=b 一般的,先将式1变为同解方程组 X=Bx+f 形成迭代式 f Bx x k k +=+)()1( 式中:B 为迭代矩阵; 若要求迭代式收敛则需满足1B 1)(<<或B ρ,其中?为任意范数 式1中,A 可以分裂为 A=M+N (1)

稀疏矩阵的运算课程设计

数据结构 课程设计说明书题目: 稀疏矩阵的运算 院系:计算机科学与工程学院 专业班级:计算机10-**班 学号: 201030**** 学生姓名: ****** 指导教师: ****** 2011年 12 月 28 日

安徽理工大学课程设计(论文)任务书 计算机科学与工程学院 2011年 11 月 8 日

安徽理工大学课程设计(论文)成绩评定表

目录 1 问题描述 (1) 2 需求分析 (1) 3 总体设计 (2) 3.1 Matrix结构的定义 (2) 3.2 系统流程图 (3) 4 详细设计 (4) 4.1 “菜单”界面 (4) 4.2 建立矩阵 (4) 4.3 显示矩阵 (6) 4.4 矩阵的转置 (7) 4.5 矩阵的加法运算 (8) 4.6 矩阵的减法运算 (9) 4.7 矩阵的乘法运算 (9) 5 程序运行 (11) 5.1 输入矩阵 (11) 5.2 矩阵转置 (11) 5.3 矩阵加法 (12) 5.4 矩阵减法 (12) 5.5 矩阵乘法 (12) 5.6 退出及错误提示 (13) 6 总结 (13) 参考文献 (14)

1 问题描述 (1)题目内容:设计稀疏矩阵运算系统实现两个稀疏矩阵的加法、减法、乘法以 及转置操作。 (2)基本要求: ①存储结构选择三元组存储方式; ②实现一个稀疏矩阵的转置运算; ③实现两个稀疏矩阵的加法运算; ④实现两个稀疏矩阵的减法运算; ⑤实现两个稀疏矩阵的乘法运算。 (3)设计目的:通过本次课程设计,了解稀疏矩阵的一些基本运算操作,并通过 相关的程序代码实现。 2 需求分析 经过本次的课程设计,我认为稀疏矩阵运算系统主要实现的功能如下:(1)建立矩阵:只有先建立了矩阵,才能够对矩阵进行运算操作,包括建立矩阵 A和矩阵B; (2)转置运算操作:对矩阵A或者矩阵B进行转置运算,输出相应的转置矩阵; (3)四则运算操作:该步骤由两个矩阵同时参与,对其进行加法运算(A+B)、减 法运算(A-B)以及乘法运算(A*B和B*A); (4)退出:当做完矩阵的运算操作之后,就可以点击它退出该界面。 在这次设计中用到了一些变量和函数,例如:void Display(Matrix M);int Max(int i,int j);Matrix Zero(Matrix M)等,下面会做进一步详细的介绍。

秩约束矩阵方程中若干问题的研究

秩约束矩阵方程中若干问题的研究 【摘要】:1.秩约束下矩阵方程的极秩和秩约束条件下矩阵方程的最小二乘解首先我们给出秩约束条件r(X)=k下r(A-BX)的极小值;其次给出秩约束条件r(x)=k,X≥0下r(A-BXBH)的极小值,其中A∈Cm×m 是Hermite矩阵,B∈Cm×n,r(B)=b;最后给出秩约束条件r(C-AXB)=min下‖C-AXB‖F=min的解,其中A∈Cm×n,B∈Cp×q,C∈Cm×q给定。2.若干矩阵广义逆的表示.首先利用矩阵A的秩为r的子矩阵Aα,*(A*,β)给出矩阵A的{2}-逆的表示;其次,给出矩阵A的κ-阶子式给出Moore-Penrose逆、群逆的表示,其中κ≥(A);最后我们应用广义奇异值分解给出一类秩约束条件下矩阵和的Moore-penrose逆的表示。3.EP和加权EP矩阵的刻画.设A∈Cm×m,我们称A是EP矩阵,若R(A)=R(AH).A是EP矩阵当且仅当r[AAH]=r(A).我们首先罗列出已有文献中关于EP矩阵的等价关系,并利用矩阵Moore-Penrose逆、群逆和秩等式r(A)=r(A2)等给出EP矩阵的若干新的刻画,最后,我们给出加权EP矩阵的若干刻画。【关键词】:秩等式EP矩阵分块矩阵广义逆 【学位授予单位】:华东师范大学 【学位级别】:博士 【学位授予年份】:2011

【分类号】:O151.21 【目录】:摘要6-7Abstract7-8目录8-10第一章引言10-161.1研究背景和现状10-111.2本文的主要工作111.3预备知识11-16第二章秩约束矩阵方程的极大、极小秩16-382.1秩约束下A-BX的极小秩17-242.2秩约束下A-BXB~H的极小秩24-332.3秩约束下[A,X]-[B,C]的极小秩33-38第三章秩约束下矩阵方程的最小二乘解38-543.1秩约束下矩阵方程AXB=C的最小二乘解38-473.2秩约束下矩阵方程BXB~H=A的最小二乘解47-54第四章若干矩阵广义逆的表示54-704.1矩阵{2}-逆的表示54-634.2矩阵Moore-Penrose逆的表示63-664.3秩约束矩阵和的Moore-Penrose逆的表示66-70第五章EP和加权EP矩阵的刻画70-965.1主要引理70-725.2EP矩阵72-795.3加权EP矩阵79-96附录A96-98附录B98-100参考文献100-108在校期间发表/待发表文章目录108-109致谢109 本论文购买请联系页眉网站。

(完整word版)实现稀疏矩阵(采用三元组表示)的基本运算实验报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 1≤i≤m-1,1≤j≤n} 基本操作: CreateSMatrix(&M) 操作结果:创建稀疏矩阵M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q)

初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的差Q=M-N TransposeSMatrix(M, & T) 初始条件:稀疏矩阵M已经存在 操作结果:求矩阵M的转置T MultSMatrix(M, N, &Q) 初始条件:稀疏矩阵M已经存在 操作结果:求矩阵的积Q=M*N }ADT SparseMatrix 3.2存储结构的定义 #define N 4 typedef int ElemType; #define MaxSize 100 //矩阵中非零元素最多个数typedef struct { int r; //行号 int c; //列号 ElemType d; //元素值 } TupNode; //三元组定义 typedef struct { int rows; //行数值 int cols; //列数值 int nums; //非零元素个数 TupNode data[MaxSize]; } TSMatrix; //三元组顺序表定义 3.3基本操作实现: void CreatMat(TSMatrix &t,ElemType A[N][N]) { int i,j; t.rows=N;t.cols=N;t.nums=0; for (i=0;i

数据结构 稀疏矩阵相乘问题

#include #include #define OK 1 #define ERROR 0 #define MAXSIZE 25 //最多非0元素的个数 #define MAXR 5 //rpos所能处理的最大行数 #define MAXC 5 //系数矩阵相乘时,保留临时列结果的数组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(){ printf("计科四班刘辉学号:41012169"); printf("\n"); printf("稀疏矩阵相乘"); printf("\n\n"); Matrix A1, A2, A3; //定义矩阵 CreatSMatrix( &A1 ); CreatSMatrix( &A2 ); if( A1.nu==A2.mu ){ //判断能否相乘 Mul_SMatrix( A1, A2, &A3 ); printf("两矩阵相乘得:\n"); Print(A3); } system("pause"); } //稀疏矩阵相乘 int Mul_SMatrix( Matrix M, Matrix N, Matrix *Q) { int i,Mj;

相似矩阵的性质及应用

华北水利水电大学相似矩阵的性质及应用 课程名称:线性代数 专业班级: 成员组成: 联系方式: 2013年11月6 日

摘要:若矩阵P可逆,则矩阵P-1AP与A称为相似。矩阵相似的概念是为深入研 究矩阵特性而提出的,其中一部分的问题可以转化为与一个对角化矩阵相似问题进而使问题研究简化,而另一些矩阵不能与一个对角矩阵相似,那么这类问题就只能用定义或者若而当标准型来解决。相似矩阵有很多应用。例如:利用相似矩阵的性质来确定矩阵中未知元素方法的完整性;两个相似矩阵属于同一个特征值的特征向量之间的关系;矩阵相似与特征多项式的等价条件及相关结果;尤其是矩阵的标准形及其对角化问题,在高等代数和其他学科中都有极其广泛的应用。本文将讨论相似矩阵的有关性质及其应用。 关键词:相似矩阵;对角化;Jordan标准型;特征向量;特征值 英文题目:The properties and application of similar matrix Abstract:There are a lot of applications about similar matrix. Matrix for further research is the concept of similarity matrix characteristics, and that part of the problem can be converted into similar problems with a diagonalization matrix to simplify the problem study, while others matrix cannot be similar to a diagonal matrix, so this kind of problem can only use a definition or if and when the standard to solve.For example, we can discuss the integrality of the method by using the properties of similar matrices to confirm unknown elements and characteristic subspaces of similar matrices belong to the same characteristic value are isomorphism. Also we may discuss the equivalent conditions for similar matrices and their characteristic polynomial and their corresponding results, especially, applications of digitalization matrices in advanced algebra theory and other subjects are probed into.In this paper I will give out some corresponding properties of similar matrices and show their appliance. Key words:similar matrices; diagonal matrix; Jordan’s normal form; characteristic value; characteristic vector

矩阵类封装与约束

矩阵类:封装与约束 矩阵类:封装与约束 王伟冰 矩阵的元素可以用一个数组来储存,我们希望建立一个矩阵类,来封装各种矩阵操作(比如加减乘、求逆、转置等等)。我们可以这么写: class matrix{ int width,height; //矩阵的宽度和高度 double* data; //储存矩阵数据的数组 public: matrix(int w1,int h1){ //构造函数 width=w1;

height=h1; data=new double[w1*h1]; } void add(const matrix& m1,const matrix& m2){ //加法 for(int i=0;i<width*height;i++) data[i]=m1.data[i]+m2.data[i]; } ……//其它矩阵操作,不一一写出 }; 在这里我们把width、height和data都设为私有变量,因为我们不希望使用matrix类的代码对这些变量作随意的更改,如果外界代码对类的某个成员变量或函数的随意访问可能导致不好的结果,则应该把它设为私有成员。(安全原则3)随意更改矩阵的高度、宽度或数据的储存位置,都可能导

致原有数据的丢失。 现在我们还不能对矩阵的具体元素进行访问,可以通过在matrix类中重载()运算符来实现: double& operator () (int i,int j){ //返回第i行第j列元素 return data[i*width+j]; } 由于返回类型是引用类型,所以不仅可以读取,还可以对它进行赋值: matrix m(3,3); double x=m(0,1); //读取第0行第1列元素 m(0,1)=x; //设置第0行第1列元素 这样,我们提供了对矩阵数据的封装,虽然外部代码无法直接访问矩阵数据,但是可以通过()运算符对它进行访问。

实验一矩阵键盘检测

一、实验目的: 1、学习非编码键盘的工作原理和键盘的扫描方式。 2、学习键盘的去抖方法和键盘应用程序的设计。 二、实验设备: 51/AVR实验板、USB连接线、电脑 三、实验原理: 键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。 1、按键的分类 一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。 按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。 全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。 2、按键的输入原理 在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应

实现稀疏矩阵(采用三元组表示)的基本运算实验分析报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告

————————————————————————————————作者:————————————————————————————————日期: 2

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 1≤i≤m-1,1≤j≤n} 基本操作: CreateSMatrix(&M) 操作结果:创建稀疏矩阵M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q) 3

数据结构C语言版-稀疏矩阵三元组的基本操作

数据结构 课程设计实验报告 内容名称:稀疏矩阵的基本操作成员1:09213020-陈东 成员2:09213040-蔡丹 班级:09数31 教师:李晓翠 江苏师范大学 数学科学学院

目录 1.序言 (3) 1.1数据结构背景 (3) 1.2课程设计目的 (3) 1.3 课程名称 (3) 1.4设计要求 (3) 1.5设计说明 (3) 2.课程任务设计说明书 (5) 3.需求分析 (6) 3.1题目名称 (6) 3.2题目内容 (6) 3.3题目分析 (6) 4.概要设计 (7) 4.1稀疏矩阵存储结构 (7) 4.2.稀疏矩阵的基本操作 (7) 4.3各模块设计要求 (8) 4.4总体功能流程图 (9) 4.4.1存储结构流程图 (9) 4.4.2稀疏矩阵基本操作流程图 (10) 5.详细设计 (11) 5.1设计原理 (11) 5.2基本函数实现流程图 (13) 6.主要函数代码 (21) 7.调试与操作说明 (27) 7.1操作说明 (27) 7.2调试结果………………………………………………………………………………. ..28 7.3结果分析 (31) 8.设计体会 (32) 9.参考文献 (32) 10.分工说明 (33)

1.序言 1.1数据结构背景 数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。 数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。 基于此原因,我们开设了数据结构课程设计。针对数据结构课程的特点,着眼于培养我们的实践能力。实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,同学们都会有不同程度上的提高。 1.2课程设计的目的 巩固和深刻理解―数据结构(C语言版)‖课程所讲解的C语言作为数据结构的算法的描述,掌握对数据的存储结构和算法进行描述时,尽量考虑C 语言的特色。培养学生独立工作和创新思维的能力,取得设计与调试的实践经验。提高和加强计算机应用及软件开发能力。通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解,对每到题目作出了相应的逻辑分析和数据结构的选择,通过对任务的分析,为操作对象定义相应的数据结构,以过程化程序设计的思想方法为原则划分各个模块,定

相关文档
最新文档