求三角矩阵在压缩存储下的转置矩阵

合集下载

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

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

数据结构实验五矩阵的压缩存储与运算第五章矩阵的压缩存储与运算【实验目的】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-1k= 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。

规律分布特殊矩阵的压缩存储

规律分布特殊矩阵的压缩存储
三角矩阵大体分为三类:下三角矩阵、上三角矩阵、对称矩阵。对于一个 n 阶矩阵 A 来 说:若当 i <j 时,有 a ij =c(典型情况 c=0 ),则称此矩阵为下三角矩阵;若当 i>j 时,有 aij =c(典型情 况 c=0 ),则称此矩阵为上三角矩阵;若矩阵中的所有元素均满足 aij =aji,则称此矩阵为对称矩 阵。
【本节要点】
= Loc( A[ 1 ][ 1 ])+( 2 ( i-1 )+ j -1)*size
1、 规律分布特殊矩阵的压缩存储原则:按规律存放非零元素;
2、 按规律找出地址计算公式
思考题:类同按行为主序,请给出按列或按行为主序条件下上三角矩阵以及对称矩阵的 相关推导。 2 .带状矩阵
( 1 )带状矩阵描述:在矩阵中的所有非零元素都集中在以主对角线为中心的带状区域中。 其中最常见的是三对角带状矩阵,如图 3 所示。
a11 A12
a21 A22 a23
A32 a33 a34
( 2 )三对角带状矩阵特点
数组 C
a11 a12 a21 a22 a23 a31 … ann
Loc(i,j)
1 2 3 4 5 6 … 3n-2
图 4 带状矩阵的压缩形式
②确定非零元素在一维数组空间中的地址 Loc ( A[ i][ j])= Loc ( A[ 1 ][ 1 ])+(前 i-1 行非零元素个数+第 i 行中 aij 前非零元素个
数)*size 前 i-1 行元素个数=3 ×( i-1 )- 1 (因为第 1 行只有 2 个非零元素); 第 i 行中 ai j 前非零元素个数=j-i +1 ,其中
j-i=
-1 ( j<i) 0 (j=i) 1 (j>i)

特殊矩阵的压缩存储

特殊矩阵的压缩存储

中北大学数据结构课程设计说明书2011年12月20日1.设计任务概述问题描述:1)对于特殊矩阵可以通过压缩存储减少存储空间。

基本要求:1)针对多种特殊矩阵进行压缩存储,并能显示压缩后的相关地址和值;2)输入在原来特殊矩阵中的地址,要求能从压缩后的矩阵中读出相应的值。

2.本设计所采用的数据结构应用了关于数组以及顺序存储3.功能模块详细设计3.1 详细设计思想特殊矩阵:值相同元素或者零元素分布有一定规律的矩阵称为特殊矩阵例:对称矩阵、上(下)三角矩阵都是特殊矩阵特殊矩阵压缩存储(以对称矩阵为例)对称矩阵是满足下面条件的n 阶矩阵: aij= aji 1<= i,j<= nk= 0 1 2 3 4 5 6 n(n+1)/2-1对称矩阵元素可以只存储下三角部分,共需n(n+1)/2 个单元的空间( 三角矩阵的存储方式类似)以一维数组sa[0..n(n+1)/2-1]作为n 阶对称矩阵A的存储结构A中任意一元素aij与它的存储位置sa[k] 之间关系:k= 0 1 2 3 4 5 6 n(n+1)/2-13.2 核心代码static shangsanjiao(int n){int i,j,k,z,g;int L[100][100],SA[100];printf("请输入您要压缩矩阵的行列数\n");scanf("%d",&n);printf("请输入您的矩阵内元素:\n");for(i=1;i<n+1;i++)for(j=1;j<n+1;j++){scanf("%d",&L[i][j]);if(i<=j)k=j*(j-1)/2+i-1;elsek=n*(n+1)/2;SA[k]=L[i][j];}printf("您输入的矩阵为:\n");for(i=1;i<n+1;i++){for(j=1;j<n+1;j++)printf("%d ",L[i][j]);printf("\n");}printf("压缩存储后:\n");for(k=0;k<n*(n+1)/2+1;k++)printf("%d %d\n",k,SA[k]);printf("若要读取矩阵的值请输入'100'退出输入'000'。

三角矩阵

三角矩阵

三角矩阵在线性代数中,三角矩阵是方形矩阵的一种,因其非零系数的排列呈三角形状而得名。

三角矩阵分上三角矩阵和下三角矩阵两种。

上三角矩阵的对角线左下方的系数全部为零,下三角矩阵的对角线右上方的系数全部为零.三角矩阵可以看做是一般方阵的一种简化情形。

比如,由于带三角矩阵的矩阵方程容易求解,在解多元线性方程组时,总是将其系数矩阵通过初等变换化为三角矩阵来求解;又如三角矩阵的行列式就是其对角线上元素的乘积,很容易计算。

有鉴于此,在数值分析等分支中三角矩阵十分重要。

一个可逆矩阵A可以通过LU分解变成一个下三角矩阵L与一个上三角矩阵U的乘积。

描述一个如下形状的矩阵:被称为下三角矩阵;同样的,一个如下形状的矩阵:被称为上三角矩阵.上(下)三角矩阵乘以系数后也是上(下)三角矩阵;上(下)三角矩阵间的加减法和乘法运算的结果仍是上(下)三角矩阵;上(下)三角矩阵的逆也仍然是上(下)三角矩阵。

这些事实说明:所有上(下)三角矩阵的集合以及相应的运算构成一个方形矩阵集合的一个子代数。

然而要注意的是上三角矩阵与下三角矩阵的乘积一般并不是三角矩阵。

特殊的三角矩阵严格三角矩阵一个上(下)三角矩阵是严格上(下)三角矩阵当且仅当其主对角线上的系数都为零。

所有的是严格上(下)三角矩阵也形成一个子代数.所有的严格三角矩阵都是幂零矩阵。

单位三角矩阵一个上(下)三角矩阵是单位上(下)三角矩阵当且仅当其主对角线上的系数都为1。

单位三角矩阵都是幺幂矩阵.高斯矩阵高斯矩阵是是单位三角矩阵中的一种,除了一列的系数以外,其他系数都是零.这类矩阵是高斯消去法中基本操作的矩阵体现,因此也叫做基元矩阵或高斯变换矩阵.一个下三角的高斯矩阵为:高斯矩阵的逆仍然是高斯矩阵。

实际上,即是说一个高斯矩阵的逆是将其非对角线上元素加上负号后得到的矩阵。

性质一个同时是上三角矩阵和下三角矩阵的矩阵必然是对角矩阵.单位矩阵是唯一同时为单位上三角矩阵和单位下三角矩阵的矩阵。

分别计算乘积A*A与AA*的系数并进行比较后就可以发现:一个同时为三角矩阵和正规矩阵的矩阵也必然是对角矩阵(因为正规矩阵满足A*A='AA*)。

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

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

#include<stdio.h>#include<stdlib.h>#define max 20#define zero 0typedef 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;a<T->m;a++){for(b=0;b<T->m;b++){if(T->data[n].i==a&&T->data[n].j==b){printf("%-5d",T->data[n].v);n++;}elseprintf("%-5d",zero);}printf("\n");}}void main(){TSmatrix *T;T=Setmatrix();printf("三对角矩阵:\n");TSmatrixout(T);T=Trabsmatrix(T);printf("转置后三对角矩阵:\n");TSmatrixout(T);}问题分析:本程序要求实现对压缩存储下的三对角矩阵进行转置,为实现上述功能,需要解决的关键问题是三对角矩阵压缩存储及转置过程。

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

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

稀疏矩阵及其压缩存储方法1.基本概念稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数。

设m行n列的矩阵含t个非零元素,则称以二维数组表示高阶的稀疏矩阵时,会产生零值元素占的空间很大且进行了很多和零值的运算的问题。

特殊矩阵:值相同的元素或0元素在矩阵中的分布有一定的规律。

如下三角阵、三对角阵、稀疏矩阵。

压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间。

目的是节省大量存储空间。

n x n的矩阵一般需要n2个存储单元,当为对称矩阵时需要n(1+n)/2个单元。

2.三元组顺序表——压缩存储稀疏矩阵方法之一(顺序存储结构)三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。

它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。

当矩阵中的非0元素少于1/3时即可节省存储空间。

(1)稀疏矩阵的三元组顺序表存储表示方法#define MAXSIZE 12500 // 假设非零元个数的最大值为12500typedef 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的转置矩阵TT.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 中每一列所含非零元的个数cpot[1] = 1;for (col=2; col<=M.nu; ++col) cpot[col] = cpot[col-1] + num[col-1];// 求M 中每一列的第一个非零元在b.data 中的序号for (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];} // for} // ifreturn OK;} // FastTransposeSMatrix其时间复杂度为: O(mu +nu)3.行逻辑联接的顺序表——压缩存储稀疏矩阵方法之二(链接存储结构)行逻辑联接的顺序表:稀疏矩阵中为了随机存取任意一行的非0元素,需要知道每一行的第一个非0元素在三元组表中的位置,因此将上述快速转置算法中指示行信息的辅助数组cpot 固定在稀疏矩阵的存储结构中,让每一行对应一个单链表,每个单链表都有一个表头指针,这种“带行链接信息”的三元组表即称为行逻辑联接的顺序表。

勘误表

勘误表

《数据结构及算法》勘误表P6 图1-5修改,其正确形式如下(注意单实线和双实线)P13 算法1-1代码正数第2行将“void MatrixMultiply(int A[a], int B[n][n], int C[n][n]) {”改为“void MatrixMultiply(int A[n][n], int B[n][n], int C[n][n]) {”P29 算法2-11,正数第15行将“p=L; j=0;”改为“p=L->next; j=1;”P29 正数第16行将“while((p->next)&&(j<i)) { p=p->next; ++j; }”改为“while(p&&(j<i)) { p=p->next; ++j; }”P29 正数第17行将“if(!(p->next)||(j>=i)) ErrorMessage("输入的i值不合理!");”改为“if(!(p->next)||(j>i)) ErrorMessage("输入的i值不合理!");”P34 正数第7行将“④将p结点赋给新结点的后向指针域;”改为“④将p结点的指针赋给新结点的后向指针域;”P37 倒数第4行将“while((i<=A.length)&&(j<=B.length))”改为“while((i<A.length)&&(j<B.length))”P38 正数第4行将“while(i<=A.length)”改为“while(i<A.length)”P38 正数第7行将“while(j<=B.length)”改为“while(j<B.length)”P38 算法2-20代码开始正数第3行将“while((j<=A.length)&&(j<=B.length))”改为“j=0;while((j<A.length)&&(j<B.length))”P52 算法3-7代码开始正数第3行将“S=new LNode;”改为“S=new S Node;”P53 算法3-10代码开始正数第3行将“if(S->next) EmptyMessage("链栈S空!");”改为“if(!(S->next)) EmptyMessage("链栈S空!");”P54 算法3-12代码开始正数第3行将“if(S->next) EmptyMessage("链栈S空!");”改为“if(!(S->next)) EmptyMessage("链栈S空!");”P61 算法3-22代码开始正数第3行将“if(Q.front->next) EmptyMessage("链队列Q空!");”改为“if(!(Q.front->next)) EmptyMessage("链队列Q空!");”P61 算法3-24代码开始正数第3行将“if(Q.front==Q.rear) EmptyMessage("链队列Q空!");”改为“if(!(Q.front->next)) EmptyMessage("链队列Q空!");”P63 算法3-26代码开始正数第16行将“if(k=1) return 1;”改为“if(k==1) return 1;”P76 正数22行将“(2) 确定两个串的最大相等前缀子串,"s1 s1 … s k "="t1 t1 … t k"(其中1≤k≤m,1≤k≤n)。

中南大学数据结构与算法第5章数组和广义表课后作业答案

中南大学数据结构与算法第5章数组和广义表课后作业答案

第5章数组与广义表习题练习答案5.1请按行及按列优先顺序列出四维数组A2*3*2*3的所有元素在内存中的存储次序,开始结点为a0000。

解:按行优先的顺序排列时,先变化右边的下标,也就是右到左依次变化,这个四维数组的排列是这样的:(将这个排列分行写出以便与阅读,只要按从左到右的顺序存放就是在内存中的排列位置) a0000a0001a0002a0010a0011a0012a0100a0101a0102a0110a0111a0112a0200a0201a0202a0210a0211a0212a1000a1001a1002a1010a1011a1012a1100a1101a1102a1110a1111a1112a1200a1201a1202a1210a1211a1212按列优先的顺序排列恰恰相反,变化最快的是左边的下标,然后向右变化,所以这个四维数组的排列将是这样的,(这里为了便于阅读,也将其书写为分行形式):a0000a1000a0100a1100a0200a1200a0010a1010a0110a1110a0210a1210a0001a1001a0101a1101a0201a1201a0011a1011a0111a1111a0211a1211a0002a1002a0102a1102a0202a1202a0012a1012a0112a1112a0212a02125.2 给出C语言的三维数组地址计算公式。

解:因为C语言的数组下标下界是0,所以Loc(A mnp)=Loc(A000)+((i*n*p)+k)*d其中Amnp表示三维数组。

Loc(A000)表示数组起始位置。

i、j、k表示当前元素的下标,d表示每个元素所占单元数。

5.3设有三对角矩阵A n*n,将其三条对角线上的元素逐行地存储到向量B[0...3n-3]中,使得B[k]=a ij,求:(1)用i , j 表示k的下标变换公式。

(2)用k 表示i,j 的下标变换公式。

三元组压缩存储结构的稀疏矩阵的运算快速转置

三元组压缩存储结构的稀疏矩阵的运算快速转置

三元组压缩存储结构的稀疏矩阵的运算快速转置在计算机科学和数学领域中,稀疏矩阵是一种在大部分元素为零的矩阵。

由于其大部分元素为零,因此在存储和运算时存在着一些挑战。

为了解决这一问题,人们提出了三元组压缩存储结构,这种存储结构能够有效地压缩稀疏矩阵,并且能够实现快速的运算转置。

1.稀疏矩阵稀疏矩阵是一种大部分元素为零的矩阵,与之相对应的是稠密矩阵,其大部分元素为非零值。

稀疏矩阵通常在图像处理、文本处理、网络分析等领域中得到广泛应用。

然而,由于大部分元素为零,传统的存储方式会导致存储空间的浪费。

人们提出了三元组压缩存储结构,以解决稀疏矩阵存储的问题。

2.三元组压缩存储结构三元组压缩存储结构是一种用于表示稀疏矩阵的存储格式。

它采用三个数组来分别存储矩阵的非零元素的行坐标、列坐标和数值。

由于只需存储非零元素的信息,因此能够有效地压缩存储空间。

三元组压缩存储结构还能够实现快速的随机访问,这是由于它将矩阵的元素位置和数值分开存储,使得在进行运算时能够更为高效。

3.稀疏矩阵的运算稀疏矩阵的运算是对稀疏矩阵进行加法、减法、乘法等操作的过程。

在进行稀疏矩阵的运算时,三元组压缩存储结构能够显著提高计算效率。

这是由于在进行运算时,只需考虑非零元素,而无需考虑大量的零元素,从而减少了计算的复杂度。

4.稀疏矩阵的快速转置稀疏矩阵的转置是将矩阵的行和列交换,同时保持非零元素的位置和数值不变。

在传统的存储方式下,稀疏矩阵的转置操作相对复杂且耗时。

然而,采用三元组压缩存储结构后,稀疏矩阵的快速转置变得十分简便。

通过交换三元组中的行坐标和列坐标,即可完成稀疏矩阵的快速转置操作。

5.个人观点和理解我认为三元组压缩存储结构的出现,极大地解决了稀疏矩阵在存储和运算中的效率问题。

通过将矩阵的非零元素信息进行压缩存储,不仅节省了存储空间,同时也提高了计算效率。

在实际应用中,三元组压缩存储结构能够更好地满足对存储空间和计算效率有较高要求的场景,为稀疏矩阵的处理提供了更为便利和高效的途径。

n阶三角矩阵压缩存储对应空间

n阶三角矩阵压缩存储对应空间

n阶三角矩阵压缩存储对应空间「n阶三角矩阵压缩存储对应空间」是指将n阶三角矩阵通过一种特殊的存储方式进行压缩,以减少存储空间的使用。

在本文中,我将逐步解答这个主题,详细介绍n阶三角矩阵压缩存储对应的空间算法。

首先,我们先来了解一下什么是n阶三角矩阵。

n阶三角矩阵是指主对角线以下所有元素都为0的方阵。

例如,一个3阶三角矩阵可以表示如下:1 2 30 4 50 0 6对于一个n阶的三角矩阵,如果我们按照行优先的方式存储,那么需要占用n * n个存储空间。

但是,由于三角矩阵的性质,我们可以利用这种特殊的结构来进行压缩存储,从而减少占用的空间。

接下来,我们将介绍一种常用的压缩存储n阶三角矩阵的方法——斜三角矩阵压缩存储法。

这种方法的思路是,只存储主对角线及其上方或下方的非零元素,而主对角线以下的元素都为0,不需要存储。

为了实现斜三角矩阵的压缩存储,我们需要引入一个一维数组来存储非零元素。

具体的存储方式如下:1. 首先,计算斜三角矩阵中非零元素的总个数。

对于一个n阶三角矩阵,主对角线及其上方的非零元素个数为n * (n + 1) / 2。

如果我们将非零元素存储在一个一维数组中,这个数组的长度就是n * (n+ 1) / 2。

2. 然后,将斜三角矩阵中的非零元素按照一定的次序存储到这个一维数组中。

一种常用的存储次序是按照行优先的方式,先存储第一行的非零元素,然后是第二行、第三行,依次类推,直到存储完所有的非零元素。

3. 最后,我们可以利用一维数组的下标来对应斜三角矩阵中每个元素的位置。

对于一个n阶三角矩阵的元素A[i][j],我们可以通过一维数组的下标来对应,假设该元素在一维数组中的位置为k,则k = (i - 1) * i / 2 + j - 1。

通过斜三角矩阵压缩存储法,我们可以将一个n阶的三角矩阵压缩成一个只包含n * (n + 1) / 2个非零元素的一维数组,从而大大减少了存储空间的使用。

下面,我们通过一个具体的例子来进一步说明斜三角矩阵压缩存储的过程。

三对角矩阵压缩存储转置

三对角矩阵压缩存储转置

三对角矩阵压缩存储转置实验题目:实验八——矩阵实验程序设计2问题分析:1、题目要求:设计算法求三对角矩阵在压缩存储下的转置矩阵2、设计思路:定义一种新的数据结构三元组用来存放数据,该数据结构为以一维数组,结点包括三个量i、j、v,i、j分别用来记录矩阵中元素的下标,v用来记录元素值,这样交换时,仅对下标交换即可达到转置矩阵的目的3、输入与输出:只需输入三对角矩阵中所有非零元素的值,存放在三元组里,输出时,程序自动在没有数字元素处补零,以矩阵形式输出;4、转置:调用转置函数进行转置,转置时仅交换数据的下标5、测试数据:A、输入矩阵阶数:4输入第一行的两个元素:1 2输入第二、三行的元素,各三个:4 5 67 8 9输入最后一行的两个元素:3 8预测结果:原矩阵:转置后矩阵:1 2 0 0 1 4 0 04 5 6 0 2 5 7 00 7 8 9 0 6 8 30 0 3 8 0 0 9 8B、输入矩阵阶数:5输入第一行的两个元素:12 45输入第二、三行的元素,各三个:77 88 9944 55 6611 22 33输入最后一行的两个元素:14 82预测结果:原矩阵:转置后矩阵:12 45 0 0 0 12 77 0 0 077 88 99 0 0 45 88 44 0 00 44 55 66 0 0 99 55 11 00 0 11 22 33 0 0 66 22 140 0 0 14 82 0 0 0 33 82概要设计:1、为了实现上述程序功能,需定义三元组数据结构用来存储数据,建立三元组输入函数,输出函数和矩阵转置函数,最后在屏幕上输出结果;2、本程序包含4个函数:⑴主函数main()⑵三对焦矩阵建立函数Setmatrix()⑶转置函数Trabsmatrix()⑷输出函数Tsmatrixout()各函数关系如下:详细设计:1、数据结构与结点类型:typedef struct //定义结点类型{int i,j,v;}node;typedef struct //定义矩阵类型{node data[max];}TSmatrix;2、各函数的基本操作⑴三对角矩阵的建立函数TSmatrix *Setmatrix(){申请空间;输入第一行的两个元素;输入2~n-1行的元素,每行3个;返回;}⑵转置函数TSmatrix *Trabsmatrix(TSmatrix *T){建立新的三元组;把原三元组数据下标交换,放入新组;返回新三元组;}⑶输出函数void TSmatrixout(TSmatrix *T){定义变量a 、b=0;如果三元表中数据下表等于a 、b 的值,则输出该元素;否则,输出0;a++’;b++;}main() Setmatrix() Trabsmatrix() Tsmatrixout()源代码:#include#include#define max 20typedef struct //定义结点类型{}node;typedef struct //定义矩阵类型{node data[max];int m;}TSmatrix;TSmatrix *Setmatrix() //建立三对角矩阵{TSmatrix *T;T=(TSmatrix *)malloc(sizeof(TSmatrix));printf("请输入矩阵阶数:");scanf("%d",&T->m);printf("建立三对角矩阵:\n");printf("输入第一行的两个数:\n"); //第一行只有两个元素,单独输入 scanf("%d %d",&T->data[0].v,&T->data[1].v);T->data[0].i=0;T->data[0].j=0;T->data[1].i=0;T->data[1].j=1;printf("输入第二行至第%d行的数(每行3个):\n",T->m-1);int t=2;for(int p=1;pm-1;p++) //循环输入2~n-1行的元素,每行3个for(int q=p-1;q<p+2;q++)< p="">{T->data[t].j=q;T->data[t].i=p;scanf("%d",&T->data[t].v);t++;}printf("输入最后一行的两个数:\n"); //输入最后一行的两个元素scanf("%d %d",&T->data[3*T->m-4].v,&T->data[3*T->m-3].v);T->data[3*T->m-4].i=T->m-1;T->data[3*T->m-4].j=T->m-2;T->data[3*T->m-3].i=T->m-1;T->data[3*T->m-3].j=T->m-1;return T;}TSmatrix *Trabsmatrix(TSmatrix *T) //三对角矩阵转置{int n,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++){ //否则输出0if((T->data[n].i==a)&&(T->data[n].j==b)){printf("%d ",T->data[n].v);n++;}elseprintf("0 ");}printf("\n");}}void main(){TSmatrix *T;T=Setmatrix();printf("原三对角矩阵:\n");TSmatrixout(T);T=Trabsmatrix(T);printf("转置后三对角矩阵:\n");TSmatrixout(T);}调试分析:1、进行矩阵转置时本来采用把两数据进行交换的方法,但这样做容易使程序变的复杂,可读性变差,于是采用交换数据下标的方式,使思路更加清晰,也便于操作。

2022年北方民族大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北方民族大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北方民族大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。

A.快速排序B.堆排序C.归并排序D.直接插入排序2、无向图G=(V,E),其中:V={a,b,c,d,e,f},E={(a,b),(a, e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行深度优先遍历,得到的顶点序列正确的是()。

A.a,b,e,c,d,fB.a,c,f,e,b,dC.a,e,b,c,f, dD.a,e,d,f,c,b3、计算机算法指的是解决问题的步骤序列,它必须具备()三个特性。

A.可执行性、可移植性、可扩充性B.可执行性、确定性、有穷性C.确定性、有穷性、稳定性D.易读性、稳定性、安全性4、已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7}, E={<V1,V2>,<V1,V3>,<V1,V4>,<V2,V5>,<V3,V5>, <V3,V6>,<V4,V6>,<V5,V7>,<V6,V7>},G的拓扑序列是()。

A.V1,V3,V4,V6,V2,V5,V7B.V1,V3,V2,V6,V4,V5,V7C.V1,V3,V5,V2,V6,V7D.V1,V2,V5,V3,V4,V6,V75、在下列表述中,正确的是()A.含有一个或多个空格字符的串称为空格串B.对n(n>0)个顶点的网,求出权最小的n-1条边便可构成其最小生成树C.选择排序算法是不稳定的D.平衡二叉树的左右子树的结点数之差的绝对值不超过l6、循环队列放在一维数组A中,end1指向队头元素,end2指向队尾元素的后一个位置。

假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。

数据结构——矩阵压缩与压缩矩阵的转置与乘法计算

数据结构——矩阵压缩与压缩矩阵的转置与乘法计算

数据结构——矩阵压缩与压缩矩阵的转置与乘法计算 为什么要对矩阵进⾏压缩存储呢?对于⼀个n*m的矩阵,我们⼀般会想到开⼀个n*m的⼆维数组来存储,这样计算操作都很⽅便模拟,但当⼀个矩阵很⼤时,这样对于空间的开销与浪费是很可怕的,尤其是当矩阵变成多维时。

但我们往往不会在矩阵每⼀个位置都存有数据,很多矩阵元素其实是0,我们需要记录的只是那些⾮零元素,于是我们可以记录⾮零元素的位置与值,这样便可以⼤⼤减少空间上的浪费。

矩阵压缩存储代码(注意要按⾏顺序遍历存储矩阵⾮零元素):1 typedef struct {2int i, j; //⾮零元⾏下标与列下标3 ElemType e;4 }Triple;56 typedef struct {7 Triple data[MAXSIZE + 1];8int mu, nu, tu; //⾏数,列数,⾮零元个数9 }TSMatrix; 矩阵转置是矩阵运算中极为重要的操作,但矩阵压缩后我们不能再按原来的⽅式⽤n*m的遍历⽅式进⾏转置操作,那我们应该怎么进⾏转置呢,⾸先想到的是以列为参考值对元素进⾏遍历转置,这样访问元素的顺序正好是转制后存储的顺序,代码如下:1 Status TransposeSMatrix(TSMatrix M, TSMatrix & T) {2 T.mu = M.nu;3 T.nu = M.mu;4 T.tu = M.tu;5if(T.tu) {6int q = 1;7for(int col = 1; col <= M.nu; ++col)8for(int p = 1; p <= M.tu; ++p)9if(M.data[p].j == col) {10 T.data[q].i = M.data[p].j;11 T.data[q].j = M.data[p].i;12 T.data[q].e = M.data[p].e;13 ++q;14 }15 }16return OK;17 } 我们注意到当矩阵不那么稀疏时,⽐如如果这是⼀个稠密矩阵甚⾄n*m的空间⾥每⼀个位置都是⼀个⾮零元素,这时这个代码的复杂度达到了O(mu*nu*nu),⽐直接⽤数组存储的O(mu*nu)还要⼤⼀个数量级,这样节省⼀点空间浪费⼤量时间的做法显然是不合适的,我们考虑改进算法,我们注意到如果我们预先知道矩阵M每⼀列的第⼀个⾮零元素在T中应有的位置,那么转置中我们就可以直接把他放在那个位置,这时,我们考虑开辅助数组记录每⼀列第⼀个⾮零元素的位置,以及每⼀列⾮零元素的数量,但其实,每⼀列的第⼀个⾮零元素的位置就是前⼀列第⼀个⾮零元素位置加上前⼀列⾮零元素数量,我们每次维护剩余元素在剩余矩阵中每⼀列第⼀个⾮零元素的位置数组,就得到了下⾯的O(nu + tu)代码:1 Status FastTransposeSMtrix(TSMatrix M, TSMatrix &T) {2 T.mu = M.nu;3 T.nu = M.mu;4 T.tu = M.tu;5if(T.tu) {6int *num = new int[M.nu + 1], *cpot = new int[M.tu + 1];7for(int col = 1; col <= M.nu; ++ col)8 num[col] = 0;9for(int t = 1; t <= M.tu; ++t) ++num[M.data[t].j];10 cpot[1] = 1;11for(int col = 2; col <= M.nu; ++ col)12 cpot[col] = cpot[col - 1] + num[col - 1];13for(int p = 1; p <= M.tu; ++p) {14int col = M.data[p].j, q = cpot[col];15 T.data[q].i = M.data[p].j;16 T.data[q].j = M.data[p].i;17 T.data[q].e = M.data[p].e;18 ++cpot[col];19 }20delete num;21delete cpot;22 }23return OK;24 }矩阵转置到此就结束了,写进⼀个cpp效果就像下⾯这样,感兴趣的可以⾃⼰测试下效果:1 #include <iostream>2 #include <cstdio>3 #include <cstdlib>4 #include <cmath>5 #include <algorithm>6 #include <cstring>7 #include <vector>8 #include <string>9 #include <queue>10 #include <map>11 #include <set>1213#define FRER() freopen("in.txt", "r", stdin);14#define INF 0x3f3f3f3f1516using namespace std;1718//函数状态码定义19#define TRUE 120#define FALSE 021#define OK 122#define ERROR 023#define INFEASIBLE -124//#define OVERFLOW -22526 typedef int Status;27 typedef int ElemType;2829#define MAXSIZE 125003031 typedef struct {32int i, j; //⾮零元⾏下标与列下标33 ElemType e;34 }Triple;3536 typedef struct {37 Triple data[MAXSIZE + 1];38int mu, nu, tu; //⾏数,列数,⾮零元个数39 }TSMatrix;4041 Status TransposeSMatrix(TSMatrix M, TSMatrix & T) {42 T.mu = M.nu;43 T.nu = M.mu;44 T.tu = M.tu;45if(T.tu) {46int q = 1;47for(int col = 1; col <= M.nu; ++col)48for(int p = 1; p <= M.tu; ++p)49if(M.data[p].j == col) {50 T.data[q].i = M.data[p].j;51 T.data[q].j = M.data[p].i;52 T.data[q].e = M.data[p].e;53 ++q;54 }55 }56return OK;57 }5859 Status FastTransposeSMtrix(TSMatrix M, TSMatrix &T) {60 T.mu = M.nu;61 T.nu = M.mu;62 T.tu = M.tu;63if(T.tu) {64int *num = new int[M.nu + 1], *cpot = new int[M.tu + 1]; 65for(int col = 1; col <= M.nu; ++ col)66 num[col] = 0;67for(int t = 1; t <= M.tu; ++t) ++num[M.data[t].j];68 cpot[1] = 1;69for(int col = 2; col <= M.nu; ++ col)70 cpot[col] = cpot[col - 1] + num[col - 1];71for(int p = 1; p <= M.tu; ++p) {72int col = M.data[p].j, q = cpot[col];73 T.data[q].i = M.data[p].j;74 T.data[q].j = M.data[p].i;75 T.data[q].e = M.data[p].e;76 ++cpot[col];77 }78delete num;79delete cpot;80 }81return OK;82 }8384int main()85 {86//FRER()8788 TSMatrix MatrixA, MatrixB;89 cin >> MatrixA.mu >> MatrixA.nu >> MatrixA.tu;90for(int i = 1; i <= MatrixA.tu; ++i)91 cin >> MatrixA.data[i].i >> MatrixA.data[i].j >> MatrixA.data[i].e;92//TransposeSMatrix(MatrixA, MatrixB);93 FastTransposeSMtrix(MatrixA, MatrixB);94for(int i = 1; i <= MatrixB.tu; ++i)95 cout << MatrixB.data[i].i << '' << MatrixB.data[i].j << '' << MatrixB.data[i].e << endl;9697return0;98 }99100/*测试数据1016 7 81021 2 121031 3 91043 1 -31053 6 141064 3 241075 2 181086 1 151096 4 -7110*/ 接下来是压缩矩阵的乘法,类似转置,我们直接在矩阵结构体⾥开⼀个数组⽤来存矩阵每⼀⾏第⼀个⾮零元素的在M中位置,就像这样:1 typedef struct {2 Triple data[MAXSIZE + 1]; //⾮零元三元组表3int rops[MAXSIZE + 1]; //各⾏第⼀个⾮零元位置4int mu, nu, tu; //⾏数,列数,⾮零元个数5 }RLSMatrix; 由于稀疏矩阵相乘不⼀定还是稀疏矩阵,所以我们要根据结果判断元素是否是⾮零元,模拟乘法运算如下:1 Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix & Q) {2if(M.nu != N.mu) return ERROR;3 Q.mu = M.mu;4 Q.nu = N.nu;5 Q.tu = 0;6int *ctemp = new int[Q.nu + 1];78if(M.mu * N.nu != 0) {9for(int arow = 1; arow <= M.mu; ++arow) {10int tp;11 memset(ctemp, 0, (Q.nu + 1) * sizeof(int));12 Q.rops[arow] = Q.tu + 1;13if(arow < M.mu)14 tp = M.rops[arow + 1];15else16 tp = M.tu + 1;17for(int p = M.rops[arow]; p < tp; ++p) { //对当前⾏的每⼀个⾮零元进⾏计算18int brow = M.data[p].j; //找到对应元在N中的标号19int t;20if(brow < N.mu) t = N.rops[brow + 1];21else t = N.tu + 1;22for(int q = N.rops[brow]; q < t; ++q) {23int ccol = N.data[q].j;24 ctemp[ccol] += M.data[p].e * N.data[q].e;25 }26 }27for(int ccol = 1; ccol <= Q.nu; ++ccol) //压缩存储该⾏⾮零元28if(ctemp[ccol]) {29if(++Q.tu > MAXSIZE) return ERROR;30 Q.data[Q.tu].i = arow;31 Q.data[Q.tu].j = ccol;32 Q.data[Q.tu].e = ctemp[ccol];33 }34 }35 }36return OK;37 }。

三对角矩阵的转置

三对角矩阵的转置

//三对角矩阵压缩存储下在的转置.#include <stdio.h>#include <malloc.h>#define size 100typedef struct{int a[size][size];}Sql1;typedef struct{int s[size];}Sql2;Sql1 *Input(Sql1 *A,int n);//输入的子函数Sql2 *Storage(Sql1 *A,Sql2 *S,int n);//存储的子函数void Transpose(Sql2 *S,int n); //转置的子函数void Output(Sql2 *S,int n); //输出地函数void Output1(Sql2 *S,int n);void main(){int n;Sql1 *A=NULL;Sql2 *S=NULL;printf("请输入矩阵的阶数:");scanf("%d",&n);A=Input(A,n);S=Storage(A,S,n);Output1(S,n);Transpose(S,n);Output(S,n);}Sql1 *Input(Sql1 *A,int n){int i,j;A=malloc(sizeof(Sql1));printf("请输入三对角矩阵的元素:\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&A->a[i][j]);return A;}Sql2 *Storage(Sql1 *A,Sql2 *S,int n){int i,j;S=malloc(sizeof(Sql2));for(i=0;i<n;i++)for(j=0;j<n;j++){if(A->a[i][j]!=0)S->s[2*i+j]=A->a[i][j];}free(A);return S;}void Transpose(Sql2 *S,int n)//转置{int i,t;for(i=1;i<3*n-2;i=i+3){t=S->s[i];S->s[i]=S->s[i+1];S->s[i+1]=t;}}void Output1(Sql2 *S,int n){int i,j=n;printf("转置前的对三角矩阵:\n"); for(i=0;i<3*n-2;i++)printf("%d ",S->s[i]);printf("\n");}void Output(Sql2 *S,int n){int i,j=n;printf("转置后的三对角矩阵:\n"); for(i=0;i<3*n-2;i++)printf("%d ",S->s[i]);printf("\n");}。

三元组结构实现稀疏矩阵转置算法的分析

三元组结构实现稀疏矩阵转置算法的分析

三元组结构实现稀疏矩阵转置算法的分析文章简要叙述了稀疏矩阵压缩存储的三元组表示法及其基于此种结构的矩阵的转置运算。

探讨了基于三元组结构的矩阵转置算法的具体实现方法及其时空复杂度的问题。

【关键词】稀疏矩阵压缩存储三元组转置算法在一些特殊矩阵中,如对称矩阵和上下三角矩阵,非零元素一般都有明显的规律,从而都可以压缩到一维数组里面,然而,实际应用中经常会遇到这样一些矩阵,它们非零元素少,且分布不均匀,且没有明显的规律,称之为稀疏矩阵。

按照压缩存储的思想,只需存储矩阵中的非零元素。

为了便于存取和检索,一般在存储的时候必须带有合适的辅助信息,即同时记录下它所在的行列的位置等等。

在实际应用中,一般我们采取的是用三元组和十字链表两种表示方法来实现稀疏矩阵的存储及其运算。

稀疏矩阵在数值计算、电力系统的潮流计算、天气预报、工程分析计算等方面都有着大量的应用,不少实际问题都可以转化为对稀疏矩阵的计算问题。

了解稀疏矩阵的各种操作变得尤为重要。

1 基本概念设矩阵中有t个非零元素,若t远远小于矩阵元素的总数,则称该矩阵为稀疏矩阵。

通常,在m×n 的矩阵中,存在t个非零元素。

设δ= t/(m*n),则称δ为矩阵的稀疏因子,一般认为当δ≤0.05时为稀疏矩阵。

在存储稀疏矩阵时,为了节约存储单元,很自然的压缩方法就是只存储非零元素,但由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须存储相应的辅助信息,才能准确迅速确定一个非零元素是矩阵中的哪一个元素。

最简单的办法就是将非零元素的值和它所在的行列号作为一个结点存放到一起,于是矩阵中的每一个非零元素就由一个三元组(i,j,aij)唯一确定。

显然,稀疏矩阵的压缩存储方法会让其失去随机存取功能。

2 三元组表示稀疏矩阵转置算法的实现用三元组来表示非零元素时稀疏矩阵的压缩存储方法的具体数据类型说明如下:三元组表示的稀疏矩阵,如何实现转置算法呢?矩阵的转置是基本的矩阵运算,对于一个m×n 的矩阵M,它的转置N是一个n×m 的矩阵,且有N(i,j)=M(j,i)。

矩阵转置的运算法则(7篇)

矩阵转置的运算法则(7篇)

矩阵转置的运算法则(7篇)以下是网友分享的关于矩阵转置的运算法则的资料7篇,希望对您有所帮助,就爱阅读感谢您的支持。

篇一第二节矩阵的转置• • • 一、定义二、运算规律三、特殊矩阵一、定义把矩阵A的行换成同序数的列得到的新矩阵,叫做A 的转置矩阵,记作AT 或A′ . B = ( 9 6), ⎛ 1 4⎞⎛ 1 2 2⎞ T ⎜⎛9⎞ A = 2 5⎟. 例A=⎜⎟, T ⎜⎟ B = ⎜⎟. 4 5 8⎠⎜ 2 8⎟⎝⎝ 6⎠⎝⎠λ 二、运算规律(假定运算合法, A,B是矩阵,∈R ) (1) A( )TT=AT( A + B )T = AT + BT (2)(3)( λ A ) = λ AT(4)( AB ) = B AT TT特别( A1 A2 L An−1 An ) = AnT An−1T L A2T A1TT下面证明( AB )T = BT AT . 证明:思路:先证两矩阵行数和列数相同,再证每个元素对应相等. 设A是s ×n矩阵, B是n × m 矩阵, 则AB 是s × m 矩阵,( AB )T 是m × s矩阵; B T 为m × n矩阵, AT 为n × s 矩阵, 故 B T AT 为m × s矩阵; ∴( AB )T 与B T AT 是同型矩阵 .( AB )T 的i行j列元素= ( AB )的j行i列元素=( A 的j 行) ( B 的i 列) = ∑ a jk bkik =1nB A 的i行j列元素= ( B 的i行)( A 的j列)T T T T⎡ a j1 ⎤⎢a ⎥ T T ⎢ j2 ⎥ = ( B的i列) ( A的j行) = ( b 1 i , b 2 i , L , b ni ) ⎢ M ⎥⎢a ⎥⎣ jn ⎦= ∑ bki a jk = ∑ a jk bki , ( i = 1, 2 , L , m , j = 1, 2 , L , s )k =1 k =1nn= ( AB )T 的i行j列元素∴( AB)T = BT AT .⎛ 1 0⎞⎜ 2 3⎟, B = ⎛ 2 例1 已知A = ⎜⎜4 ⎟⎝⎜ 4 5⎟⎝⎠⎛ 2 ⎛ 1 0⎞⎜ 2 3 ⎟⎛ 2 1 ⎞ = ⎜ 16 解AB = ⎜⎟⎜ 4 3⎟⎜⎠⎜⎜ 4 5⎟⎝⎝⎠⎝ 28 ⎛ 2 16 28 ⎞∴AB = ⎜()1 11 19 ⎟⎝⎠T1⎞ , 求( AB )T , BT AT . ⎟ 3⎠ 1⎞ 11 ⎟⎟ 19 ⎟⎠而⎛ 2 4 ⎞⎛ 1 2 4 ⎞⎛ 2 16 28 ⎞ B A =⎜⎟⎜ 0 3 5 ⎟ = ⎜ 1 11 19 ⎟⎝ 1 3 ⎠⎝⎠⎝⎠T TT T T 显然( AB ) = B A3.特殊矩阵1) 对称矩阵定义设A为n阶方阵,若AT = A ,即aij = a ji,那么称A 为对称矩阵. 如特点:它的元素以主对角线为对称轴对应相等.注意两个同阶的对称矩阵的和还是对称矩阵,对称矩阵的数乘也是对称矩阵.但两个对称矩阵的乘积不一定是对称矩阵.⎛ 1 0 1 −1⎞⎜⎟⎜ 0 − 1 3 1⎟⎜ 1 3 2 2⎟⎜⎜ − 1 1 2 0⎟⎟⎠⎝2) 反对称矩阵定义设A 为n 阶方阵,若AT = − A,即aij = − a ji , 那么称A 为反对称矩阵. 如⎛⎜反对称矩阵的特点是:主对⎜⎜角线上的元素为0,其余的元⎜素关于主对角线互为相反数. ⎝1⎞ 1 0 5 −2 ⎟⎟ −2 −5 0 1 ⎟⎟ −1 2 −1 0 ⎠ 0 2 −1注意两个同阶的反对称矩阵的和还是反对称矩阵, 反对称矩阵的数乘也是反对称矩阵.但两个反对称矩阵的乘积不一定是反对称矩阵.例2 设A = ( aij ) 3 为一个3阶实矩阵, 若A ≠ 0, 证明: AAT 为对称矩阵且AAT ≠ O .证明Q (AA ) = ( A ) ⎡ a11 a12 令B = AAT = ⎢ a21 a22 ⎢⎢ a31 a32 ⎣T TT TA = AA , 故AA 为对称矩阵.T T Ta13 ⎤⎡ a11 a23 ⎥⎢ a12 ⎥⎢ a33 ⎥⎢ a13 ⎦⎣a21 a22 a23a31 ⎤ a32 ⎥ , ⎥ a33 ⎥⎦则bij = ai 1a j 1 + ai 2 a j 2 + ai 3 a j 3 ( i , j = 1, 2, 3).上式取j = i , 得bii = ai21 + ai22 + ai23 ≥ 0( i = 1, 2, 3).由题设A ≠ 0知, A至少有一个元素akl ≠ 0, 则bkk > 0, 于是B = AAT ≠ O .例3 证明任一n阶矩阵A都可表示成对称阵与反对称阵之和.(p.16习题1.2 5) 证明令 C = A + AT,则C T = ( A + AT )T = AT + A = C ,所以C为对称矩阵.令B = A − AT , 则BT = ( A − AT )T = AT − A = − B,所以B为反对称矩阵.C B A+ A A− A ∴A= + = + , 命题得证. 2 2 2 2T T第三节矩阵的分块• 一、矩阵的分块• 二、分块矩阵的运算规则一、矩阵的分块具体做法:将矩阵用若干条纵线和横线分成许多个小矩阵,每一个小矩阵称为子块,以子块为元素的形式上的矩阵称为分块矩阵. ⎛ a 1 0 0⎞⎛ a 1 0 0⎞⎛ B ⎞例⎜⎟⎜⎟⎜ 1⎟⎞⎜ 0 a 0 0 ⎟ = B , A = ⎜ 0 a 0 0 ⎟ = ⎛ A O ⎟, A=⎜⎜ 1 0 b 1⎟⎜ E B ⎠⎟⎜ 2⎟ 1 0 b 1 ⎜⎟⎝ B3 ⎠⎜⎜⎜ 0 1 1 b⎟⎝⎟⎟⎜ 0 1 1 b⎟⎝⎠⎝⎠注:分块时首先满足E,再考虑对角或三角矩阵,然后考虑O以及其它的特殊矩阵. 按行分块或按列分块是两种特殊的分块形式.二、分块矩阵的运算规则分块矩阵的运算规律与普通矩阵规律运算相类似.1.矩阵的加法设A与B为同型矩阵,采用相同的分块法,有⎛ A11 ⎜ A=⎜ M ⎜A ⎝ s1 L L A1 r ⎞⎛ B11 ⎟⎜ M ⎟, B = ⎜ M ⎜B A sr ⎟⎠⎝ s1 L L B1 r ⎞⎟ M ⎟ B sr ⎟⎠其中Aij 与Bij 为同型矩阵,则⎛ A11 + B 11 ⎜ M A+ B =⎜⎜A +B s1 ⎝ s1 L L A1 r + B 1 r ⎞⎟ M ⎟. A sr + B sr ⎟⎠2.数乘⎛ A11 L A1r ⎞⎛ λA11 L λA1r ⎞⎟⎜⎟⎜ A=⎜ M M ⎟, λ ∈R, 则λA = ⎜ M M ⎟. ⎜A L A ⎟⎜ λA L λA ⎟⎝ s1 sr ⎠⎝ s1 sr ⎠3.乘法设矩阵Am×l , Bl×n 分块成⎛ A11 L A1t ⎞⎛ B11 L B1r ⎞⎜⎟⎜⎟ A=⎜M M ⎟ ,B=⎜ M M ⎟, ⎜A L A ⎟⎜B L B ⎟ st ⎠ tr ⎠⎝ s1 ⎝ t1其中分块矩阵Ai 1 , Ai 2 ,L , Ait 的列数分别等于B1 j , B2 j ,L , Btj 的行数.⎛ C11 L C1r ⎞⎟那么AB = ⎜ M M ⎟⎜⎜C L C sr ⎟⎝s1 ⎠其中 C ij = ∑ Aik Bkj ( i = 1,L , s; j = 1,L , r ) .k =1t4.转置⎛ A11 ⎜ A=⎜ M ⎜A ⎝ s1T ⎛ A11 L AsT1 ⎞ L A1r ⎞⎟⎟则AT = ⎜ M M ⎟. M ⎟, ⎜⎟⎜ AT L AT ⎟ L Asr ⎠ sr ⎠⎝ 1r分块矩阵的转置为先大转置,而后小转置.5.分块对角矩阵设A为n阶方阵,若A的分块矩阵只有在主对角线上有非零子块(这些非零子块必须为方阵),其余子块全为零, 那么方阵A就称为分块对角阵.⎛ A1 即如⎜ A=⎜⎜⎜⎝ A2 ⎞⎟⎟⎟ O ⎟ As ⎠Ai ( i = 1,2,L s )都是方阵.⎛1 ⎜0 ⎜⎜0 ⎜⎜0 ⎜0 ⎝0 1 1 0 00 2 3 0 00 0 0 2 10⎞ 0⎟⎟ 0⎟⎟ 1⎟ 5⎟⎠是分块对角阵.⎡ A1 A2 ⎤⎡ B1 例3 设A = ⎢⎥的列分块法与B ⎢ 0 ⎣0 A4 ⎦⎣的行分块法一致, 求AB .rn− rB2 ⎤ r B4 ⎥ n − r ⎦解根据分块矩阵的乘法规则,有⎡⎤⎡ A1 A2 ⎤⎡ B1 B2 ⎤⎢A1 B1 A1 B2 + A2 B4 ⎥ AB = ⎢ . ⎥⎢0 B ⎥= ⎢⎥ A4 B4 ⎣ 0 A4 ⎦⎣ 4⎦ 0 ⎦⎣例4 设A,B都是n阶上三角阵,证明:AB是上三角阵. 证一A , B 为上三角阵, 故当n ≥ i > j ≥ 1时, a ij = 0 , bij = 0 . ⎛ a11 a12 L a1n ⎞⎜ a22 L a2 n ⎟设C = ( c ij ) n× n = AB . ⎜⎟⎜ O M ⎟则当n ≥ i > j ≥ 1时, ⎜⎟ ann ⎠⎝ n i −1 nc ij = ∑ a ik b kj = ∑ a ik b kj + ∑ a ik b kjk =1 k =1 k=i= ∑ 0 × bkj + ∑ aij × 0 = 0.k =1 k =ii −1n故AB为上三角阵.证二:数学归纳法. n = 1时, A = a, B = b, AB = ab, 成立.设两个n − 1阶上三角阵的乘积是上三角阵 .下面考虑n阶的情况, 对A, B做如下分块:⎡ a11 A=⎢⎣0A2 ⎤⎡ b11 ⎥, B = ⎢ 0 A4 ⎦⎣B2 ⎤ B4 ⎥⎦A4 , B4 都是n − 1 阶上三角阵 .由归纳假设, A4 B4是n − 1阶上三角阵, 则⎡ a11b11 则AB = ⎢⎣ 0a11 B2 + A2 B4 ⎤⎥ A4 B4 ⎦于是, AB 是上三角阵 .由归纳法 .命题结论成立 .小结1.矩阵的转置与运算规律2.对称阵与反对称阵3.矩阵的分块4.分块矩阵的运算篇二南京信息工程大学实验(实习)报告实验(实习)名称矩阵的转置日期11.15得分指导老师崔萌萌系计软院专业软嵌年级大二班次1姓名张越学号[1**********]一、实验目的矩阵的转置c语言实现二、实验内容矩阵的转置三、实验步骤#include “malloc.h”#include “stdio.h”#define MAXSIZE 11#define ROW_ 11#define COL_ 11typedef struct{int row,col;int e;}Triple;typedef struct{Triple data[MAXSIZE+1]; int m,n,len;}TSMatrix;void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B){ int num[MAXSIZE],pos[MAXSIZE];int i,col,p;B->n=A.m;B->m=A.n;B->len=A.len;if(B->len){for(col=1;colnum[col]=0;}for(i=1;inum[A.data[i].col]++;}pos[1]=1;for(i=2;ipos[i]=pos[i-1]+num[i-1];}for(i=1;icol=A.data[i].col;p=pos[col];B->data[p].col=A.data[i].row; B->data[p].row=A.data[i].col; B->data[p].e=A.data[i].e;pos[col]++;}}}void main(){int i,j;int num[ROW_][COL_]={0}; int a[8]={1,4,3,3,7,8,6,1};int b[8]={2,7,2,8,3,2,7,4};int c[8]={12,9,-3,14,24,18,15,-7}; TSMatrix A,*B;A.m=ROW_-1;A.n=COL_-1;A.len=8;for(i=1;iA.data[i].row=a[i-1];A.data[i].col=b[i-1];A.data[i].e=c[i-1];num[a[i-1]][b[i-1]]=c[i-1];}printf(“\n”);printf(“转换之前:\n\n”);for(i=1;ifor(j=1;jprintf(“%-3d”,num[i][j]);}printf(“\n”);}printf(“\n三元组表:\n\nrow col E\n”);for(i=1;i{printf(“ %d %d %d\n”,A.data[i].row,A.data[i].col,A.data[i].e); }B=(TSMatrix *)malloc(sizeof(TSMatrix)); FastTransposeTSMatrix(A,B);for(i=1;ifor(j=1;jnum[i][j]=0;}}for(i=1;ilen;i++){num[B->data[i].row][B->data[i].col]=B->data[i].e; }printf(“转换之后:\n\n”);for(i=1;ifor(j=1;jprintf(“%-3d”,num[i][j]);}printf(“\n”);}printf(“\n三元组表:\n\nrow col E\n”);for(i=1;ilen;i++){printf(“ %d %d %d\n\n”,B->data[i].row,B->data[i].col,B->data[i].e); }}四、实验结果五、实验小结输入数据可以用文件输入提高测试效率篇三矩阵的转置把一矩阵A的行列互换,所得到的矩阵称为A的转置,记为A .可确切地定义如下:定义5 设a11a12 a1nA aa2122 a2n,as1as2 asn 所谓的转置就是指矩阵a11a21 as1A a12a22 as2.a1na a2nsn显然,s n矩阵的转置是n s矩阵.矩阵的转置适合以下的规律:(A ) A, (A B) A B , (AB) B A , (kA) kA . (16)表示两次转置就还原,这是显然的.练习:A 112 ,B 2 10 113421求(AB) ,B A .(16) (17) (18) (19)1TTT对称矩阵反对称矩阵定义:设A为n级方阵,若A满足1)A A,则称A 为对称矩阵.2)A A,则称A为反对称矩阵.对称阵的元素以主对角线为对称轴对应相等.例3:证明任一n阶矩阵A都可以表示成对称矩阵与反对称矩阵之和。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>
#include<stdlib.h>
#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;a<T->m;a++){
for(b=0;b<T->m;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的三元数组中。

详细设计:
由于三元组表中的结点存放了元素的行标i和列标j,因此可利用行标和列标互换进行转置,但这样操作后,新三元组表中的元素则以列序为主序存放,不便矩阵遍历输出,因此在将互换行标、列标后的元素存入新三元组表时,应先计算出按行序为主序存放时所在的下标temp。

由于三对角矩阵元素存入三元数组中,所在的下标temp与其行标i和列标j有temp=2*i+j关系,所以可先求出下标temp,同时将信息存入下标为temp的数组中,所得的新三元组表即以行序为主序存放的。

调试分析及小结:
错误及分析:在开始设计转置函数时,直接利用行标和列标交换方法,因此所得的新三
元组表则以列序为主序存放,输出矩阵时并未正确的转置矩阵。

初步改进:参考课本的转置思想,对三元组表进行转置时,以列序为主序进行转置,转置后所得新三元组表则是以行序为主序存放,但该算法时间复杂度为O(n×t),其中n为列数,t为非0元个数。

最终改进:由于三对角矩阵元素存入三元数组中的下标temp与该元素的行标i与列标j 有temp=2*i+j关系,因此可直接将元素信息存放下标temp的数组中,该算法时间复杂度为O(t),t为非0元个数,程序代码如下:
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;
}。

相关文档
最新文档