矩阵操作C++

矩阵操作C++
矩阵操作C++

淮阴工学院

算法设计技能训练

设计题目:矩阵操作(动态数组)

院别:计算机与软件工程学院

专业:计算机科学与技术

班级:XXXXXXXXXX

学生姓名:XXX 学号:XXXXXXXXXX

指导教师:XXX XXX

2017 年11 月

算法设计技能训练成绩

班级:计算机1161

学生姓名:XXX学号:1161301105

院别:计算机与软件工程学院

算法设计技能训练题目:矩阵操作(动态数组)

教师签字:

日期:

目录

1 引言 (1)

1.1课题描述 (1)

1.2课题意义 (1)

1.3设计思想 (1)

2 总体设计 (2)

2.1总体功能结构 (2)

2.2类的分析与设计 (2)

3 详细设计和实现 (3)

3.1构建m*n的全零矩阵 (3)

3.2构建n*n的方阵 (3)

3.3拷贝构造函数(深拷贝) (3)

3.4根据一维数组拷贝函数 (3)

3.5根据二维数组拷贝函数 (3)

3.6析构函数 (4)

3.7矩阵转置 (4)

3.8矩阵信息获取及修改 (4)

3.9矩阵加法 (4)

3.10矩阵减法 (4)

3.11矩阵乘法 (5)

3.12重载=运算符 (5)

3.13打印函数 (5)

4 系统测试 (6)

4.1主界面 (6)

4.2创建矩阵 (6)

4.3矩阵相加 (8)

4.4矩阵相减 (9)

4.5矩阵数乘 (9)

4.6矩阵转置 (10)

4.6矩阵相乘 (10)

结论 (11)

致谢 (12)

参考文献 (13)

附录 (14)

1 引言

1.1课题描述

设计矩阵操作类算法,并做到可以动态的操作不同类型的数组,矩阵操作包括各种类型的构造函数如直接构造m*n型的全零矩阵或者全零方阵或者根据一维数组二维数组来构造矩阵,然后是析构函数。还需要返回行数列数以及设置某一位置的值和返回某一位置的值,操作类主要包括矩阵的转置、加减乘除和数乘赋值功能还有打印功能

1.2课题意义

矩阵是线性代数研究的主要对象。矩阵是由来源于某一问题的有关的数据所组成的矩形数表,在对矩阵定义了一些重要的运算并逐渐形成了矩阵的理论体系后,矩阵成为对数学研究即应用非常有效的数学工具,矩阵计算的理论与方法在许多实际问题研究中有着广泛的应用。将矩阵用代码实现可以大大减少实际计算工作量,使人们在生活研究方面得到很大的便利,省时省力。

1.3设计思想

本算法主要设计一个Matrix的类来实现矩阵的各种操作。该矩阵操作的数据类型可以自己选择,因为采用了模板,相对的设计时也会稍微繁琐一些。矩阵数据成员主要有矩阵元素的头指针,矩阵行数rowNum,矩阵列数colNum。公有成员函数则要实现各种方式的构造函数如直接构造m*n型的全零矩阵或者全零方阵或者根据一维数组二维数组来构造矩阵。获得矩阵信息的功能如获得矩阵的行数列数获得矩阵某一位置的值打印矩阵等。还有修改矩阵某一位置的值的功能,再接下来是最重要的矩阵的各种操作包括加减乘和数乘还有转置等,这些主要通过重载运算符来实现。

2总体设计

2.1总体功能结构

2.1.1数据成员包括

矩阵类所开辟的空间的头指针item、矩阵行数rowNum、矩阵列数colNum。

2.1.2主要功能包括

在这里采用C++语言实现一个可动态分配的矩阵类,类中包括一些简单的运算等操作具体要求如下:

(1)使用构造函数完成矩阵的初始化赋值(动态内存分配);

(2)使用拷贝构造函数完成矩阵复制的深拷贝;

(3)使用析构函数完成矩阵动态内存的释放;

(4)使用函数实现两个矩阵的和;

(5)使用函数实现两个矩阵的差;

(6)使用函数实现两个矩阵的积;

(7)使用函数求矩阵的数乘;

(8)使用函数实现矩阵的转置;

(9)编写一个主函数测试上述功能。

2.2类的分析与设计

根据实验要求,设计Matrix类,头文件主要有,,,除了矩阵所开辟的空间的头指针和矩阵行数列数为类的私有成员其余均为类的公有成员。因为用了模板所以实现时要注意格式对应,每个函数在类外定义时记得在前面加一句template ,里面的类型定义如果是要设计矩阵内部元素的都用T来代替,然后返回类型还有形参如果是Matrix的话记得在后面加

3详细设计和实现

3.1构建m*n的全零矩阵

构造时注意容错率,当m,n的输出出错时可以进行提醒并重新输入,输入正确行数m和列数n,item开辟一个新的大小为m*n的空间,空间的数据类型因为使用了模板可以根据使用者的要求进行变换。矩阵的所有元素在空间是按行依次线性排列的。通过for循环将所有数据成员赋值为零。

3.2构建n*n的方阵

构造时注意容错率,当n的输出出错时可以进行提醒并重新输入,输入正确n,item开辟一个新的大小为n*n的空间,空间的数据类型因为使用了模板可以根据使用者的要求进行变换。方阵的所有元素在空间是按行依次线性排列的。通过for循环将所有数据成员赋值为零。

3.3拷贝构造函数(深拷贝)

这里采用深拷贝,而不是直接复制值的浅拷贝,因为浅拷贝直接复制指针的地址,这样会导致两个矩阵共用一个空间即两个矩阵其实是同一个矩阵,其中一个变了另一个也会跟着变。浅拷贝缺点太多,所以这里采用创建一个新的空间把值全部复制过来的深拷贝。空间的类型因为有模板可以根据需要随意更改。

3.4根据一维数组拷贝函数

因为矩阵的空间里的数据也是线性排列的,所以只要提供一维数组的行数和列数信息就可以实现把一维数组所包含的矩阵复制到数据成员空间中。item根据类型需要开辟空间,然后通过for循环将数组成员复制过去,最后给数据成员行数和列数值就可以了。

3.5根据二维数组拷贝函数

因为矩阵最常见的形式是二维数组,所以也需要通过二位数组来构造矩阵,不过一般以二维数组为形参的话数组的第二个纬度一定要先设置好值,这样就无法实现动态的构造各种规模的矩阵。所以这里采用另一种方法,就是数组转化为指针的指针。除了形参为指针的指针,在赋值的时候记得把数组强制转化一下就可以了,这样就可以动态构造任意类型的矩阵了

3.6析构函数

因为只创建了一个连续的数组空间所以比较简单,直接delete就好了。

3.7矩阵转置

转置函数主要实现将矩阵的行列进行对换,所以赋值时注意把数据成员的行数和列数对调,这里的操作是返回转置后的对象,所以注意this的使用,赋值时是第i行第j列换成第j行第i列,返回类型是Matrix。

3.8矩阵信息获取及修改

返回行数列数比较简单,直接return对应值就好了。返回某一矩阵的值则注意位置对应关系,i和j都是从0开始的,所以对应关系是i*colNum+j。加上const 是为了防止对原数据造成未知的修改。

设置某一位置的值也要注意对应关系,对应关系上面已经分析过了都是一样的为i*colNum+j。虽然加了模板,但是修改时还是只能改成原矩阵的数据类型,模板主要在创建的时候起作用。

3.9矩阵加法

加法函数这里使用对加法运算符重载的形式,矩阵加法必须两个行列数要相同否则不能相加,所以这里使用if语句进行判断,如果不想等就只返回原矩阵。这里没有开辟新空间所以是对加法运算符前面的那个矩阵的空间进行操作,所以待会用等号运算符后,不仅等号前面的矩阵变了,加法前面的矩阵也会变而且两者是相同的。把每个元素重新设置成相加后的值然后返回就好了,注意位置对应关系不要搞错了就好了。

3.10矩阵减法

减法函数通过对减法运算符的重载来实现。使用时也要用if语句来判断两个矩阵是否能相减,不能则返回原矩阵。同样的,减法也是在减法运算符的前面的矩阵空间里进行操作,通过for循环将每个对应位置的值算好然后赋值给这个空间的对应位置,因为前面已经有了get()set()等函数所以接下来的操作都会方便很多。同样当用x=y-x时,y也随着变了,而且y的值和x的值是一样的。

3.11矩阵乘法

3.11.1矩阵间相乘

矩阵间的乘法则是要求左边矩阵的列数等于右边矩阵的行数,这样乘积才有意义。所以开始就要用if语句来判断两个矩阵是否符合条件,不符合则输出无法相乘,符合则进行计算。创建的新矩阵行数列数应为相乘后的行列数,然后通过for 循环按照矩阵运算的法则进行计算并将得出值赋给对应位置。最后返回该矩阵。

3.11.2矩阵的数乘

数乘相对来说要简单一些,基本操作和上述都差不多,不用开辟新的矩阵,直接在原矩阵上操作就好了,将所有值都乘以输入的数再放回去就好了,最后返回矩阵。

3.12重载=运算符

重载=运算符,执行该运算符时要先判断原矩阵是否存在,如果存在就删除掉原矩阵。重新创建一个和后面矩阵行列数对应的矩阵,然后将对应的值赋值过去,然后返回this指针即可。

3.13打印函数

打印函数要用到格式化输出,所以头文件要包括,用setw()函数来每个输出的数所占的字节数,来达到对齐的目的,经过比较数字还是右对齐比较好看所以使用setiosflags(ios::right)来使输出的数都在所占字节的最右边。每输出一行,用endl换行。

4系统测试

4.1主界面

图4-2-1

该main函数用于测试功能,但在编写过程中遇到了不少问题,还好在于永涛老师的帮助下都解决了。首先我限制了最多只能创建两个矩阵,继续往下创建的话变化的都是第二个矩阵,因为只是简单的实现一下函数的功能。使用456功能时默认是对第一个矩阵使用,所以不用将要使用该功能的矩阵创建在第二个。4.2创建矩阵

图4-2-2

主界面输入1后会显示这个画面,显示有四种创建数组的方式,这四种方式会在这里一一展示,不过待会的运算操作主要用的是34两种方式。

4.2.1m*n的零矩阵

图4-2-3

图4-2-4

输入1后再根据提示输入行数和列数,就可以得到对应的零矩阵4.2.2n*n的零方阵

图4-2-5

图4-2-6

输入2后根据提示输入方阵的维度就可以创建对应的零方阵了。

4.2.3一维数组构建矩阵

图4-2-7

图4-2-8

输入1然后再输入3进入一维数组创建矩阵功能,根据提示依次输入矩阵行数和列数,然后从左到右从上到下依次输入就能成功创建该矩阵,并且该矩阵会被打印出来方便检查是否有错。

4.2.4二维数组构建矩阵

图4-2-9

图4-2-10

输入1在输入3进入二维数组创建矩阵功能,根据提示依次输入矩阵行数和列数,然后从左到右从上到下依次输入就能成功创建该矩阵,输入后屏幕同样会把该矩阵打印出来方便检查是否有错。

4.3矩阵相加

这里的相加就用上面34构造出来的矩阵

图4-2-11

4.4矩阵相减

因为上面已经执行过相加了,所以矩阵1就变成结果的那个矩阵了

图4-2-12

4.5矩阵数乘

图4-2-13

图4-2-14

输入5后显示要被数乘的矩阵,然后按照提示输入要乘的数,屏幕就会打印出结果了,而且原函数也已经变成数乘后的结果了。

4.6矩阵转置

该main函数的转置功能是把转置功能打印出来,并没有改变原函数的原值。

图4-2-15

4.6矩阵相乘

因为那两个构建的矩阵不符合矩阵相乘的要求,所以要重新构建两个,根据矩阵相乘的规则,第一个矩阵的的列要和第二个矩阵的行相同,输入完两个矩阵后在主界面输入4屏幕就会依次打印出矩阵1和矩阵2还有相乘后的结果并且第一个矩阵会变成相乘后的结果。

图4-2-16

经测试,函数的功能都能顺利实现。

结论

矩阵操作需要扎实的c++基础,因为里面涉及到各个方面的操作,同时设计该算法也是对过去知识一次很好的巩固。在这里有好几个个人认为比较重要的点需要注意,第一个是模板,使用了模板无疑加大了代码的难度,但也提高了代码的适用性,可以处理多种类型的数据,使用模板时要注意每个函数前要加template,然后当要返回的类型或者使用的形参是Matrix类时,后面都要加上,再函数里面开辟新空间时要类型换成T,类似这样的都要注意到,否则一个不小心代码就会发生错误。第二个是动态的创建数组以及将之拷贝到矩阵类中,这里面主要要处理的问题是一般数组定义需要确定的空间,而我们是为了实现动态构造数组,就不能使用那种方法,所以我用指针的方法来构造,因为矩阵的物理储存结构是线性有规律的,所以可以通过指针的位移来进行赋值操作,形参要把指针类型。第三个是main函数里的问题,在实现时发现在对象还未定义前就在下面进行使用是会出现问题的,所以这个时候要把前面的定义换成用指针类new一个对象,在主函数前就先定义好指针,这样才能完成在case语句中写入语句操作还未定义的对象。还有就是用了指针之后操作运算符时都要用指针形式来操作如*a=*a+*b。所以熟悉了二维数组和指针还有类之间的关系,才能完成这次的课程设计。

致谢

在这一周的算法技能设计训练里,多亏了于长辉老师和高丽老师的指导还有同学们的帮助,是老师们一丝不苟的工作作风和耐心的讲解,我才能理解算法,并知道自己这一周要做什么怎么做。在这里最要感谢的大一的c++老师于永涛,在我每次遇到困难无法解决时是他一直细心的指导着我,并且每一次都能帮我完美解决。所以这个设计不是我一个人的成果,有了大家的无私帮助,我才能顺利的完成这次的算法设计。

参考文献

1 郑振杰.C++程序设计北京:人民邮电出版社,2005

2 柴欣.C/C++程序设计河北大学出版社,2002

3 余苏宁、王明福.C++程序设计北京:高等教育出版社,2003

4 吕凤翥.C++语言程序设计(第2版).电子工业出版社,2007.2

5 李云清、杨庆红、揭安全.数据结构[M].人民邮电大学出版社,2004.6

6 Marshall P. Cline and Greg A. Lomow, C++ FAQs, Addison-Wesley, 1995

7 Bruce Eckel, Thinking in C++(C++ 编程思想,刘宗田等译),机械工业出版社,2000

8 Steve Maguire, Writing Clean Code(编程精粹,姜静波等译),电子工业出版社,1993

9 Scott Meyers, Effective C++, Addison-Wesley, 1992

10 Robert B. Murry, C++ Strategies and Tactics, Addison-Wesley, 1993

11 Steve Summit, C Programming FAQs, Addison-Wesley, 1996

附录

#include

#include

#include

using namespace std;

template

class Matrix

{

T *item; //指向矩阵的第一个元素

introwNum; //矩阵行数

intcolNum; //矩阵列数

public:

Matrix(int m, int n); //构建m*n的全零矩阵

Matrix(int n); //构建一个n*n的全零方阵

Matrix(const Matrix&x); //拷贝构造函数(深拷贝)

Matrix(T *items, int m, int n); //根据一维数组拷贝函数

Matrix(T **items, int m, int n); //根据二维数组拷贝函数

~Matrix(); //析构函数

Matrix Trans() const; //将矩阵转置

void set(inti, int j, T value); //设置矩阵某一位置值

intgetRow() const { return rowNum;} //返回行数

intgetCol() const { return colNum;} //返回列数

T get(inti, int j) const { return item[i*colNum + j]; } //返回某一位置的值Matrix operator +(const Matrix&m); //两个矩阵相加

Matrix operator -(const Matrix&m); //两个矩阵相减

Matrix operator *(const Matrix&m); //两个矩阵相乘

Matrix operator *(const T f); //矩阵乘以常数

Matrix& operator=(const Matrix& m);

void print(); //打印矩阵

};

template

Matrix::Matrix(int m, int n)

{

if(m<0||n<0)

{

cerr<<"矩阵大小不能为负";

exit(1);

}

rowNum = m;

colNum = n;

item = new T[m*n];

item[i] = 0;

}

template

Matrix::Matrix(int n)

{

if(n<0)

{

cerr<<"矩阵大小不能为负";

exit(1);

}

rowNum = n;

colNum = n;

item = new T[n*n];

for(inti=0; i

item[i] = 0;

}

template

Matrix::Matrix(const Matrix &x) {

rowNum = x.rowNum;

colNum = x.colNum;

item = new T[rowNum*colNum];

for(inti=0; i

item[i] = x.item[i];

}

template

Matrix::Matrix(T *items, int m, int n) {

item = new T[m*n];

for(inti=0; i

{

item[i] = items[i];

}

rowNum = m;

colNum = n;

}

template

Matrix::Matrix(T **items, int m, int n) {

item = new T[m*n];

rowNum = m;

colNum = n;

for(int j=0; j

item[i*n+j] = items[i][j];

cout<

}

template

void Matrix::print()

{

for(inti=0; i

{

cout<

if((i+1)%colNum==0)

cout<

}

}

template

Matrix::~Matrix()

{

delete []item;

}

template

void Matrix::set(inti, int j, T value)

{

item[i*colNum+j] = value;

}

template

Matrix Matrix::operator +(const Matrix&m)

{

if (m.colNum != colNum || m.rowNum != rowNum) return *this;

Matrix _copy = *this;

for (inti = 0; i

{

for (int j = 0; j

{

_copy.set(i, j, get(i, j) + m.get(i, j));

}

}

return _copy;

}

template

Matrix Matrix::operator -(const Matrix&m)

{

if (m.colNum != colNum || m.rowNum != rowNum) return *this;

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

c语言实现矩阵的相关操作

算法分析与设计课程论文 —通过C语言实现矩阵的相关操作

一.摘要 本文在Microsoft Visual Studio 2010的编译环境下,通过C语言进行一些矩阵的基本操作,包括矩阵的设置,加减乘除,数乘运算。求矩阵的逆等操作。 关键词 矩阵 C语言逆矩阵 二.正文 1.引言 矩阵的相关知识只是是高等数学的基础,但是其庞大的运算量和纷繁的步骤让人却步。虽然有Matlab等软件可以实现矩阵的相关操作,但是我校一些专业并不学习数学实验,故通过C语言实现矩阵的操作也是一种可行的方法,本文列举的了一些矩阵的加减乘除等基本运算规则,还有对矩阵进行转置,也有矩阵求逆的相关操作。 同时,还介绍了行列式的计算,通过运行该程序,可以大大简化行列式的计算量。 2.算法分析

矩阵的初始化 相关概念 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。 理论分析 在C语言中,可以使用二维数组来描绘一个矩阵。值得注意的是,在二维数组中,必须标明列数,否则编译器就会报错。故二维极其多维数组使用时要注意数组下标。 代码实现

#include int main() { int juzheng [100][100]; int i , j , a , b ; printf("请输入矩阵的行数a 列数b \n") ; scanf ("%d %d",&a,&b); for (i = 0;i < a ;i++) { for (j = 0;j < b ;j++) { scanf ("%d",&juzheng[i][j]); } } printf ("你所输入的矩阵是:\n"); for (i = 0;i < a ;i++) { for (j = 0;j < b ;j++) { printf("%d ",juzheng[i][j]); } printf ("\n"); } 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)处存在非零元素,则返回该元素存储在矩阵中的序号

基本操作矩阵

基本操作—矩阵(1) 开始学习这部分内容前,我们先来回顾一下矩阵的都有哪些运算呢? 一、加法、减法 想一想:两个矩阵相加有什么条件 二、乘法 想一想:矩阵的乘法有什么规则? 三、矩阵的转置 转置运算的输入:按快捷键Ctrl+1,或直接单击Matrix工具板上的工具按钮. 四、矩阵的行列式 注意:只有方阵才可求行列式 求行列式的运算符的输入:利用快捷键| 或单击Matrix工具板上的按钮. 五、矩阵的逆矩阵 1、回顾学过的高等代数知识: (1)逆矩阵的定义是什么? (2)怎样的矩阵才有逆矩阵? 2.求逆运算符的输入:看成-1次方输入或单击Matrix工具板上的按钮 六、向量的运算 1、向量的加法、减法 2、向量的乘法 (1)回顾解析几何知识,两个向量的乘法有哪些? (2)点乘(数量积、内积) 与矩阵类似直接输入键盘乘号,或单击Matrix工具板上的按钮;其结果为一数字。例:定义两个向量 则它们的内积为 (3)叉乘(向量积、外积) 叉乘运算符的输入:通过快捷键Ctrl+8或单击Matrix工具板上的按钮。叉乘的结果是一个向量。例如u与v的外积为:

3、向量的模 (1)回顾:解析几何知识中向量的模怎么计算呢?(若 () a x,y,z =r ,则222|a|x y z =++r ) 在高等代数中:若向量,则 222 12n ||x x x α=+++L (2)向量的模运算:利用快捷键 | 或单击Matrix 工具板上的 按钮. 例: 根据向量模的定义进行验证: 补充:Matrix 工具板上的 按钮是对向量求其各个分量之和,即对向量 ,单击所得结果为 1 2 n x x x α=+++∑L

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<

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

定义:由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

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

稀疏矩阵基本操作实验报告 一、实验内容 稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相 乘等算法 二、实验目的 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 中第

实验报告 矩阵快速转置

实验报告 实验项目名称:实现矩阵的快速 转置的操作 所属课题名称:数据结构 实验类型:验证实验 实验日期: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;

matlab矩阵表示和简单操作

matlab矩阵的表示和简单操作 一、矩阵的表示在MATLAB中创建矩阵有以下规则: a、矩阵元素必须在”[ ]”内; b、矩阵的同行元素之间用空格(或”,”)隔开; c、矩阵的行与行之间用”。”(或回车符)隔开; d、矩阵的元素可以是数值、变量、表达式或函数; e、矩阵的尺寸不必预先定义。 二,矩阵的创建: 1、直接输入法最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则。建立向量的时候可以利用冒号表达式,冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3,其中e1为初始值,e2为步长,e3为终止值。还可以用linspace函数产生行向量,其调用格式为:linspace(a,b,n) ,其中a和b是生成向量的第一个和最后一个元素,n是元素总数。 2、利用MATLAB函数创建矩阵基本矩阵函数如下: (1) ones()函数:产生全为1的矩阵,ones(n):产生n*n维的全1矩阵,ones(m,n):产生m*n维的全1矩阵; (2) zeros()函数:产生全为0的矩阵; (3) rand()函数:产生在(0,1)区间均匀分布的随机阵; (4) eye()函数:产生单位阵; (5) randn()函数:产生均值为0,方差为1的标准正态分布随机矩阵。 3、利用文件建立矩阵当矩阵尺寸较大或为经常使用的数据矩阵,则可以将此矩阵保存为文件,在需要时直接将文件利用load命令调入工作环境中使用即可。同时可以利用命令reshape对调入的矩阵进行重排。reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m*n的二维矩阵。二、矩阵的简单操作 1.获取矩阵元素可以通过下标(行列索引)引用矩阵的元素,如Matrix(m,n)。 也可以采用矩阵元素的序号来引用矩阵元素。 矩阵元素的序号就是相应元素在内存中的排列顺序。 在MATLAB中,矩阵元素按列存储。 序号(Index)与下标(Subscript )是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。 其相互转换关系也可利用sub2ind和ind2sub函数求得。 2.矩阵拆分利用冒号表达式获得子矩阵: (1) A(:,j)表示取A矩阵的第j列全部元素;A(i,:)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。 (2) A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;A(:,k:k+m)表示取A矩阵第k~k+m 列的全部元素,A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。此外,还可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。利用空矩阵删除矩阵的元素:在MATLAB中,定义[]为空矩阵。给变量

MATLAB(1)-矩阵的基本操作

第二章 MATLAB 基础知识上机练习题目 (1)矩阵的基本操作 一、 答卷形式:新建一个word 文档,将以下每道练习题使用的命令(或程 序)及其结果按顺序排列在该word 文档中,文档中必须写上自己的名字和学号,并以自己的名字命名,最后提交word 文档。 二、 练习题目: 1、 生成一个3×3的矩阵A ,它的元素为你任意指定的9个不同的正整数,计算A 的行列式A 并将其赋值给变量b ,若b ≠0,求出矩阵B =1A -。若b =0,重新选择A 。 将所生成的矩阵A 及B 连在一起,构成一个3×6的矩阵,并付给变量C ,在workspace 中观察C 的类型、大小以及当前值。并用save 命令将C 存储为一个数据文件以备下列题目利用Load 命令调用; 2、 利用load 命令调出C 并取出它的1-2行,2-4列的子块,另存为一个2×3的矩阵d ,生成一个与d 相同大小的随机矩阵矩阵e ,计算d +e , d -e ,e d '*,d .*e , ()5 e d ' ,将e d '*结果中所有的对角线元素全部换为0.5。 3、 完成下列计算: 4、

4、利用rand(4,6)命令生成一个随机矩阵T,求T的矩阵大小,每一行、 每一列的最大值和最小值,整个矩阵的最大值与最小值;然后将整个矩阵的最大值所在位置的元素换为1000,将最小值所在位置的元素取为-1000。 >> T=rand(4,6) T = 0.8143 0.1966 0.3517 0.9172 0.3804 0.5308 0.2435 0.2511 0.8308 0.2858 0.5678 0.7792 0.9293 0.6160 0.5853 0.7572 0.0759 0.9340 0.3500 0.4733 0.5497 0.7537 0.0540 0.1299 >> RowMax=max(T) //每一列的最大值 RowMax = 0.9293 0.6160 0.8308 0.9172 0.5678 0.9340 >>k=T' //转秩后,求每一列的最大值就是原矩阵每行的最大值 k = 0.8143 0.2435 0.9293 0.3500 0.1966 0.2511 0.6160 0.4733 0.3517 0.8308 0.5853 0.5497 0.9172 0.2858 0.7572 0.7537 0.3804 0.5678 0.0759 0.0540 0.5308 0.7792 0.9340 0.1299 LineMax=max(k)

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

南昌航空大学实验报告 课程名称:数据结构实验名称:实验五稀疏矩阵的存储和快速转置班级:学生姓名:学号: 指导教师评定:签名: 题目:假设稀疏矩阵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已经存在。

R的矩阵操作

1 矩阵基本操作 1.1创建向量 R里面有多种方法来创建向量(Vector),最简单的是用函数c()。例如: >X=c(1,2,3,4) >X [1] 1 2 3 4 当然,还有别的方法。例如: >X=1:4 >X [1] 1 2 3 4 还有seq()函数。例如: > X=seq(1,4,length=4) > X [1] 1 2 3 4 注意一点,R中的向量默认为列向量,如果要得到行向量需要对其进行转置。 1.2创建矩阵 R中创建矩阵的方法也有很多。大致分为直接创建和由其它格式转换两种方法。 1.2.1直接创建矩阵 最简单的直接创建矩阵的方法是用matrix()函数,matrix()函数的使用方法如下: > args(matrix) function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) NULL 其中,data参数输入的为矩阵的元素,不能为空;nrow参数输入的是矩阵的行数,默认为1;ncol参数输入的是矩阵的列数,默认为1;byrow参数控制矩阵元素的排列方式,TRUE 表示按行排列,FALSE表示按列排列,默认为FALSE;dimnames参数输入矩阵的行名和列名,可以不输入,系统默认为NULL。例如: > matrix(1:6,nrow=2,ncol=3,byrow=FALSE) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 改变矩阵的行数和列数: > matrix(1:6,nrow=3,ncol=2,byrow=FALSE) [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 改变byrow参数: > matrix(1:6,nrow=3,ncol=2,byrow=T) [,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6 设定矩阵的行名和列名:

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

矩阵操作

淮阴工学院 C++程序设计课程设计报告 选题名称:矩阵操作 系(院):计算机工程系 专业:计算机科学与技术(信息安全方向)班级: ********* 姓名: ****** 学号: ********** 指导教师:于永彦 学年学期:2007 ~ 2008 学年第 2 学期二〇〇八年六月十四日

设计任务书 指导教师(签章): 年月日 1

摘要: 编写代码,实现矩阵的翻转功能、卷动功能和旋转功能。运行程序后,随机生成一个元素为三位正整数的5×5矩阵。矩阵翻转,本课程设计只考虑沿中心轴翻转(或垂直翻转或水平翻转)。矩阵翻转的实质是,矩阵的每行(或每列)元素进行倒序排放。矩阵卷动涉及两个问题:(1)卷动的方向(或左右卷动,或上下卷动);(2)卷动幅度,如上下卷动行数,左右卷动列数。矩阵卷动的实质是将某行或某列元素循环移位。上下卷动时,是将每列元素循环移位,左右卷动时,是将每行元素循环移位,卷动方向决定是左移还是右移。矩阵旋转(绕中心点)涉及两个方面:(1)旋转方向,顺时针还是逆时针;(2)旋转角度,如90°、180°、270°、360°等。矩阵旋转的实质是数组元素的重新组合,对应交换元素值。因此关键是某圈元素的旋转、交换。 关键词:行数;列数;幅度;角度;翻转;卷动;旋转 2

目录 摘要 (2) 1课题综述 (4) 1.1课题的来源及意义 (4) 1.2 预期目标 (4) 1.3 面对的问题 (5) 1.4 需要解决的关键技术 (5) 2 系统分析 (5) 2.1 涉及的知识基础 (5) 2.2 解决问题的基本思路 (7) 2.3 总体方案 (8) 2.4 功能模块框图 (8) 3 系统设计 (9) 3.1 算法描述 (9) 3.2 实现方法 (9) 3.3 详细流程图 (9) 4 代码编写 (11) 4.1 矩阵翻转 (11) 4.2 矩阵卷动 (12) 4.3 矩阵旋转 (14) 5 程序调试 (15) 6 运行结果与测试 (15) 6.1 矩阵翻转 (15) 6.2 矩阵卷动 (16) 6.3 矩阵旋转 (16) 6.4 退出程序 (17) 7 总结与展望 (18) 总结 (19) 致谢 (20) 参考文献 (21) 附录 (22) 3

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

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

实验2 矩阵基本操作(1)

实验二、矩阵的基本运算 一、 问题 已知矩阵A 、B 、b 如下: ????????? ???????????-------------=0319481187638126542 86174116470561091143A ???????? ??????????------=503642237253619129113281510551201187851697236421B []1187531=b 应用Matlab 软件进行矩阵输入及各种基本运算。 二、 实验目的: 熟悉Matlab 软件中的关于矩阵运算的各种命令 三、 预备知识 1、线性代数中的矩阵运算。 2、本实验所用的Matlab 命令提示: (1)、矩阵输入格式:A =[a 11, a 12; a 21, a 22];b =初始值:步长:终值; (2)、求A 的转置:A'; (3)、求A 加B :A +B ; (4)、求A 减B :A -B ; (5)、求数k 乘以A :k*A ; (6)、求A 乘以B :A*B ; (7)、求A 的行列式:det (A ); (8)、求A 的秩:rank (A ); (9)、求A 的逆:inv (A )或(A )-1; (10)、B 右乘A 的逆:B/A ; (11)、B 左乘A 的逆:A \B ; (12)、求A 的特征值:eig (A ); (13)、求A 的特征向量矩阵X 及对角阵D :[X ,D ]=eig (A );

(14)、求方阵A的n次幂:A^n; (15)、A与B的对应元素相乘:A.*B; (16)、存储工作空间变量:save '文件名' '变量名'; (17)、列出工作空间的所有变量:whos; 四、实验内容与要求 1、输入矩阵A,B,b; >> A=[3 4 -1 1 -9 10;6 5 0 7 4 -16;1 -4 7 -1 6 -8;2 -4 5 -6 12 -8;-3 6 -7 8 -1 1;8 -4 9 1 3 0] A = 3 4 -1 1 -9 10 6 5 0 7 4 -16 1 -4 7 -1 6 -8 2 -4 5 -6 12 -8 -3 6 -7 8 -1 1 8 -4 9 1 3 0 >> B=[1 2 4 6 -3 2;7 9 16 -5 8 -7;8 11 20 1 5 5;10 15 28 13 -1 9;12 19 36 25 -7 23;2 4 6 -3 0 5;] B = 1 2 4 6 -3 2 7 9 16 -5 8 -7 8 11 20 1 5 5 10 15 28 13 -1 9 12 19 36 25 -7 23 2 4 6 - 3 0 5 >> b=[1 3 5 7 8 11] b = 1 3 5 7 8 11 2、作X21=A'、X22=A+B、X23=A-B、X24=AB; >> X21=A' X21 = 3 6 1 2 -3 8 4 5 -4 -4 6 -4 -1 0 7 5 -7 9 1 7 -1 -6 8 1 -9 4 6 12 -1 3 10 -16 -8 -8 1 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)处存在非零元素,则返回该元素存储在矩阵中的序号 TSMatrix_Add(M, N,&Q)

相关文档
最新文档