当前位置:文档之家› c++课程设计-矩阵的转置与乘法计算

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

c++课程设计-矩阵的转置与乘法计算
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);//************************构造函

CMatrix(CMatrix &x); //**************************************拷贝构造函数

~CMatrix(); //****************************************************析构函数

CMatrix & operator=(const CMatrix &mat);//**************重载赋值运算符

int row() const;//**************************************************返回行数

int col() const;//**************************************************返回列数Vector & operator []( int i);//********************************重载[]

void Inver(CMatrix &mat);//****************************************矩阵转置

operator T **();//****************************************************重载**

void ReadFromFile();//*************************************从文件中读入矩阵friend CMatrix cpy(CMatrix &v);//***********************************拷贝函数

friend std::ostream & operator<<(std::ostream &s,const CMatrix &mat);//重载输出函数

friend std::istream & operator>>(std::istream &s,const CMatrix &mat);//重载输入函数

friend CMatrix operator*(CMatrix &v1,CMatrix &v2);//******矩阵乘法

friend CMatrix operator*(const CMatrix &v,T val); //************数乘

4. 程序运行结果界面

图1。进入程序、选择输入方式

图2。输入两个矩阵并选择对矩阵的操作图3。实现矩阵转置

图4。实现矩阵乘法图5。实现矩阵数乘

5. 课程设计遇到的技术问题与解决思路

问题1:对于基本的输入输出符号和运算符号无法运用到矩阵中、需要重载

解决办法:重载输入、输出、乘法、数乘、赋值等、使其能对矩阵进行操作

问题2:当输入的数字个数异于事先设定好的矩阵的容量时会出现错误

比如:当输入的行数和列数分别为2和3

时当输入“1 2 3”(个数少于2*3)则

无法实现缺省状态当输入“1 2 3 4 5 6 7”

时则多出的数字7将会成为下一要求输入

数据的一个数据

解决办法:在初始界面输入提示信息,本程序尚不能解决。

并行计算-实验二-矩阵乘法的OpenMP实现及性能分析

深圳大学 实验报告 课程名称:并行计算 实验名称:矩阵乘法的OpenMP实现及性能分析姓名: 学号: 班级: 实验日期:2011年10月21日、11月4日

一. 实验目的 1) 用OpenMP 实现最基本的数值算法“矩阵乘法” 2) 掌握for 编译制导语句 3) 对并行程序进行简单的性能 二. 实验环境 1) 硬件环境:32核CPU 、32G 存计算机; 2) 软件环境:Linux 、Win2003、GCC 、MPICH 、VS2008; 4) Windows 登录方式:通过远程桌面连接192.168.150.197,用户名和初始密码都是自己的学号。 三. 实验容 1. 用OpenMP 编写两个n 阶的方阵a 和b 的相乘程序,结果存放在方阵c 中,其中乘法用for 编译制导语句实现并行化操作,并调节for 编译制导中schedule 的参数,使得执行时间最短,写出代码。 方阵a 和b 的初始值如下: ????????? ? ??????????-++++=12,...,2,1,..2,...,5,4,31,...,4,3,2,...,3,2,1n n n n n n n a ???????? ? ???????????= 1,...,1,1,1..1,...,1,1,11,...,1,1,11,..., 1,1,1b 输入: 方阵的阶n 、并行域的线程数 输出: c 中所有元素之和、程序的执行时间 提示: a,b,c 的元素定义为int 型,c 中所有元素之各定义为long long 型。 Windows 计时: 用中的clock_t clock( void )函数得到当前程序执行的时间 Linux 计时: #include

并行计算矩阵分块乘法

目录 一、题目及要求 (1) 1、题目 (1) 2、要求 (1) 二、设计算法、算法原理 (1) 三、算法描述、设计流程 (2) 3.1算法描述 (2) 3.2设计流程 (4) 四、源程序代码及运行结果 (6) 1、超立方 (6) 1.1超立方的源程序代码 (6) 1.2运行结果 (11) 2、网孔连接 (11) 2.1源程序代码 (11) 2.2运行结果 (18) 3、在数学软件中的计算结果 (19) 五、算法分析、优缺点 (19) 1、简单的并行分块乘法的过程为 (19) 2、使用Cannon算法时的算法分析 (20) 3、算法的优缺点 (21) 六、总结 (22) 参考文献 (23)

一、题目及要求 1、题目 简单并行分块乘法:(1)情形1: 超立方连接;(2)情形2:二维环绕网孔连接 已知,177511195310135411274329,7563895712314 2120143321 ?????? ? ??----=??????? ??----=B A 求B A C ?=。 2、要求 (1)题目分析、查阅与题目相关的资料; (2)设计算法; (3)算法实现、代码编写; (4)结果分析和性能分析与改进; (5)论文撰写、答辩; 二、设计算法、算法原理 要考虑的计算问题是C=AB,其中A 与B 分别是n n ?矩阵。 ①A 、B 和C 分成p p p ?=的方块阵ij A ,ij B 和ij C ,大小均为p n p n ? ,p 个处理器编号为1 ,1, (1) 0,....,0,0---p p p p p p , ij P 存放ij A ,ij B 和ij C 。 ②通讯:每行处理器进行A 矩阵块的多到多播送(得到ik A , k=0~1-p ) 每列处理器进行B 矩阵块的多到多播送(得到kj B , k=0~ 1-p ) ③乘-加运算: ij P 做kj p k ik ij B A C ∑-== 1

矩阵相乘并行算法

并行处理技术 课程设计分析报告 课程设计题目矩阵相乘并行算法设计姓名廖杰 学号M201372880 专业计算机技术 任课教师金海石宣化 所在学院计算机科学与技术学院报告提交日期2014-01-13

一、实验目的 1、学习使用集群; 2、掌握并行处理或分布计算的编程方法; 3、学会以并行处理的思想分析问题。 二、实验要求 1、自行生成矩阵作为算法的输入; 2、使用并行处理技术编程,例如:MPI、OpenMP、MR; 3、矩阵大小至少为1000*1000; 4、加速比越大成绩越高。 三、实验内容 3.1、矩阵的划分: 对于矩阵相乘的并行算法,可以有三种:对矩阵按行划分、按列划分和棋盘式分块划分。和按行或列划分相比,棋盘式划分可以开发出更高的并行度。对于一个n×n的方阵,棋盘划分最多可以使用n^2个处理器进行并行计算,但使用按行或列分解最多可以使用n个。对矩阵相乘采用棋盘式划分的算法通常称作Cannon算法。 A)行列划分 又叫带状划分(Striped Partitioning),就是将矩阵整行或者整列分成若干个组,每个组指派给一个处理器。下图所例为4个CPU,8×8矩阵的带状划分。

在带状划分情况下,每个CPU将会均匀分配到2行(列)数据。8×8矩阵变成了一个1×4或4×1的分块矩阵,每个CPU所属的分块矩阵大小为8×2或2×8。

B)棋盘划分 就是将矩阵分成若干个子矩阵,每个子矩阵指派给一个处理器,此时任一处理器均不包含整行或者整列。下图所示即为4个处理器情况下8×8矩阵的棋盘划分,其中处理器阵列为2×2,每个处理器分配到的子矩阵大小为4×4。 矩阵划分成棋盘状可以和处理器连成二维网孔相对应。对于一个n×n维矩阵和p×p的二维处理器阵列,每个处理器均匀分配有(n/p)×(n/p)=n^2/p^2个元素。使用棋盘式划分的矩阵相乘算法一般有两种,Cannon算法和Summa算法。SUMMA算法能够计算 m*l的A矩阵和l*n的B矩阵相乘(m、l、n可不相等),而cannon算法只能实现n*n 的A矩阵和n*n的B矩阵相乘,具有很大的局限性。 3.2、算法原理 A) 行划分法 假设是M*N,计算前,将矩阵N发送给所有从进程,然后将矩阵M分块,将M中数据按行分给各从进程,在从进程中计算M中部分行数据和N的乘积,最后将结果发送给主进程。这里为了方便,有多少进程,就将M分了多少块,除最后一块外的其他数据块大小都相等,最后一块是剩下的数据,大小大于等于其他数据块大小,因为矩阵行数不一定整除进程数。最后一块数据在主进程中计算,其他的在从进程中计算。 定义两个矩阵M和N,N所有进程都需要,M可以只在主进程中定义。其他的变量视主进程和从进程需要按要求定义在合适的位置。

矩阵相乘的并行算法的设计与实现

仲恺农业工程学院实验报告纸 计算机科学与工程学院(院、系)网络工程专业083 班组并行计算应用试验课 学号:200810224311 姓名:李志冬实验日期:2011-05-19 教师评定实验三矩阵相乘的并行算法的设计与实现 一、实验目的 理解和掌握矩阵相乘的并行算法的设计思想以及实现原理 二、实验内容 编译和运行一个两矩阵相乘算法的并行程序 三、实验步骤 1 使用vi编辑器输入并行计算的代码,保存在multi.c中 #include #include "mpi.h" #define NRA 62 #define NCA 15 #define NCB 7 #define MASTER 0 #define FROM_MASTER 1 #define FROM_WORKER 2 MPI_Status status; int main(int argc, char *argv[]) { int numtasks, taskid, numworkers, source, dest, nbytes, mtype,

dbsize, rows, averow,extra,offset, i,j,k, count; double a[NRA][NCA],b[NCA][NCB],c[NRA][NCB]; intsize = sizeof(int); dbsize = sizeof(double); MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&taskid); MPI_Comm_size(MPI_COMM_WORLD,&numtasks); numworkers = numtasks-1; if(taskid==MASTER) { printf("Number of worker tasks = %d\n",numworkers); for(i=0;i

北航并行计算矩阵相乘作业

矩阵相乘并行实现 1、算法描述: 设有如下矩阵相乘: C=A×B 其中A,B分别是m×k和k×n矩阵,C是m×n矩阵。若处理器个数为p,且它们的编号依次是0,1,…,p-1,则设可将矩阵A、B、C分成p个大小为mxm的子 块,其中A=(Aij)m ×m ,B=(Bij)m ×m ,和C=(Cij)m ×m ,其中A?ij,Bij和Cij是n×n矩 阵。同时假设和。 定义对角块矩阵,则 其中,。利用此关系式,将节点编号从一维映射到二维,数据,,存放在中,可得到下面的在处理机 结点上的算法。该算法数据交量 算法流程如下: 流程图如下所示:

2、程序代码: #include #include #include #include #include #include float **A, **B, **C; float *a, *b, *c, *tmp_a, *tmp_b; int dg=1000, dl, dl2,p, sp; int my_rank, my_row, my_col; MPI_Status status; int get_index(int row, int col, int sp) { return ((row+sp)%sp)*sp + (col+sp)%sp; }

void random_A_B() { int i,j; srand((unsigned int)time(NULL)); for(i=0; i

相关主题
文本预览
相关文档 最新文档