下三角矩阵的压缩存储(实验报告)

下三角矩阵的压缩存储(实验报告)
下三角矩阵的压缩存储(实验报告)

一、实验目的和要求

理解和掌握下三角矩阵的压缩存储技术,使用C语言根据相应算法编写一个程序,实现下三角矩阵的压缩存储。要求仔细阅读下面的内容,编写C程序,上机通过,并观察其结果,写出实验报告书。

二、实验内容和原理

内容:用一个一维数组存储一个5X5的下三角矩阵。

原理:对于下三角矩阵来说,大约有一半的元素为零,这些元素不必存储,只需存储下三角部分的非零元素。

三、主要仪器设备

计算机一台

四、实验主程序

#include

int main(void)

{

int a[15],

b[5][5]={{1},{2,3},{4,5,6},{7,8,9,10},{11,12,13,14,15}},

i,j,k;

for(i=0,k=0;i<5;++i)

for(j=0;j<=i;++j)

{

a[k]=b[i][j];

++k;

}

for(i=0;i<15;++i)

printf("%d ",a[i]);

printf("\n");

for(i=0;i<5;++i)

{

for(j=0;j<5;++j)

{

if(j<=i)

printf("%-3d",a[i*(i+1)/2+j]);

else

printf("%-3d",0);

}

putchar('\n');

}

getchar();

return 0;

}

实验结果

五、实验心得

通过实验学习,理解了下三角矩阵的压缩存储的算法,了解到像了下三角矩阵这样的规则矩阵可以压缩存储,极大节省了空间,使我受益匪浅。

数据结构实验五矩阵的压缩存储与运算学习资料

数据结构实验五矩阵的压缩存储与运算

第五章矩阵的压缩存储与运算 【实验目的】 1. 熟练掌握稀疏矩阵的两种存储结构(三元组表和十字链表)的实现; 2. 掌握稀疏矩阵的加法、转置、乘法等基本运算; 3. 加深对线性表的顺序存储和链式结构的理解。 第一节知识准备 矩阵是由两个关系(行关系和列关系)组成的二维数组,因此对每一个关系上都可以用线性表进行处理;考虑到两个关系的先后,在存储上就有按行优先和按列优先两种存储方式,所谓按行优先,是指将矩阵的每一行看成一个元素进行存储;所谓按列优先,是指将矩阵的每一列看成一个元素进行存储;这是矩阵在计算机中用一个连续存储区域存放的一般情形,对特殊矩阵还有特殊的存储方式。 一、特殊矩阵的压缩存储 1. 对称矩阵和上、下三角阵 若n阶矩阵A中的元素满足= (0≤i,j≤n-1 )则称为n阶对称矩阵。对n阶对称矩阵,我们只需要存储下三角元素就可以了。事实上对上三角矩阵(下三角部分为零)和下三角矩阵(上三角部分为零),都可以用一维数组ma[0.. ]来存储A的下三角元素(对上三角矩阵做转置存储),称ma为矩阵A的压缩存储结构,现在我们来分析以下,A和ma之间的元素对应放置关系。 问题已经转化为:已知二维矩阵A[i,j],如图5-1, 我们将A用一个一维数组ma[k]来存储,它们之间存在着如图5-2所示的一一对应关系。 任意一组下标(i,j)都可在ma中的位置k中找到元素m[k]= ;这里: k=i(i+1)/2+j (i≥j) 图5-1 下三角矩阵 a00 a10 a11 a20 … an-1,0 … an-1,n-1

k= 0 1 2 3 …n(n- 1)/2 …n(n+1)/2-1 图5-2下三角矩阵的压缩存储 反之,对所有的k=0,1,2,…,n(n+1)/2-1,都能确定ma[k]中的元素在矩阵A中的位置(i,j)。这里,i=d-1,(d是使sum= > k的最小整数),j= 。 2. 三对角矩阵 在三对角矩阵中,所有的非零元素集中在以主对角线为中心的带内状区域中,除了主对角线上和直接在对角线上、下方对角线上的元素之外,所有其它的元素皆为零,见图5-3。 图5-3 三对角矩阵A 与下三角矩阵的存储一样,我们也可以用一个一维数组ma[0..3n-2]来存放三对角矩阵A,其对应关系见图5-4。 a00 a01 a10 a11 a12 … an-1,n-2 an-1,n-1 k= 0 1 2 3 4 … 3n-3 3n-2 图5-4下三角矩阵的压缩存储 A中的一对下标(i,j)与ma中的下标k之间有如下的关系: 公式中采用了C语言的符号,int()表示取整,‘%’表示求余。

2.4直接三角分解法

§4 直接三角分解法 一、教学设计 1.教学内容:Doolittle 分解法、Crout 分解法,紧凑格式的Doolittle 分解法、部分选主元的Doolittle 分解法。 2.重点难点:紧凑格式的Doolittle 分解法、部分选主元的Doolittle 分解法。 3.教学目标:了解直接三角分解法的基本思想,掌握基本三角分解法及其各种变形。 4.教学方法:讲授与讨论。 二、教学过程 在上节中我们用矩阵初等变换来分析Gauss 消去法,得到了重要的矩阵LU 分解定理(定理 3.1,3.2)。由此我们将得到Gauss 消去法的变形:直接三角分解法。直接三角分解法的基本想法是,一旦实现了矩阵A 的LU 分解,那么求解方程组b x =A 的问题就等价于求解两个三角形方程组 (1)b y =L ,求y ; (2)y x =U ,求x 。 而这两个三角形方程组的求解是容易的。下面我们先给出这两个三角形方程组的求解公式;然后研究在LU A =或LU PA =时,U L ,的元素与A 的元素之间的直接关系。 4-0 三角形线性方程组的解法 设 ????? ???????= nn n n l l l l l l L 21222111, 11121222n n nn u u u u u U u ??????=???????? 则b y =L 为下三角形方程组,它的第i 个方程为 ),2,1(11,22111 n i b y l y l y l y l y l i i ii i i i i i i j j ij ==++++=--=∑ 假定0≠ii l ,按n y y y ,,,21 的顺序解得: ??? ?? ? ?=+-==∑-=) ,,3,2(/1111 11n i l b y l y l b y ii i i j j ij i 上三角形方程组y x =U 的第i 个方程为

基于Verilog的下三角矩阵求逆设计与实现

基于V erilog的下三角矩阵求逆设计与实现 杨丰瑞1,熊军洲2 (1.重庆重邮信科(集团)股份有限公司重庆400065) (2.重庆邮电大学通信与信息工程学院重庆400065) 摘要:矩阵运算广泛应用于各类电路计算中,矩阵运算的硬件实现能够充分发挥硬件的速度和并行性,其中矩阵求逆是矩阵运算中重要的运算。根据矩阵求逆算法的基本思想,本文提出了一种最大阶数可达16×16的矩阵求逆方案,通过硬件描述语言Verilog建模,用Design Compile进行综合及进行modelsim仿真,仿真结果表明这种设计结构能够正确的计算出下三角矩阵的逆矩阵。 关键词:矩阵求逆,Verilog, 实现 【中图分类号】TN492 【文献标识码】A Design and Implementation of Inverse Down Triangle Matrix Calculation Based on V erilog Y ang Fengrui1,Xiong Junzhou2 (1.Chongqing Chongyou Information Technolog (Group)CO.,LTD.Chongqing) (2.Chongqing University Of Post and Telecommunications School Of Communication and Information Engineering,Chongqing) Abstract: Matrix operation is widely used in different kinds of circuit calculation. Hardware implementation of matrix operation can fully realize the speed and parallel of the hardware. Matrix inversion is a kind of very important matrix operation. According to the algorithm of inverse matrix calculation ,this article gives a design on inverse matrix which can reach a biggest rand of 16×16.The system is described in V erilog, which is compiled by Design Compile and verified in modelsim. The result shows that this design structure can be used for inverse matrix calculation. Key words: inverse matrix; Verilog; implementation 1 引言 矩阵运算是数字信号处理领域的基本操作,广泛应用于各类电路计算当中。而矩阵求逆的难点在于矩阵求逆。目前传统的矩阵求逆算法多用处理器串行计算来实现,严重制约着计算速度的提高。为此,作者在研究并行处理结构和并行算法[1~2]的基础上,试图寻求一种适合硬件实现的求逆算法及其硬件结构。此外,在专用集成电路设计方面我国起步较晚,在矩阵求逆的硬件实现方面的研究还不多。随着集成电路制造工艺的提高,采用大量超大规模集成单元和微处理器构成多处理器并行系统已经成为提高计算速度的有效手段。因而,矩阵求逆算法的研究实现有着十分重要的意义。由于可逆矩阵都可以通过LU分解分成一个上三角矩阵和一个下三角矩阵[3],而要求的原矩阵的逆可以通过这两个三角矩阵的逆相乘得到[4],所以本文主要探讨的是下三角矩阵求逆的硬件实现。

计算方法_矩阵LU分解法

clear all; %A=LU矩阵三角分解法 n=input('输入方矩阵的维数: '); for i=1:n for j=1:n A(i,j)=input('依次输入矩阵元素:'); end end %输入一个n阶方形矩阵 for j=1:n L(j,j)=1; %Doolittle分解,L对角元素全为1 end for j=1:n U(1,j)=A(1,j); end %U的第一行 for i=2:n L(i,1)=A(i,1)/U(1,1); end %L的第一列 for k=2:n for j=k:n sum1=0; for m=1:k-1 sum1=sum1+L(k,m)*U(m,j); end %求和 U(k,j)=A(k,j)-sum1; end for i=k+1:n sum2=0; for m=1:k-1 sum2=sum2+L(i,m)*U(m,k); end %求和 L(i,k)=(A(i,k)-sum2)/U(k,k); end end L %输出下三角矩阵L U %输出上三角矩阵U

运行结果:(示例) 输入方矩阵的维数: 4 依次输入矩阵元素: 1 依次输入矩阵元素: 1 依次输入矩阵元素: 2 依次输入矩阵元素: 3 依次输入矩阵元素:0 依次输入矩阵元素: 2 依次输入矩阵元素: 1 依次输入矩阵元素: 2 依次输入矩阵元素: 1 依次输入矩阵元素:-1 依次输入矩阵元素: 2 依次输入矩阵元素: 2 依次输入矩阵元素: 2 依次输入矩阵元素: 2 依次输入矩阵元素: 5 依次输入矩阵元素:9 A=LU分解后则可以求解Ax=b线性方程组,相关计算参考计算方法,这里不再详细介绍。

列主元三角分解法在matlab中的实现

列主元三角分解法在matlab中的实现 摘要:介绍了M atlab语言并给出用M atlab语言实现线性方程组的列主元三角分解法,其有效性已在计算机实现中得到了验证。 关键词:M atlab语言;高斯消去法;列主元三角分解法 0前言 M atlab是M atrix Laboratory(矩阵实验室)的缩写,它是由美国M athwork公司于1967年推出的软件包,现已发展成为一种功能强大的计算机语言。它编程简单,使用方便,在M a tlab环境下数组的操作与数的操作一样简单,进行数学运算可以像草稿纸一样随心所欲,使计算机兼备高级计算器的优点。M atlab语言具有强大的矩阵和向量的操作功能,是Fo rtran和C语言无法比拟的;M a tlab语言的函数库可任意扩充;语句简单,内涵丰富;还具有二维和三维绘图功能且使用方便,特别适用于科学和工程计算。 在科学和工程计算中,应用最广泛的是求解线性方程组的解,一般可用高斯消去法求解,如果系数矩阵不满足高斯消去法在计算机上可行的条件,那么消元过程中可能会出现零主元或小主元,消元或不可行或数值不稳定,解决办法就是对方程组进行行交换或列交换来消除零主元或小主元,这就是选主元的思想。 1 定义 列主元三角分解:如果A为非奇异矩阵,则存在排列矩阵P,使PA=LU,其中L为单位下三角矩阵,U为上三角阵。列主元三角分角法是对直接三角分解法的一种改进,主要目的和列主元高斯消元法一样,

就是避免小数作为分母项. 2 算法概述 列主元三角分解法和普通三角分解法基本上类似,所不同的是在构造Gauss 变换前,先在对应列中选择绝对值最大的元素(称为列主元),然后实施初等行交换将该元素调整到矩阵对角线上。 例如第)1,,2,1(-=n k 步变换叙述如下: 选主元:确定p 使{}1)1( max -≤≤-=k ik n i k k pk a a ; 行交换:将矩阵的第k 行和第p 行上的元素互换位置,即 . 实施Gauss 变换:通过初行变换,将列主对角线以下的元素消为零.即 3 列主元三角分解在matlab 中的实现

三角矩阵

三角矩阵 在中,三角矩阵是的一种,因其非零系数的排列呈三角形状而得名。三角矩阵分上三角矩阵和下三角矩阵两种。上三角矩阵的对角线左下方的系数全部为零,下三角矩阵的对角线右上方的系数全部为零。三角矩阵可以看做是一般方阵的一种简化情形。比如,由于带三角矩阵的矩阵方程容易求解,在解多元线性方程组时,总是将其系数矩阵通过初等变换化为三角矩阵来求解;又如三角矩阵的行列式就是其对角线上元素的乘积,很容易计算。有鉴于此,在等分支中三角矩阵十分重要。一个可逆矩阵A可以通过变成一个下三角矩阵L与一个上三角矩阵U的乘积。 描述 一个如下形状的: 被称为下三角矩阵;同样的,一个如下形状的矩阵: 被称为上三角矩阵。 上(下)三角矩阵乘以系数后也是上(下)三角矩阵;上(下)三角矩阵间的加减法和运算的结果仍是上(下)三角矩阵;上(下)三角矩阵的逆也仍然是上(下)三角矩阵。这些事实说明:所有上(下)三角矩阵的集合以及相应的运算构成一个方形矩阵集合的一个子代数。然而要注意的是上三角矩阵与下三角矩阵的乘积一般并不是三角矩阵。 特殊的三角矩阵 严格三角矩阵

一个上(下)三角矩阵是严格上(下)三角矩阵其上的系数都为零。所有的是严格上(下)三角矩阵也形成一个子代数。所有的严格三角矩阵都是。 单位三角矩阵 一个上(下)三角矩阵是单位上(下)三角矩阵其上的系数都为1。单位三角矩阵都是幺幂矩阵。高斯矩阵 高斯矩阵是是单位三角矩阵中的一种,除了一列的系数以外,其他系数都是零。这类矩阵是中基本操作的矩阵体现,因此也叫做基元矩阵或高斯变换矩阵。一个下三角的高斯矩阵为: 高斯矩阵的逆仍然是高斯矩阵。实际上, 即是说一个高斯矩阵的逆是将其非对角线上元素加上负号后得到的矩阵。

稀疏矩阵的运算(完美版)

专业课程设计I报告(2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主

控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。 2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输

三角矩阵在压缩存储下的转置矩阵源代码

#include #include #define max 20 #define zero 0 typedef struct{ int i,j,v; }node; typedef struct{ node data[max]; int m; }TSmatrix; TSmatrix *Setmatrix(){ //建三对角矩阵TSmatrix *T; T=(TSmatrix *)malloc(sizeof(TSmatrix)); printf("请输入矩阵行数或列数:\n"); scanf("%d",&T->m); printf("建立三对角矩阵:\n"); for(int n=0;n<3*T->m-2;n++) scanf("%d%d%d",&T->data[n].i,&T->dat a[n].j,&T->data[n].v); return T; } TSmatrix *Trabsmatrix(TSmatrix *T){ //三对角矩阵转置 int n,k,temp; TSmatrix *F; F=(TSmatrix *)malloc(sizeof(TSmatrix)); F->m=T->m; for(n=0;n<3*T->m-2;n++){ //将结点信息存入新三元组表中 temp=2*T->data[n].j+T->data[n].i; //计算待存入三元数组下标 F->data[temp].i=T->data[n].j; F->data[temp].j=T->data[n].i; F->data[temp].v=T->data[n].v; } return F; } void TSmatrixout(TSmatrix *T){ //三对角矩阵输出 int a,b,n; n=0; for(a=0;am;a++){ for(b=0;bm;b++){ if(T->data[n].i==a&&T->data[n].j==b){ printf("%-5d",T->data[n].v); n++; } else printf("%-5d",zero); } printf("\n"); } } void main(){ TSmatrix *T; T=Setmatrix(); printf("三对角矩阵:\n"); TSmatrixout(T); T=Trabsmatrix(T); printf("转置后三对角矩阵:\n"); TSmatrixout(T); } 问题分析: 本程序要求实现对压缩存储下的三对角矩阵进行转置,为实现上述功能,需要解决的关键问题是三对角矩阵压缩存储及转置过程。 概要设计: 利用三元组表以行序为主序压缩存储三对角矩阵。转置时,先利用三元数组中的行标i 和列标j计算出待放入新三元数组的下标temp。由于转置时需要将行标和列标交换,所以temp=2*j+i。找出待存入的下标后,将相应的信息存入下标为temp的三元数组中。 详细设计:

稀疏矩阵及其压缩存储方法

稀疏矩阵及其压缩存储方法 1.基本概念 稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数。 设m行n列的矩阵含t个非零元素,则称 以二维数组表示高阶的稀疏矩阵时,会产生零值元素占的空间很大且进行了很多和零值的运算的问题。 特殊矩阵:值相同的元素或0元素在矩阵中的分布有一定的规律。如下三角阵、三对角阵、稀疏矩阵。 压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间。目的是节省大量存储空间。 n x n的矩阵一般需要n2个存储单元,当为对称矩阵时需要n(1+n)/2个单元。 2.三元组顺序表——压缩存储稀疏矩阵方法之一(顺序存储结构) 三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。当矩阵中的非0元素少于1/3时即可节省存储空间。 (1)稀疏矩阵的三元组顺序表存储表示方法 #define MAXSIZE 12500 // 假设非零元个数的最大值为12500 typedef struct { int i, j; // 该非零元的行下标和列下标 ElemType e; //非零元素的值 } Triple; // 三元组类型 typedef union { //共用体 Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用 int mu, nu, tu; // 矩阵的行数、列数和非零元个数 } TSMatrix; // 稀疏矩阵类型 (2)求转置矩阵的操作 ◆用常规的二维数组表示时的算法 for (col=1; col<=nu; ++col) for (row=1; row<=mu; ++row) T[col][row] = M[row][col]; 其时间复杂度为: O(mu×nu) ◆用三元组顺序表表示时的快速转置算法 Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) { // 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; if (T.tu) { for (col=1; col<=M.nu; ++col) num[col] = 0; for (t=1; t<=M.tu; ++t) ++num[M.data[t].j];// 求M 中每一列所含非零元的个数

第四章线性方程组直接法,矩阵三角分解

第四章 习题答案 1。用Gauss 消去法解方程组 1231231 2323463525433032 x x x x x x x x x ++=?? ++=??++=? 解:方程组写成矩阵形式为12323463525433032x x x ?????? ? ? ? = ? ? ? ? ? ????? ?? 对其进行Gauss 消去得12323441 4726002x x x ?? ???? ? ? ? ?-= ? ? ? ? ? ?????-?? 得方程组12312323 32346 131 44 822 24 x x x x x x x x x ++=?=-???? -=-?=????=?-=-?? 2。用Gauss 列主元素消去法解方程组 1233264107075156x x x -?????? ? ? ?-= ? ? ? ? ? ?-???? ?? 解:因为第一列中10最大,因此把10作为列主元素 1233264107075156x x x -?????? ? ? ?-= ? ? ? ? ? ?-??????12r r ????→1231070732645156x x x -?????? ? ? ?-= ? ? ? ? ? ?-???? ?? 21 3113 10122 31070716106101055052 2r r r r x x x +-? ??? ? ?-?? ? ? ? ? ????→-= ? ? ? ? ? ??? ? ?????23 r r ????→123107075505221 61061010x x x ? ??? ? ?-?? ? ? ? ? ?= ? ? ? ? ? ? ?? ? ?-????

稀疏矩阵基本操作 实验报告

稀疏矩阵基本操作实验报告 一、实验内容 稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相乘等算法 二、实验目的 1.熟悉数组、矩阵的定义和基本操作 2.熟悉稀疏矩阵的储存方式和基本运算 3.理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出和转置算法 三、实验原理 1.使用三元组储存矩阵中的非零元素(三元组分别储存非零元素的行下标,列下标和 元素值)。除了三元组表本身,储存一个稀疏矩阵还需要额外的三个变量,分别储存矩阵的非零元个数,矩阵的行数和矩阵的列数。 2.稀疏矩阵的创建算法: 第一步:根据矩阵创建一个二维数组,表示原始矩阵 第二步:取出二维数组中的元素(从第一个元素开始取),判断取出元素是否为非零元素,如果为非零元素,把该非零元素的数值以及行下标和列下表储存到三元数组表里,否则取出下一个元素,重复该步骤。 第三步:重复第二步,知道二维数组中所有的元素已经取出。 3.稀疏矩阵倒置算法: 第一步:判断进行倒置的矩阵是否为空矩阵,如果是,则直接返回错误信息。 第二步:计算要倒置的矩阵每列非零元素的数量,存入到num数组(其中num[i] 代表矩阵中第i列非零元素的个数)。以及倒置后矩阵每行首非零元的位置,存入cpot 数组中(其中cpot表示倒置后矩阵每行非零元的位置,对应表示原矩阵每列中第一个非零元的位置)。 第三步:确定倒置后矩阵的行数和列数。 第四步:取出表示要导致矩阵中三元组表元素{e, I, j}(第一次取出第一个,依次取出下一个元素),从第二步cpot数组中确定该元素倒置后存放的位置(cpot[j]),把该元素的行下标和列下标倒置以后放入新表的指定位置中。cpot[j] 变量加一。 第五步:重复第四步,直到三元组表中所有的元素都完成倒置。 第六步:把完成倒置运算的三元组表输出。 4.稀疏矩阵加法算法: 第一步:检查相加两个矩阵的行数和列数是否相同,如果相同,则进入第二步,否则输出错误信息。 第二步:定义变量i和j,用于控制三元组表的遍历。 第三步:比较变量矩阵M中第i个元素和矩阵N中第j个元素,如果两个元素是同一行元素,如果不是则进入第四步,如果是,再继续比较两个元素是否为同一列元素,如果是,把两个元素值相加,放到三元组表中;否则把列下表小的元素依次放到三元组表中。进入第五步 第四步:如果矩阵M中第i个元素的行下标大于矩阵N中第j个元素的行下标,则把矩阵N中第j个元素所在行的所有非零元素添加到三元组表中;如果矩阵M中第

三 矩阵直接三角分解法

矩阵直接三角分解法 1、实验目的: 求解方程组Ax=b A=[1 2 -12 8; 5 4 7 -2; -3 7 9 5; 6 -12 -8 3], b=[27; 4; 11; 49] 2、实验步骤: 添加库函数 #include "stdafx.h" #include "math.h" 3、代码: #include "stdafx.h" #include "math.h" void main() { float x[4]; int i; float a[4][5]={1,2,-12,8,27,5,4,7,-2,4,-3,7,9,5,11,6,-12,-8,3,49}; void DirectLU(float*,int,float[]); DirectLU(a[0],4,x); for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]); } void DirectLU(float*u,int n,float x[]) {

int i,r,k; for(r=0;r<=n-1;r++) { for(i=r;i<=n;i++) for(k=0;k<=r-1;k++) *(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i)); for(i=r+1;i<=n-1;i++) { for(k=0;k<=r-1;k++) *(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r)); *(u+i*(n+1)+r)/=*(u+r*(n+1)+r); } } for(i=n-1;i>=0;i--) { for(r=n-1;r>=i+1;r--) *(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r]; x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i)); } }

数据结构实验五矩阵的压缩存储与运算

第五章矩阵的压缩存储与运算 【实验目的】 1. 熟练掌握稀疏矩阵的两种存储结构(三元组表和十字链表)的实现; 2. 掌握稀疏矩阵的加法、转置、乘法等基本运算; 3. 加深对线性表的顺序存储和链式结构的理解。 第一节知识准备 矩阵是由两个关系(行关系和列关系)组成的二维数组,因此对每一个关系上都可以用线性表进行处理;考虑到两个关系的先后,在存储上就有按行优先和按列优先两种存储方式,所谓按行优先,是指将矩阵的每一行看成一个元素进行存储;所谓按列优先,是指将矩阵的每一列看成一个元素进行存储;这是矩阵在计算机中用一个连续存储区域存放的一般情形,对特殊矩阵还有特殊的存储方式。 一、特殊矩阵的压缩存储 1. 对称矩阵和上、下三角阵 若n阶矩阵A中的元素满足 = (0≤i,j≤n-1 )则称为n阶对称矩阵。对n阶对称矩阵,我们只需要存储下三角元素就可以了。事实上对上三角矩阵(下三角部分为零)和下三角矩阵(上三角部分为零),都可以用一维数组ma[0.. ]来存储A的下三角元素(对上三角矩阵做转置存储),称ma为矩阵A的压缩存储结构,现在我们来分析以下,A和ma之间的元素对应放置关系。 问题已经转化为:已知二维矩阵A[i,j],如图5-1, 我们将A用一个一维数组ma[k]来存储,它们之间存在着如图5-2所示的一一对应关系。 任意一组下标(i,j)都可在ma中的位置k中找到元素m[k]= ;这里: k=i(i+1)/2+j (i≥j) 图5-1 下三角矩阵 a00 a10 a11 a20 … an-1,0 … an-1,n-1 k= 0 1 2 3 … n(n-1)/2 … n(n+1)/2-1 图5-2下三角矩阵的压缩存储 反之,对所有的k=0,1,2,…,n(n+1)/2-1,都能确定ma[k]中的元素在矩阵A中的位置(i,j)。这里,i=d-1,(d是使sum= > k的最小整数),j= 。 2. 三对角矩阵

上三角矩阵

1.题目:请找出矩阵(上三角矩阵)的规律,并使用Java实现任意N(N为整数,1 2) { a[i][j] = a[i - 1][j] + i - 1; } else if (j > 1) { a[i][j] = i + j - 1 + a[i][j - 1]; } } } for(int m = 1;m<=a.length-1;m++){ for(int k =1;k<=a[m].length-1;k++){ if(a[m][k]==0){ continue; }else

稀疏矩阵的运算(完美版)

专业课程设计I报告( 2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名鹏宇 班级学号 09003018 指导教师卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。

2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。 (3)稀疏矩阵的转置: 此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始

列主元高斯消去法和列主元三角分解法解线性方程

计算方法实验报告1 【课题名称】 用列主元高斯消去法和列主元三角分解法解线性方程 【目的和意义】 高斯消去法是一个古老的求解线性方程组的方法,但由它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法。 用高斯消去法解线性方程组的基本思想时用矩阵行的初等变换将系数矩阵A 约化为具有简单形式的矩阵(上三角矩阵、单位矩阵等),而三角形方程组则可以直接回带求解 用高斯消去法解线性方程组b Ax =(其中A ∈Rn ×n )的计算量为:乘除法运算步骤为 32(1)(1)(21)(1)(1)262233n n n n n n n n n n n MD n ----+= +++=+-,加减运算步骤为 (1)(21)(1)(1)(1)(25) 6226n n n n n n n n n n AS -----+= ++= 。相比之下,传统的克莱姆 法则则较为繁琐,如求解20阶线性方程组,克莱姆法则大约要19 510?次乘法,而用高斯消 去法只需要3060次乘除法。 在高斯消去法运算的过程中,如果出现abs(A(i,i))等于零或过小的情况,则会导致矩阵元素数量级严重增长和舍入误差的扩散,使得最后的计算结果不可靠,所以目前计算机上常用的解低阶稠密矩阵方程的快速有效的方法时列主元高斯消去法,从而使计算结果更加精确。 2、列主元三角分解法 高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A=LU ,并求解Ly=b 的过程。回带过程就是求解上三角方程组Ux=y 。所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法 采用选主元的方式与列主元高斯消去法一样,也是为了避免除数过小,从而保证了计算的精确度

上三角矩阵代数

上三角矩阵代数 摘 要 本文主要研究上三角代数的性质及其与路代数的关系,建立了上三角代数与有向图的路代数的同构映射.定义了可上三角化代数()n P K 和上三角化矩阵P , ()n P K 是所有形如1P TP -的矩阵的集合所形成的代数(它的结合法是矩阵的加法和乘法),其中T ∈()n T K ,P ∈()n M K ,且P 可逆,称P 为()n P K 的上三角化矩阵.初步探讨了()n M K 的子代数是否是可上三角化代数,若是可上三角化代数,其上三角化矩阵是否唯一.具体讨论了n=2的情况,最终由()n M K 的可上三角化子代数的个数有限得出()n M K 至少有一个可上三角化代数的上三角化矩阵不唯一地结论. 关键词:上三角矩阵代数,有向图,路代数,可上三角化代数,上三角化矩阵 HIGHER TRIANGULAR MATRIX ALGEBRAS

ABSTRACT In this paper, we study upper triangular matrix algebras, and its connection with path algebras. The isomorphism between upper triangular matrix algebra and the corresponding path algebra is given. As a generalization, upper triangulable matrix algebras ()n P K and upper triangulable matrix P are defined and studied. ()n P K consisting of all matrices like 1P TP -(its combination is the addition and multiplication of matrices), Among them T ∈()n T K ,P ∈()n M K and P is reversible. we call P is the upper triangulable matrix of ()n P K . We also discuss whether the subalgebra of ()n M K is a upper triangular matrix algebra and the upper triangulable matrix of a upper triangular matrix algebra is unique. We also give a concrete example of n=2 to illustrate our theory. Finally we draw a conclusion that there is at least one upper triangular matrix algebra of ()n M K which its upper triangulable matrix is not unique . KEY WORDS : upper triangle matrix algebras ,quivers ,path algebras ,upper triangular matrix algebras ,upper triangulable matrix 目录

压缩矩阵的运算

实验四数组的运算 实验目的: 掌握稀疏矩阵的压缩存储方法及主要运算的实现。 实验内容与要求: 设计一个稀疏矩阵计算器,要求能够:⑴输入并建立稀疏矩阵;⑵输出稀疏矩阵;⑶执行两个矩阵相加;⑷执行两个矩阵相乘;⑸求一个矩阵的转置矩阵;⑹求一个矩阵的逆矩阵(选做)。 实验代码: Rect.h #define MAXSIZE100 typedef struct { int h_num; int v_num; int elem; }Triple; typedef struct { Triple *arry; int h_i; int v_j; int elem_num; }TSMatrix; void Init_TS(TSMatrix *T ); void creat(TSMatrix *T); void Print_TS(TSMatrix *); void sum_TS(TSMatrix *T1,TSMatrix *T2,TSMatrix *T); void mul_TS(TSMatrix *T1,TSMatrix *T2,TSMatrix *T); void transpose_TS(TSMatrix *T); void equal_Triple(Triple *t1,Triple *t2); Rect.cpp #include #include #include"rect.h"

void Init_TS(TSMatrix *T) { T->arry=(Triple *)malloc(MAXSIZE*sizeof(Triple)); if(!T->arry) printf("error\n") ; T->elem_num=0; T->h_i=0; T->v_j=0; } void Init_Tr(Triple *t) { t->elem=0; t->h_num=0; t->v_num=0; } void creat(TSMatrix *T) { printf("要输入的数组的行数和列数\n"); scanf("%d,%d",&T->h_i,&T->v_j); printf("要输入稀疏数组的元素个数\n"); scanf("%d",&T->elem_num); printf("输入要输入的稀疏数组的信息\n"); printf("行值列值元素值\n"); for(int i=0;ielem_num;i++) { scanf("%d %d %d",&T->arry[i].h_num,&T->arry[i].v_num,&T->arry[i].elem); } }; void Print_TS(TSMatrix *T) { printf("输出稀疏数组的信息\n"); printf("行下标列下标元素值\n"); for(int i=0;ielem_num;i++) { printf("%d %d %d\n",T->arry[i].h_num,T->arry[i].v_num,T->arry[i].elem); } }; void sum_TS(TSMatrix *T1,TSMatrix *T2,TSMatrix *T) { T->h_i=T1->h_i;T->v_j=T1->v_j;

相关文档
最新文档