搜档网
当前位置:搜档网 › 矩阵运算——矩阵加法+乘法+转置+求逆

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

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

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

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++)

{

for (int q = 0; q < col; q++)

{

Console.Write("\t" + matrix[p, q]);

}

Console.Write("\n");

}

}

public void InputM(int Row, int Col)

{

for (int a = 0; a < Row; a++)//col——Michael

{

for (int b = 0; b < Col; b++)

{

Console.WriteLine("第{0}行,第{1}列", a + 1, b + 1); double value = Convert.ToDouble(Console.ReadLine()); this.SetNum(a, b, value);

}

}

}

//得到matrix

public double[,] Detail

{

get

{

return matrix;

}

set { matrix = value; }

}

//矩阵转置实现

public Matrix Transpose()

{

Matrix another = new Matrix(row, col);

for (inti = 0; i< row; i++)

{

for (int j = 0; j < col; j++)

{

another.SetNum(j, i, matrix[i, j]);

}

}

return another;

}

///

/// 矩阵相乘

///

/// 第一个矩阵

/// 第二个矩阵

///

public double[,] matrixMulti(double[,] X, double[,] Y)

{

double[,] A = X; double[,] B = Y;

double[,] C = new double[A.GetLength(0), B.GetLength(1)];

for (inti = 0; i

for (int j = 0; j

{

C[i, j] = 0;

for (int k = 0; k

{

C[i, j] += A[i, k] * B[k, j];

}

}

return C;

}

//矩阵相乘

public static Matrix Multiply(Matrix lm, Matrix rm)

{

Matrix another = new Matrix(lm.row, rm.col);

if (lm.col == rm.row)

{

for (inti = 0; i

{

for (int j = 0; j

{

double temp=0;

for (int k = 0; k

{

temp += lm.getNum(i, k) * rm.getNum(k, j);

}

another.SetNum(i, j, temp);

}

}

}

else

{

Console.WriteLine("左矩阵的列数不等于右矩阵的行数,不能参与计算");

}

return another;

}

//矩阵相加实现

public static Matrix Add(Matrix lm, Matrix rm)

{

//行出错

if (lm.row != rm.row)

{

System.Exception e = new Exception("相加的两个矩阵的行数不等");

throw e;

}

//列出错

if (lm.col != rm.col)

{

System.Exception e = new Exception("相加的两个矩阵的列数不等");

throw e;

}

Matrix another = new Matrix(lm.row, lm.col);

for (inti = 0; i

{

for (int j = 0; j

{

double temp = lm.getNum(i, j) + rm.getNum(i, j);

another.SetNum(i, j, temp);

}

}

return another;

}

//矩阵求逆实现

public static Matrix Inverse(Matrix M)

{

int m = M.row;

int n = M.col;

if (m != n)

{

Exception myException = new Exception("求逆的矩阵不是方阵"); throwmyException;

}

Matrix ret = new Matrix(m, n);

double[,] a0 = M.Detail;

double[,] a = (double[,])a0.Clone();

double[,] b = ret.Detail;

inti, j, row, k; double max, temp;

//单位矩阵

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

{

b[i, i] = 1;

}

for (k = 0; k < n; k++)

{

max = 0; row = k;

//找最大元,其所在行为row

for (i = k; i< n; i++)

{

temp = Math.Abs(a[i, k]);

if (max < temp)

{

max = temp; row = i;

}

}

if (max == 0)

{

Exception myException = new Exception("该矩阵无逆矩阵"); throwmyException;

}

//交换k与row行

if (row != k)

{

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

{

temp = a[row, j];

a[row, j] = a[k, j];

a[k, j] = temp;

temp = b[row, j];

b[row, j] = b[k, j];

b[k, j] = temp;

}

}

//首元化为1

for (j = k + 1; j < n; j++)

a[k, j] /= a[k, k];

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

b[k, j] /= a[k, k];

a[k, k] = 1;

//k列化为0

//对a

for (j = k + 1; j < n; j++)

{

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

a[i, j] -= a[i, k] * a[k, j];

for (i = k + 1; i< n; i++)

a[i, j] -= a[i, k] * a[k, j];

}

//对b

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

{

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

b[i, j] -= a[i, k] * b[k, j];

for (i = k + 1; i< n; i++)

b[i, j] -= a[i, k] * b[k, j];

}

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

a[i, k] = 0;

a[k, k] = 1;

}

return ret;

}

//主函数

public static void Main()

{

int Row, Col, choice;

Console.WriteLine("请输入想要的矩阵行数与列数");

Row = Convert.ToInt32(Console.ReadLine());

Col = Convert.ToInt32(Console.ReadLine());

Matrix m = new Matrix(Row, Col);

Console.WriteLine("输入矩阵数据");

m.InputM(Row, Col); m.OutputM();

do

{

Console.WriteLine("请选择你想要进行的运算:\n(1)转置;\n(2)输入另一矩阵并相加;\n (3)求逆;\n(4)输入另一矩阵并相乘;\n(0)停止;");

choice = Convert.ToInt32(Console.ReadLine());

switch (choice)

{

case 1:

Matrix n = m.Transpose();

n.OutputM();

break;

case 2:

Console.WriteLine("请输入第二个矩阵行数与列数");

Row = Convert.ToInt32(Console.ReadLine()); Col = Convert.ToInt32(Console.ReadLine()); Matrix m2 = new Matrix(Row, Col); Console.WriteLine("输入矩阵数据");

m2.InputM(Row, Col);

Console.WriteLine("第二个矩阵为:");

m2.OutputM();

Matrix result = Add(m, m2);

result.OutputM();

break;

case 3:

Matrix m3 = Inverse(m);

m3.OutputM();

break;

case 4:

Console.WriteLine("请输入第二个矩阵行数与列数");

Row = Convert.ToInt32(Console.ReadLine()); Col = Convert.ToInt32(Console.ReadLine()); Matrix m4 = new Matrix(Row, Col); Console.WriteLine("输入矩阵数据");

m4.InputM(Row, Col);

Console.WriteLine("第二个矩阵为:");

m4.OutputM();

Matrix result2 = Multiply(m, m4);

result2.OutputM();

break;

case 0:

break;

}

}

while (choice != 0);

Console.Write("请按任意键继续");

Console.ReadLine();

}

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

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (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; //非零元素个数

2-2逆矩阵及其运算

线性代数 第二节逆矩阵及其运算 一、逆矩阵的概念和性质五、初等变换求逆矩阵 四、矩阵的初等变换和初等矩阵二、矩阵可逆的条件三、用伴随矩阵法求逆矩阵

线性代数 (或称的逆);其中为的倒数, a 1 1 a a -=a , 1 1 1aa a a --==在数的运算中,对于数,有 是否存在一个矩阵,. 1 1 AA A A E --==在矩阵的运算中,单位矩阵E 相当于数的乘法运算中 的1, 那么,对于矩阵A ,1 A -使得一、逆矩阵的概念和性质 0a ≠

线性代数 对于n 阶矩阵A ,如果有一个n 阶矩阵B ,使得 则说矩阵A 是可逆矩阵或非奇异矩阵,并把矩阵B 称为A 的逆矩阵,否则称A 是不可逆矩阵或奇异矩阵。 , AB BA E ==例1设,01011010A B -????== ? ?-???? ,AB BA E ==∴B 是A 的一个逆矩阵。 定义1(可逆矩阵)

线性代数 例1 设,2110A ?? = ? -?? 解 设是A 的逆矩阵,a b B c d ?? = ? ??则2110a b AB c d ????= ???-????1001?? = ? ?? 221001a c b d a b ++?????= ? ?--????求A 的逆矩阵

线性代数 ,,,, 212001a c b d a b +=??+=??? -=??-=?, ,,. 0112a b c d =??=-??? =??=?又因为 ??? ??-01120112-?? ?????? ??-0112=0112-?? ???,1001?? = ??? 所以 .1 0112A --?? = ? ?? A B A B (待定系数法)

采用十字链表表示稀疏矩阵,并实现矩阵的加法运算

课程设计 所抽题目:采用十字链表表示稀疏矩阵,并实现矩阵的加法运算。 要求:要检查有关运算的条件,并对错误的条件产生 报警。 问题分析和建立模型:本题目主要是运用所学知识,用十字链表的方法去表示稀疏矩阵,并使之可以在两矩阵间进行相加。而后,若有错误,则对错误进行警报。 框架搭建: 1选择File|New菜单项,弹出New对话框,选择Files标签,选中C++ Source File项,在File编辑器中输入项目名称“十字链表表示稀疏矩阵实现加法”,在Location编辑框中输入项目所在目录,按下OK 按钮即可。 2在操作界面中输入,程序代码。 (1)结构体和共用体的定义 #include #include #define smax 45 typedef int datatype; typedef struct lnode (2)建立稀疏矩阵的函数,返回十字链表头指针 int i,j; struct lnode *cptr,*rptr; union {

struct lnode *next; datatype v; }uval; }link; int flag=0; 建立十字链表头结点 head=(link *)malloc(sizeof(link)); 建立头结点循环链表 for(i=1;i<=s;i++) (3)插入结点函数 p=(link *)malloc(sizeof(link)); p->i=0;p->j=0; p->rptr=p;p->cptr=p; cp[i]=p; cp[i-1]->uval.next=p; } cp[s]->uval.next=head; for(k=1;k<=t;k++) { printf("\t 第%d个元素(行号i 列号j 值v,数字间用空格分隔):",k); scanf("%d%d%d",&i,&j,&v); p=(link *)malloc(sizeof(link)); p->i=i;p->j=j;p->uval.v=v; q=cp[i]; while((q->rptr!=cp[i])&&(q->rptr->jrptr; p->rptr=q->rptr; q->rptr=p; q=cp[j]; while((q->cptr!=cp[j])&&(q->cptr->icptr; p->cptr=q->cptr; q->cptr=p; } return head; (4)输出十字链表的函数 link *p,*q; p=(link *)malloc(sizeof(link)); p->i=i;p->j=j;p->uval.v=v; q=cp[i];

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);//************************构造函

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

三元组顺序表实现矩阵的转置: /*-------------------------------------------------------------- ----------------用三元组顺序表实现对稀疏矩阵的转置----------------- ------------------------编译环境: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)处存在非零元素,则返回该元素存储在矩阵中的序号

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

专业课程设计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( )实现。当用户选择该功能,系统提示输

稀疏矩阵的十字链表加法

目录 前言 (1) 正文 (1) 1.课程设计的目的和任务 (1) 2.课程设计报告的要求 (1) 3.课程设计的内容 (2) 4.稀疏矩阵的十字链表存储 (2) 5.稀疏矩阵的加法思想 (4) 6.代码实现 (5) 7.算法实现 (5) 结论 (8) 参考文献 (9) 附录 (10)

前言 采用三元组顺序表存储稀疏矩阵,对于矩阵的加法、乘法等操作,非零元素的插入和删除将会产生大量的数据移动,这时顺序存储方法就十分不便。稀疏矩阵的链接存储结构称为十字链表,它具备链接存储的特点,因此,在非零元素的个数及位置都会发生变化的情况下,采用链式存储结构表示三元组的线性更为恰当。 正文 1.课程设计的目的和任务 (1) 使我我们进一步理解和掌握所学的程序的基本结构。 (2) 使我们初步掌握软件开发过程的各个方法和技能。 (3) 使我们参考有关资料,了解更多的程序设计知识。 (4) 使我们能进行一般软件开发,培养我们的能力并提高我们的知识。 2.课程设计报告的要求 (1)课程设计目的和任务,为了达到什么要求 (2)课程设计报告要求 (3)课程设计的内容,都包含了什么东西 (4)稀疏矩阵和十字链表的基本概念,稀疏矩阵是怎么用十字链表存储 (5)十字链表矩阵的加法 (6)代码实现 (7)算法检测

3.课程设计的内容 (1)根据所学知识并自主查找相关资料 (2)进行算法设计与分析 (3)代码实现,组建并运行结果查看是否正确 (4)书写课程设计说明书 4.稀疏矩阵的十字链表存储 稀疏矩阵是零元素居多的矩阵,对于稀疏矩阵,人们无法给出确切的概念,只要非零元素的个数远远小于矩阵元素的总数,就可认为该矩阵是稀疏的。 十字链表有一个头指针hm ,它指向的结点有五个域,如图1所示。row 域存放总行数m ,col 域存放总列数n ,down 和right 两个指针域空闲不用,next 指针指向第一个行列表头结点。 c o l r o w 图1 总表点结点 有S 个行列表头结点h[1],h[2],......h[s]。结点结构与总表头结点相同。Row 和col 域置0,next 指向下一行列表头结点,right 指向本行第一个非零元素结点,down 指向本列第一个非零元素结点如图2所示。当最后一个行列表头结点的next 域指向总表头结点的hm 时,就形成循环链表,见图4的第一行。

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

教学单位计算机科学与技术 学生学号 5 数据结构 课程设计报告书 题目稀疏矩阵运算器 学生豹 专业名称软件工程 指导教师志敏

实验目的:深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 需要分析:稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行逻辑信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入以三元组表示,输出以通常的阵列形式列出。 软件平台:Windows 2000,Visual C++ 6.0或WINTC 概要设计:ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {| 0≤i≤b1-2, 0≤j≤b2-1} COL = {| 0≤i≤b1-1, 0≤ j≤b2-2} 基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵M. Print SMatrix(M); //初始化条件: 稀疏矩阵M存在. //操作结果:输出稀疏矩阵M. AddSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的和Q=M+N. SubSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的差Q=M-N. MultSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M的列数等于N的行数. //操作结果:求稀疏矩阵的乘积Q=M*N. } ADT Array

第四讲矩阵的运算和逆矩阵

§2.2 矩阵的运算 1.矩阵的加法定义:设有两个n m ?矩阵)(),(ij ij b B a A ==,那么矩阵A 与B 的和记作A +B ,规定为 n m ij ij b a B A ?+=+)( 设矩阵)(),(ij ij a A a A -=-=记,A -称为矩阵A 的负矩阵.显然有 0)(=-+A A . 规定矩阵的减法为)(B A B A -+=-. 2.数与矩阵相乘定义:数λ与矩阵)(ij a A =的乘积记作A λ,规定为n m ij a A ?=)(λλ 由数λ与矩阵A 的每一个元素相乘。 数乘矩阵满足下列运算规律(设B A ,为同型矩阵,μλ,为数): )(i )()(A A μλλμ= )(ii A A A μλμλ+=+)( )(iii B A B A λλλ+=+)( 3.矩阵与矩阵相乘定义:设)(ij a A =是一个s m ?矩阵,)(ij b B =是一个n s ?矩 那么规定矩阵A 与矩阵B 的乘积是一个n m ?矩阵)(ij c C =,其中),,2,1;,,2,1(,12211n j m i b a b a b a b a c kj s k ik sj is j i j i ij ===+++=∑= 并把此乘积记作AB C =,两矩阵相乘,要求左边距阵的列等于右边矩阵的行,乘积的矩阵的行与左边的行相同,列与右边的列相同。 例3:求矩阵???? ? ??-=???? ??-=043211,012301B A 的乘积BA AB 及. 解 ???? ? ??--=???? ??--=1204638311,50113BA AB 从本例可以看出AB 不一定等于BA ,即矩阵乘法不满足交换律

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

课程设计 课程:数据结构 题目:稀疏矩阵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

稀疏矩阵的相加

稀疏矩阵的相加 题目: 稀疏矩阵的相加 1、问题描述 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。 2、设计 2.1. 存储结构设计 稀疏矩阵的行逻辑连接的顺序表存储结构表示如下: #define MAXSIZE 20 /* 非零元个数最大值*/ 最大值*/#defi ne MAXRC 10 /* 各行第一个非零元总数 typedef struct{ , 列下标*/ int i,j; /* 行下标 int e; /* 非零元值*/ }Triple; typedef struct { /* 行逻辑链接的顺序表*/ Triple data[MAXSIZE+1]; /* 非零元三元组表,data[0] 未用*/ int rpos[MAXRC+1]; /* 各行第一个非零元的位置表*/ int mu,nu,tu; /* 阵的行数、列数和非零元个数*/ }TSMatrix; 2.2. 主要算法设计

对 2 个矩阵相加的算法如下: bool AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q) /* 求稀疏矩阵的和Q=M+N*/ { int p=1,q=1,k=1; if(M.tu==0&&N.tu==0) /* 为空矩阵的情况*/ { cout<<" 该矩阵为空矩阵"<N.data[q].i) /*M 的行值比N 的大取N 的值*/ { Q.data[k].i=N.data[q].i; Q.data[k].j=N.data[q].j; Q.data[k].e=N.data[q].e; k++;

(完整版)逆矩阵的几种求法与解析(很全很经典)

逆矩阵的几种求法与解析 矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷.逆矩阵又是矩阵理论的很重要的内容, 逆矩阵的求法自然也就成为线性代数研究的主要内容之一.本文将给出几种求逆矩阵的方法. 1.利用定义求逆矩阵 定义: 设A 、B 都是n 阶方阵, 如果存在n 阶方阵B 使得AB= BA = E, 则称A 为可逆矩阵, 而称B 为A 的逆矩阵.下面举例说明这种方法的应用. 例1 求证: 如果方阵A 满足A k= 0, 那么EA 是可逆矩阵, 且 (E-A )1-= E + A + A 2+…+A 1-K 证明 因为E 与A 可以交换, 所以 (E- A )(E+A + A 2+…+ A 1-K )= E-A K , 因A K = 0 ,于是得 (E-A)(E+A+A 2+…+A 1-K )=E , 同理可得(E + A + A 2+…+A 1-K )(E-A)=E , 因此E-A 是可逆矩阵,且 (E-A)1-= E + A + A 2+…+A 1-K . 同理可以证明(E+ A)也可逆,且 (E+ A)1-= E -A + A 2+…+(-1)1-K A 1-K . 由此可知, 只要满足A K =0,就可以利用此题求出一类矩阵E ±A 的逆矩阵. 例2 设 A =? ? ?? ? ???? ???0000 30000020 0010,求 E-A 的逆矩阵. 分析 由于A 中有许多元素为零, 考虑A K 是否为零矩阵, 若为零矩阵, 则可以采用例2 的方法求E-A 的逆矩阵. 解 容易验证

A 2 =????????? ???0000000060000200, A 3=? ? ?? ? ? ? ?? ???00000000 00006000 , A 4=0 而 (E-A)(E+A+ A 2+ A 3)=E,所以 (E-A)1-= E+A+ A 2+ A 3= ? ? ?? ? ???????1000 31006210 6211. 2.初等变换法 求元素为具体数字的矩阵的逆矩阵,常用初等变换法.如果A 可逆,则A 可通过初等变换,化为单位矩阵I ,即存在初等矩阵S P P P ,,21Λ使 (1)s p p p Λ21A=I ,用A 1-右乘上式两端,得: (2) s p p p Λ21I= A 1- 比较(1)(2)两式,可以看到当A 通过初等变换化为单位矩阵的同时,对单位矩阵I 作同样的初等变换,就化为A 的逆矩阵A 1-. 用矩阵表示(A I )??? →?初等行变换 为(I A 1-),就是求逆矩阵的初等行变换法,它是实际应用中比较简单的一种方法.需要注意的是,在作初等变换时只允许作行初等变换.同样,只用列初等变换也可以求逆矩阵. 例1 求矩阵A 的逆矩阵.已知A=???? ? ?????521310132. 解 [A I]→??????????100521010310001132→???? ? ?????001132010310100521 → ??????????--3/16/16/1100010310100521→???? ??????-----3/16/16/110012/32/10103/46/136/1001

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

专业课程设计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( )实现。当用户选择该功能,系统提示用户初始

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

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

————————————————————————————————作者:————————————————————————————————日期: 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

稀疏矩阵乘法的运算

课程设计任务书 学生姓名:专业班级: 指导教师:夏红霞工作单位:计算机科学与技术学院题目: 稀疏矩阵乘法的运算 课程设计要求: 1、熟练掌握基本的数据结构; 2、熟练掌握各种算法; 3、运用高级语言编写质量高、风格好的应用程序。 课程设计任务: 1、系统应具备的功能: (1)设计稀疏矩阵的存储结构 (2)建立稀疏矩阵 (3)实现稀疏矩阵的乘法 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、不足之处、设计体会等; (4)结束语; (5)参考文献。 时间安排:2010年7月5日-9日(第19周) 7月5日查阅资料 7月6日系统设计,数据结构设计,算法设计 7月7日 -8日编程并上机调试 7月9日撰写报告 7月10日验收程序,提交设计报告书。 指导教师签名: 2010年7月4日系主任(或责任教师)签名: 2010年7月4日

目录 1.摘要 (1) 2.关键字 (1) 3.引言 (1) 4. 问题描述 (1) 5. 系统设计 (1) 6. 数据结构 (3) 7. 算法描述 (3) 8. 测试结果与分析 (4) 9. 源代码 (12) 10. 总结 (29) 11.参考文献 (29)

稀疏矩阵乘法的运算 1.摘要:在一些数值计算中,一些二维矩阵的乘法运算很常见,我们经常采用线性代数中的知识进行运算,然而对一些含有非零元很少的二维矩阵也采用相同的方法时,就会发现那样的方法不仅需要很多的空间来存储0,造成空间复杂度比较大,而且算法的时间复杂度也较大。因此需要采取其他的方法来解决这个问题,由于0在乘法中其结果总是0,所以可以考虑采用三元组的方式去存储稀疏矩阵中的非零元,这样在计算过程中不仅需要的内存空间减少了,而且运算的速率也提高了。 2.关键字:稀疏矩阵乘法二维矩阵算法复杂度 3.引言:随着科学技术的发展,人们对矩阵的运算的几率越来越大,特别是高新科技研究中对矩阵的运算更是常见。但是如何高效的并占内存少的进行矩阵运算就是一个急需解决的问题。本文主要对稀疏矩阵的存储以及稀疏矩阵的乘法运算进行了研究和探讨。 4.问题描述:在一些数值计算中,一些二维矩阵的乘法运算很常见,我们经常采用线性代数中的知识进行运算,然而对一些含有非零元很少的二维矩阵也采用相同的方法时,就会发现那样的方法不仅需要很多的空间来存储0,造成空间复杂度比较大,而且算法的时间复杂度也较大。为了减少空间和时间复杂度,可以根据给定的二维数组的数据设计稀疏矩阵的存储结构,然后根据设计的稀疏矩阵存储结构建立一个稀疏矩阵,最后获得两个二维数组得到他们各自的稀疏矩阵,计算这两个稀疏矩阵的乘积。 5.系统设计: 5.1 设计目标:通过一定的数据结构,存储含有少量数据的矩阵,把他们存入一个稀疏矩阵中,然后实现稀疏矩阵的乘法运算。[基本要求]设计稀疏矩阵的存储结构;建立稀疏矩阵;实现稀疏矩阵的乘法

稀疏矩阵乘法运算

稀疏矩阵的乘法运算 程序代码: #include #include #include #include #include #include #define Ture 1 #define Overflow -1 typedef struct OLnode { int i,j; int e; struct OLnode *right,*down; }OLnode,*Olink; typedef struct { Olink *rhead,*chead; int mu,nu,tu; }Crosslist; //在十字链表M.rhead[row]中插入一个t结点

void insert_row(Crosslist &M,OLnode *t,int row) { OLnode *p; int col=t->j; if(M.rhead[row]==NULL||M.rhead[row]->j>col) { t->right=M.rhead[row]; M.rhead[row]=t; } else { for(p=M.rhead[row];p->right&&p->right->jright);//寻找在行表中的插入位置 t->right=p->right; p->right=t; } } //在十字链表M.chead[col]中插入一个结点t void insert_col(Crosslist &M,OLnode *t,int col) { OLnode *p; int row=t->i; if(M.chead[col]==NULL||M.chead[col]->i>row) { t->down=M.chead[col];

稀疏矩阵(实验报告)

《数据结构课程设计》实验报告 一、实验目的: 理解稀疏矩阵的加法运算,掌握稀疏矩阵的存储方法,即顺序存储的方式,利用顺序存储的特点——每一个元素都有一个直接前驱和一个直接后继,完成相关的操作。 二、内容与设计思想: 1、设计思想 1)主界面的设计 定义两个矩阵a= 0 0 3 0 0 0 0 0 b= 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组C,用于存放数组A 和数组B相加后的结果。 2)实现方式 稀疏矩阵的存储比较浪费空间,所以我们可以定义两个数组A、B,采用压缩存储的方式来对上面的两个矩阵进行存储。具体的方法是,将非零元素的值和它所在的行号、列号作为一个结点存放在一起,这就唯一确定一个非零元素的三元组(i、j、v)。将表示稀疏矩阵的非零元素的三元组按行优先的顺序排列,则得到一个其结点均为三元组的线性表。即:以一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。例如,上面的矩阵a,利用数组A存储后内容为: A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1 同理,用数组B存储矩阵b的值。 2、主要数据结构 稀疏矩阵的转存算法: void CreateMatrix(int A[m][n],int B[50]) { int i,j,k=0; for(i=0;i

数据结构实验报告(实验五 稀疏矩阵运算器)

韶关学院 学生实验报告册 实验课程名称:数据结构与算法 实验项目名称:实验五数组及其应用 稀疏矩阵运算器 实验类型(打√):(基础、综合、设计√) 院系:信息工程学院计算机系专业:***** 姓名:*** 学号:***** 指导老师:陈正铭 韶关学院教务处编制

一、实验预习报告内容

二、实验原始(数据)记录 实验时间:2007 年 5 月30日(星期三第7,8 节)实验同组人:

三、实验报告内容 2007年 5 月30 日

注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。 2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。

【源程序】 #include #include #include #define maxsize 100 #define maxrow 100 #define OK 1 #define ERROR -1 typedef struct{ int row; //行数 int col; //列数 int v; //非零元素值 }triplenode; typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数}rtripletable; void creat(rtripletable &A) //创建稀疏矩阵 { int k=1,sum=1,loop,p,t; int num[maxrow+1]; cout<<"请输入矩阵的行数和列数:"<>A.mu; cout<<"列数:";cin>>A.nu; cout<<"非零元素个数:";cin>>A.tu; cout<<"请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记!"<>A.data[loop].row>>A.data[loop].col>>A.d ata[loop].v; //输入三元组的行数,列数和非零元素值 } for(p=1;p<=A.mu;p++) num[p]=0; //A三元组每一列的非零元素个数 for(t=1;t<=A.tu;t++) ++num[A.data[t].row]; //求A中每一列含非零元个数 A.rowtab[1]=1; //求第p列中第一个非零元在A.data中的序号for(t=2;t<=A.mu;t++) A.rowtab[t]=A.rowtab[t-1]+num[t-1]; return; } void print(rtripletable A) //输出稀疏矩阵 { int result[maxrow+1][maxrow+1]; //定义一个二维数组 int loop1,loop2; for(loop1=1;loop1<=A.mu;loop1++) for(loop2=1;loop2<=A.nu;loop2++) result[loop1][loop2]=0; //初始化为0 for(loop1=1;loop1<=A.tu;loop1++) result[A.data[loop1].row][A.data[loop1].col]=A.dat a[loop1].v; for(loop1=1;loop1<=A.mu;loop1++) { cout<<"|"; for(loop2=1;loop2<=A.nu;loop2++) cout<

相关主题