矩阵操作C++

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

淮阴工学院

算法设计技能训练

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

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

专业:计算机科学与技术

班级: 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根据二维数组拷贝函数

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

相关文档
最新文档