矩阵转置偏导数

矩阵转置偏导数
矩阵转置偏导数

三元组表示稀疏矩阵的转置(一般算法和快速算法)

一、设计要求 1.1 问题描述 稀疏矩阵是指那些多数元素为零的矩阵。利用稀疏特点进行存储和计算可以大大节省存储空间,提高计算效率。求一个稀疏矩阵A的转置矩阵B。 1.2需求分析 (1)以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现稀疏矩阵的转置运算。(2)稀疏矩阵的输入形式采用三元组表示,运算结果则以通常的阵列形式列出。 (3)首先提示用户输入矩阵的行数、列数、非零元个数,再采用三元组表示方法输入矩阵,然后进行转置运算,该系统可以采用两种方法,一种为一般算法,另一种为快速转置算法。(4)程序需要给出菜单项,用户按照菜单提示进行相应的操作。 二、概要设计 2.1存储结构设计 采用“带行逻辑链接信息”的三元组顺序表表示矩阵的存储结构。三元组定义为:typedef struct { int i;//非零元的行下标 int j;//非零元的列下标 ElemType e; //非零元素值 }Triple; 矩阵定义为: Typedef struct { Triple data[MAXSIZE+1]; //非零元三元组表 int rpos[MAXRC+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数 }RLSMatrix; 例如有矩阵A,它与其三元组表的对应关系如图

2.2 系统功能设计 本系统通过菜单提示用户首先选择稀疏矩阵转置方法,然后提示用户采用三元组表示法输入数据创建一个稀疏矩阵,再进行矩阵的转置操作,并以通常的阵列形式输出结果。主要实现以下功能。 (1)创建稀疏矩阵。采用带行逻辑连接信息的三元组表表示法,提示用户输入矩阵的行数、列数、非零元个数以及各非零元所在的行、列、值。 (2)矩阵转置。<1>采用一般算法进行矩阵的转置操作,再以阵列形式输出转置矩阵B。 <2>采用快速转置的方法完成此操作,并以阵列形式输出转置矩阵B。 三、模块设计 3.1 模块设计 程序包括两个模块:主程序模块、矩阵运算模块。 3.2 系统子程序及其功能设计 系统共设置了8个子程序,各子程序的函数名及功能说明如下。 (1)CreateSMatrix(RLSMatrix &M) //创建稀疏矩阵 (2)void DestroySMatrix(RLSMatrix &M) //销毁稀疏矩阵 (3)void PrinRLSMatrix(RLSMatrix M) //遍历稀疏矩阵 (4)void print(RLSMatrix A) //打印矩阵函数,输出以阵列形式表示的矩阵 (5)TransposeSMatrix(RLSMatrix M,RLSMatrix &T) //求稀疏矩阵的转置的一般算法(6)FastTransposeSMatrix(RLSMatrix M,RLSMatrix &T) //快速转置算法 (7)void showtip() //工作区函数,显示程序菜单 (8)void main() //主函数

c++课程设计-矩阵的转置与乘法计算

c++课程设计-矩阵的转置与乘法计算

C++课程设计实验报告 姓名学号班级 任课教师时间 9月 教师指定题目4-4 矩阵的转置与乘法计算评定难易级别 A 实验报告成绩 1.实验内容: 1.1 程序功能介绍 该程序定义了一个向量类,里面的元素是模板形式,定义了有关向量了类的各种属性、方法及运算符重载函数。 1.2 程序设计要求 (1)利用已知的向量类对象定义一个矩阵类,矩阵类的数据是向量子对象,同样定义矩阵类的各种属性、方法及运算符重载函数。 (2)完善成员函数,使矩阵可以由文件输入,具体的输入格式自己规定。 (3)完成矩阵的赋值、转置、乘法等运算,要求用整形矩阵和浮点型矩阵分别演算。 (4)更改main函数结构,可由用户选择输入矩阵数据的方法,程序可以连续运行,直到选择退出为止。

2. 源程序结构流程框图与说明(含新增子函数的结构框图)

作者:喻皓学号:0511590125

3. 基本数据结构 定义的类模板,将函数用链表将一些功能函数连接起来。其中定义了构造函数,析构函数,重载赋值、乘法、数乘、输入、输出,矩阵转置等函数,实现矩阵的矩阵的赋值、转置、乘法等运算。 template class CMatrix { struct node { Vector **f;//**************************************组成矩阵的向量指针 int refcnt;//*************************************************被引用次数 int length;//*************************************************矩阵的行数 T **tmppointer;//*******************************************头指针类型} *p; public: // Vector ** begin() const {return p->f;}; CMatrix();//****************************************************默认的构造 CMatrix(int xsize,int ysize,T init=0);//***************************构造函数 CMatrix(int xlength,const Vector *vec);//************************构造函

矩阵的运算及其运算规则

矩阵基本运算及应用 201700060牛晨晖 在数学中,矩阵是一个按照长方阵列排列的复数或实数集合。矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。在电力系统方面,矩阵知识已有广泛深入的应用,本文将在介绍矩阵基本运算和运算规则的基础上,简要介绍其在电力系统新能源领域建模方面的应用情况,并展望随机矩阵理论等相关知识与人工智能电力系统的紧密结合。 1矩阵的运算及其运算规则 1.1矩阵的加法与减法 1.1.1运算规则 设矩阵,, 则

简言之,两个矩阵相加减,即它们相同位置的元素相加减! 注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的. 1.1.2运算性质 满足交换律和结合律 交换律; 结合律. 1.2矩阵与数的乘法 1.2.1运算规则 数乘矩阵A,就是将数乘矩阵A中的每一个元素,记为或. 特别地,称称为的负矩阵. 1.2.2运算性质 满足结合律和分配律 结合律:(λμ)A=λ(μA);(λ+μ)A =λA+μA. 分配律:λ(A+B)=λA+λB.

已知两个矩阵 满足矩阵方程,求未知矩阵. 解由已知条件知 1.3矩阵与矩阵的乘法 1.3.1运算规则 设,,则A与B的乘积是这样一个矩阵: (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即 . (2) C的第行第列的元素由A的第行元素与B的第列元素对应相乘,再取乘积之和.

三元组顺序表实现矩阵的转置

三元组顺序表实现矩阵的转置: /*-------------------------------------------------------------- ----------------用三元组顺序表实现对稀疏矩阵的转置----------------- ------------------------编译环境:VS 2013------------------------ --------------------------------------------------------------*/ #define_CRT_SECURE_NO_WARNINGS//用于取消VS 2013对printf、scanf等函数的警告#include #include #define MAXSIZE 100 typedef int ElemType; typedef struct { int i; int j; ElemType e; }tupletype; typedef struct { int rownum; int colnum; int nznum; tupletype data[MAXSIZE]; }table; void creatable(table *M); //用户输入,创建一个三元组表 void trans(table *M, table *T); //转置 void show(table *M); //以矩阵形式输出三元组表 int main() { table M, T; creatable(&M); system("cls"); puts("矩阵M:"); show(&M); trans(&M, &T); puts("矩阵M的转置矩阵T:"); show(&T); return 0; }

矩阵转置及相加实验报告

一、实验内容和要求 1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相 加得到矩阵C的算法。 (1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。 (2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。 (3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。 (4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。 二、实验过程及结果 一、需求分析 1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可 修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。 2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列 排列形式输出)。 3、程序能实现的功能包括: ①随机产生稀疏矩阵;②输出阵列形式的矩阵;③输出三元组顺序 表;④将矩阵快速转置;⑤将两个稀疏矩阵相加生成新的矩阵。 二、概要设计 1、稀疏矩阵的抽象数据类型定义: ADT TSMatrix{ 数据对象:D={ aij|i=1,2,…,m,j=1,2,…,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} 基本操作: CreateTSMatrix(&M) 操作结果:创建矩阵M PrintTSMatrix(M) 初始条件:矩阵M已存在 操作结果:输出矩阵M中三元组形式的非零元素 PrintTSMatrix1(M) 初始条件:矩阵M已存在 操作结果:以阵列形式输出矩阵 UnZore(M, row, col) 初始条件:矩阵M已存在 操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号

数据结构矩阵的转置

/* c1.h (程序名) */ #include #include #include /* malloc()等*/ #include /* INT_MAX等*/ #include /* EOF(=^Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ /* 函数结果状态代码*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ /* c5-2.h 稀疏矩阵的三元组顺序表存储表示*/ #define MAXSIZE 100 /* 非零元个数的最大值*/ typedef struct { int i,j; /* 行下标,列下标*/ ElemType e; /* 非零元素值*/ }Triple; typedef struct { Triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用*/ int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*/ }TSMatrix; /* bo5-2.c 三元组稀疏矩阵的基本操作,包括算法5.1(9个) */ Status CreateSMatrix(TSMatrix *M) { /* 创建稀疏矩阵M */ int i,m,n; ElemType e; Status k; printf("请输入矩阵的行数,列数,非零元素数:"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; /* 为以下比较顺序做准备*/ for(i=1;i<=(*M).tu;i++)

c课程设计矩阵的转置与乘法计算

c课程设计矩阵的转置与乘法计算

C++课程设计实验报告 姓名学号班级 任课教师时间 9月 教师指定题目4-4 矩阵的转置与乘法计算评定难易级别 A 实验报告成绩 1.实验内容: 1.1 程序功能介绍 该程序定义了一个向量类,里面的元素是模板形式,定义了有关向量了类的各种属性、方法及运算符重载函数。 1.2 程序设计要求 (1)利用已知的向量类对象定义一个矩阵类,矩阵类的数据是向量子对象,同样定义矩阵类的各种属性、方法及运算符重载函数。 (2)完善成员函数,使矩阵能够由文件输入,具体的输入格式自己规定。(3)完成矩阵的赋值、转置、乘法等运算,要求用整形矩阵和浮点型矩阵分别演算。 (4)更改main函数结构,可由用户选择输入矩阵数据的方法,程序能够连续运行,直到选择退出为止。 2. 源程序结构流程框图与说明(含新增子函数的结构框图)

作者:喻皓学号:

3. 基本数据结构 定义的类模板,将函数用链表将一些功能函数连接起来。其中定义了构造函数,析构函数,重载赋值、乘法、数乘、输入、输出,矩阵转置等函数,实现矩阵的矩阵的赋值、转置、乘法等运算。 template class CMatrix { struct node { Vector **f;//**************************************组成矩阵的向量指针 int refcnt;//*************************************************被引用次数 int length;//*************************************************矩阵的行数T **tmppointer;//*******************************************头指针类型} *p;

求矩阵与其转置矩阵的乘积的和

#include using namespace std; //#include void zc(int a[][5],int b[][3],int c[][3]); void cj(int a[][5],int b[][3],int c[][3]); int sum(int a[3][3]); int main() { int a[3][5],b[5][3],c[3][3]={0}; for(int i=0;i<15;i++) a[0][i]=i+1; /*for( i=0;i<3;i++) { for(int j=0;j<5;j++) cout<<" "<

for(int j=0;j<3;j++) //b的列,c的列 { for(int k=0;k<5;k++) //b的行,a的列 { //cout<

北航并行计算矩阵转置作业

矩阵转置并行实现 1、算法描述: 若处理器个数为p,且它们的编号依次是0,1,…,p-1,则将n阶矩阵A分成p 个大小为mxm的子块,m=[n/p]。p个子块组成一个子块阵列,记其中第i行第j列的子块为Aij,它含有第(i-1)m+1至第im行中的第(j-1)m+1至第jm列的所有元素。对每一处理器按行主方式赋以二维下标,记编号为i的处理器的二维下标 为(v,u),其中,A的子块存入下标为(v,u)表示的对应 处理器中。转置分为两步进行:第一步,子块转置;第二步,处理器内部转置。为了避免对应子块交换数据是处理器发生死锁,可令下三角块先向与之对应的上三角子块发送数据,然后从上三角子块接收数据;上三角子块数据先存放在缓冲区buffer中,然后从与之对应的下三角子块接收数据,最后再将缓冲区中的数据发送给下三角子块,流程图如下所示:

2、程序代码: #include "stdio.h" #include "stdlib.h" #include "mpi.h" #include "math.h" #define E 0.0001 #define a(x,y) a[x*m+y] #define b(x,y) b[x*m+y] #define A(x,y) A[x*size+y] #define B(x,y) B[x*size+y] #define intsize sizeof(int) #define floatsize sizeof(float) #define charsize sizeof(char) int size,N; int m; int t; float *A, *B; double starttime; double time1; double time2; int my_rank; int p; MPI_Status status; FILE *fdA; void Environment_Finalize(float *a,float *b) { free(a); free(b); } int main(int argc, char **argv) { int i,j,k,my_rank,group_size; float *a,*b; int u,v; float temp; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&group_size); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); p=group_size; if(my_rank==0) {

矩阵的加、乘、转置运算实现

定义:由m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵;在编程语言中可以当做二维数组来处理; 加减法:同型矩阵之间 乘法:两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵; 转置:把矩阵A的行换成同序数的列所得到的新矩阵称为A的转置矩阵; 详细的运算及原理可以百度一下; 如下是完整的Java代码实现: package algorithm; public class Matrix { public final int TYPE_ADD = 1; public final int TYPE_MUL = 2; /** * 矩阵类,实现n阶矩阵的加、乘、转置运算 * * @paramargs */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] a = { { 1, 2 }, { 2, 3 } }; int[][] b = { { 4, 5 }, { 6, 7 } }; int[][] aa = new int[][]{{1,0,2},{-1,3,1}}; int[][] bb = new int[][]{{3,1}, {2,1},{1,0}}; Matrix m = new Matrix();

System.out.println("两矩阵相加:"); int[][] r = m.matrix_add(a, b); for (inti = 0; i

矩阵运算——矩阵加法+乘法+转置+求逆

矩阵运算——矩阵加法+乘法+转置+求逆 double[,] matrix; publicint row = 0, col = 0; //定义三个不同情况下的构造函数 public Matrix() { } public Matrix(int row) { matrix = new double[row, row]; } public Matrix(int row, int col) { this.row = row; this.col = col; matrix = new double[row, col]; } //复制构造函数 public Matrix(Matrix m) { int row = m.row; int col = m.col; matrix = new double[row, col]; for (inti = 0; i< row; i++) { for (int j = 0; j < col; j++) { matrix[i, j] = m.getNum(i, j); } } } //输入相应的值,对矩阵进行设置 public void SetNum(inti, int j, double num) { matrix[i, j] = num; } //得到相应的矩阵某个数 public double getNum(inti, int j) { return matrix[i, j]; } //输出矩阵 public void OutputM() { Console.WriteLine("矩阵为:"); for (int p = 0; p < row; p++)

实验报告 矩阵快速转置

实验报告 实验项目名称:实现矩阵的快速 转置的操作 所属课题名称:数据结构 实验类型:验证实验 实验日期:2010/12/20 学院:数学与信息科学学院 专业: 信息与计算科学 班级: 082班 姓名:李晓璐 学号:0801214037

实验稀疏矩阵的快速转置操作 一、实验目的 1、了解稀疏矩阵的三元组存储形式。 2、熟悉掌握三元表存储矩阵的转置算法。 二、实验环境 硬件:PC 微型计算机、256M以上内存,40G以上硬盘。 软件:Windows XP,Turbo C/C++ 三、实验内容 转置运算是一种最简单的矩阵运算。对于一个m*n的矩阵M,它的转置矩阵T是一个n*m的矩阵。假设a和b是TSMatrix型的变量,分别表示矩阵M和T。按照a.data中三元组的次序进行转置,并将转置后的三元组置入b中恰当的位置。实现由a得到b的方式如下。 在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在b.data中应有的位置。在此,设num和cpot两个向量,num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中应有的位置。显然有: cpot[1]=1; cpot[col]=cpot[col-1]+num[col-1] 四、实验步骤 1、本实验的程序清单如下。 “TSMatrix.h” #define MAXSIZE 12500 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW 0 typedef int Status; typedef int ElemType; struct Triple { int i,j;

稀疏矩阵快速转置 数据结构实验报告

南昌航空大学实验报告 课程名称:数据结构实验名称:实验五稀疏矩阵的存储和快速转置班级:学生姓名:学号: 指导教师评定:签名: 题目:假设稀疏矩阵A采用三元组表表示,编写程序实现该矩阵的快速转置 要求:输入一个稀疏矩阵A,由程序将其转换成三元组表存储;转置后的三元组表,由程序将其转换成矩阵形式后输出。 一、需求分析 1.用户可以根据自己的需求输入任意一个稀疏矩阵,通过程序将其转换成三元组存储方 式; 2.并且能够完成矩阵的转置功能,要求需要使用的方法是快速转置的方法。 3.最后要够显示原矩阵和转置后的矩阵让用户能进行比较。 4.程序执行的命令包括: (1)构造稀疏矩阵M (2)求转转矩阵T (3)显示(打印)矩阵 二、概要设计 ⒈为实现上述算法,需要线性表的抽象数据类型: ADT SparseMatrix { 数据对象:D={a ij:|a ij∈TermSet,i=1…m,m≥0,j=1…n,n≥0 m和n分别成为矩阵的行数和列数 } 数据关系:R={Row,Col} Row ={|1≤i≤m,1≤j≤n-1 } Col ={|1≤i≤m-1,1≤j≤n } 基本操作: CreateSMtrix(& M) 操作结果:创建稀疏矩阵M。 DestroySMaix(&M) 初始条件:稀疏矩阵M已存在。 操作结果:销毁稀疏矩阵M。 PrintSMatrix(L) 初始条件:稀疏矩阵M已经存在。 操作结果:输出稀疏矩阵M。 CopySMatrix(M,&T) 初始条件:稀疏矩阵M已经存在。 操作结果:由稀疏矩阵M复制得到T。 TransposeSMatrix(M,&T) 初始条件:稀疏矩阵M已经存在。

java实现矩阵的加,减,乘,转置运算

import java.util.*; public class JuZhen { // 创建矩阵 public static int[][] createJuZhen(int x, int y) { Scanner input = new Scanner(System.in); System.out.println("请输入" + x + "行" + y + "列的矩阵数据(行优先):"); int[][] array = new int[x][y]; for (int i = 0; i < array.length; i++) for (int j = 0; j < array[i].length; j++) { array[i][j] = input.nextInt(); } return array; } // 矩阵输出 public static void outputJuZhen(int[][] list) { for (int i = 0; i < list.length; i++) { for (int j = 0; j < list[i].length; j++) { System.out.print(list[i][j] + " "); } System.out.println(); } } // 矩阵求和 public static int[][] addJuZhen(int[][] list1, int[][] list2) { int[][] list3 = new int[list1.length][list1[0].length]; if (list1.length != list2.length || list1[0].length != list2[0].length) { System.out.println("行数或列数不同的矩阵不能相加!并将返回0:!!"); } else { for (int i = 0; i < list1.length; i++) for (int j = 0; j < list1[0].length; j++) list3[i][j] = list1[i][j] + list2[i][j]; } return list3; } // 矩阵相乘 public static int[][] mulJuZhen(int[][] list1, int[][] list2) { int[][] list3 = new int[list1.length][list2[0].length]; if (list1.length != list2[0].length || list1[0].length != list2.length) System.out.println("两矩阵不能符合条件相乘!并将返回0:!!"); else

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

#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); }

矩阵转置及相加实验报告材料

一、实验容和要求 1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相 加得到矩阵C的算法。 (1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。 (2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。 (3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。 (4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。 二、实验过程及结果 一、需求分析 1、将随机生成的数定义为int型(为方便起见设定围为-20至20(不含0),可修 改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。 2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列 排列形式输出)。 3、程序能实现的功能包括: ①随机产生稀疏矩阵;②输出阵列形式的矩阵;③输出三元组顺序 表;④将矩阵快速转置;⑤将两个稀疏矩阵相加生成新的矩阵。 二、概要设计 1、稀疏矩阵的抽象数据类型定义: ADT TSMatrix{ 数据对象:D={ aij|i=1,2,…,m,j=1,2,…,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} 基本操作: CreateTSMatrix(&M) 操作结果:创建矩阵M PrintTSMatrix(M) 初始条件:矩阵M已存在 操作结果:输出矩阵M中三元组形式的非零元素 PrintTSMatrix1(M) 初始条件:矩阵M已存在 操作结果:以阵列形式输出矩阵 UnZore(M, row, col) 初始条件:矩阵M已存在 操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号 TSMatrix_Add(M, N,&Q)

矩阵算法

矩阵及其基本算法计13 刘汝佳矩阵及其基本算法矩阵的表示矩阵的基本运算小结和应用举例一、矩阵的表示矩阵在形式上最直接的表示是一个二维数组,但是在一些特殊的场合中,我们需要引入一些特殊的方法来表示一些特殊的矩阵。在本节中,大家还将了解到以下几种表示方法: 还将了解到以下几种表示方法: 三角矩阵的压缩表示法稀疏矩阵的三元组表示法稀疏矩阵的十字链表表示法矩阵的二维数组表示法我们用二维数组很容易表示一个矩阵。加上矩阵的维数M 我们用二维数组很容易表示一个矩阵。加上矩阵的维数M 和N,我们可以定义一个我们可以定义一个TMatrix结构: 结构: struct TMatrix { int n,m; int numbers[MAXN+1][MAXN+1]; }; 这就是矩阵的二维数组表示法。怎么样,容易吧?这就是矩阵的二维数组表示法。怎么样,容易吧?三角矩阵的压缩表示(1) 三角矩阵的压缩表示N阶上三角矩阵,对称矩阵和反对称矩阵都只需要储存主对角线以上的共(N+1)*N/2个元素。N+1)*N/2个元素。因此,我们可以用一个大小为( 因此,我们可以用一个大小为(N+1)*N/2 的一维数组来表示。不过,我们需要一个公式,把每个元素原来的位置(i,j)映射到一维数组的下标k 原来的位置(i,j)映射到一维数组的下标k。三角矩阵的压缩表示(2) 三角矩阵的压缩表示我们从上到下,从左到右地储存各个元素,如下图:?a11 a12 a13 a14 ? ? a a a ? 22 23 24 ? ? ? a33 a34 ? ? ? a44 ? ? i ?1 l =1 ?a1 a2 a3 a4 ? ? a a a ? 5 6 7 ? ? ? a8 a9 ? ? ? a10 ? ? Aij前面的数的个数为:(n ? l + 1) + ( j ? 1) ∑ 计算得: 计算得: 1 k = (2n ? i + 2)(i ? 1) + j 2 稀疏矩阵在前面的二维数组表示法中,我们表示一个N*M的矩阵需要N*M个内存单元。一个N*M的矩阵需要N*M个内存单元。如果已知矩阵中存在着大量的0 如果已知矩阵中存在着大量的0元素,那么这种表示方法是很浪费空间的。由于非零元素的个数L 由于非零元素的个数L十分有限,我们可以只储存下这L 以只储存下这L个元素的位置和大小,占用的空间便会少得多。稀疏矩阵的三元组表示法显然,表示稀疏矩阵最直接的方法就是仅记录下非零元素的个数L和这L 仅记录下非零元素的个数L和这L个元素的位置(row,col)和大小(value),的位置(row,col)和大小(value),即下面这个结构:struct TMatrix2 { int l; int row[MAXL],col[MAXL],value[MAXL]; }; 稀疏矩阵的十字链表表示(1) 稀疏矩阵的十字链表表示三元组表示法比较好的解决了稀疏矩阵的空间存储问题,却忽视了稀疏矩阵可能进行了一些基本操作。考虑两个稀疏矩阵A考虑两个稀疏矩阵A和B相加的问题。对于运算结果矩阵C来说,可能会因为正负抵消而产生出很多新的零元素和非零元素,导致三元组需要进行一些插入和删除操作。当这些操作很频繁的时候,程序的速度会明显变慢。在某些特定情况下,我们需要对元素进行检索,由于三元组的元素之间联系并不紧密,所以检索很不方便。稀疏矩阵的十字链表表示(2) 稀疏矩阵的十字链表表示为了加强同一行和同一列之间元素的联系,我们把每一行分别做成一个链表,把每一列也分别做成一个链表。通过对链表的遍历,我们可以很方便的按顺序访问到某一特定行或列的所有元素。插入和删除操作也很方便。这样,我们了建立一种十字型的链表结构,每个结点有上,下,左,右四个指针和自身的位置坐标,大小共7 置坐标,大小共7个域。稀疏矩阵的十字链表表示(3) 稀疏矩阵的十字链表表示结点类型如下定义:struct Tnode { int row, col; int value; Tnode *left, *right, *up, *down; }; row,col分别为该非零元素的位置,value为它的值。row,col分别为该非零元素的位置,value为它的值。left,right,up,down 分别为指向四个方向的后继元素。left,right,up,down分别为指向四个方向的后继元素。稀疏矩阵的十字链表表示(4) 稀疏矩阵的十字链表表示为了方便的找到每一个包含非零元素的行和列,我们把所有行串在一起,组成一个行链表,把所有列也串在一起,组成一个列链表。像这样:struct TRow { int RowNo; TNode * firstnode; }; struct TCol { int ColNo; TNode * firstnode; }; 矩阵表示方法小结矩阵的表示方法和应用是分不开的。我们衡量一种表示方法的优劣,需要从不同的角度进行分析。适用范围空间需求量基本操作的时间消耗实现的难易程度以上几种方法都在某些方面表现良好而其他方面不够理想,因此我们

矩阵转置实验报告doc

矩阵转置实验报告 篇一:实验报告矩阵快速转置 实验报告 实验项目名称:实现矩阵的快速转置的操作所属课题名称:数据结构 实验类型:验证实验 实验日期:XX/12/20 学院:数学与信息科学学院 专业: 信息与计算科学 班级: 082班 姓名:李晓璐 学号:0801214037 实验稀疏矩阵的快速转置操作 一、实验目的 1、了解稀疏矩阵的三元组存储形式。 2、熟悉掌握三元表存储矩阵的转置算法。 二、实验环境 硬件:PC 微型计算机、256M以上内存,40G以上硬盘。 软件:Windows XP,Turbo C/C++ 三、实验内容 转置运算是一种最简单的矩阵运算。对于一个m*n的矩阵M,它的转置矩阵T是一个n*m的矩阵。假设a和b是

TSMatrix型的变量,分别表示矩阵M和T。按照a.data中三元组的次序进行转置,并将转置后的三元组置入b中恰当的位置。实现由a得到b的方式如下。 在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在b.data中应有的位置。在此,设num和cpot两个向量,num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中应有的位置。显然有: cpot[1]=1; cpot[col]=cpot[col-1]+num[col-1] 四、实验步骤 1、本实验的程序清单如下。 “TSMatrix.h” #define MAXSIZE 12500 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW 0 typedef int Status; typedef int ElemType; struct Triple

相关文档
最新文档