矩阵转置及相加实验报告
C++矩阵的加法转置

南昌航空大学实验报告2011 年11 月26 日课程名称:面向对象程序设计B 实验名称:动态链接库的制作与调用班级:10201407 姓名:吴彤同组人:指导教师评定:签名:一、实验目的(所实现功能、验证性目的、创新性目的,参考实验要求)综合运用所学面向对象编程知识完成动态链接库文件的创建、调用,理解动态链接库的工作原理,体会声明和定义分开方法在程序设计中的优势,掌握利用动态链接库实现不同开发平台间混合编程的方法,掌握利用动态链接库实现代码可复用技术,进一步掌握混合开发的方法。
二、概要设计(例如数据类型、函数的声明部分以及函数的调用关系)综合应用所学面向对象编程知识定义一个多项式矩阵类并应用该类实现多项式矩阵类的运算。
具体实现该矩阵的加法(采用运算符“+”重载)、转置(采用运算符“-”重载)及输出(采用运算符“<<”重载)操作。
将该类制作为动态链接库,然后在其他工程中对该动态链接库进行调用。
通过对普通矩阵的相加和转置,把它推广到多项式矩阵。
程序源代码:(Node.h)#ifndef NODE_H#define NODE_H#ifdef DLL_FILEclass __declspec(dllexport) Node#elseclass __declspec(dllimport) Node#endif{public:int data;Node *next;};#endif(Snode.h)#include"Node.h"#ifndef SNODE_H#define SNODE_H#ifdef DLL_FILEclass __declspec(dllexport) Snode#elseclass __declspec(dllimport) Snode #endif{private:Node* head;public:Snode();Node* set();};#endif(snode.cpp)#ifndef DLL_FILE#define DLL_FILE#endif#include"Snode.h"#include<iostream.h> Snode::Snode(){head=new Node;head->next=NULL;}Node* Snode::set(){int e,k;Node *r=head,*s=new Node;cout<<"输入二项式的项数:";cin>>k;for(int i=0;i<k;i++){r->next=s;cout<<i+1<<"项";cin>>e;s->data=e;r=s;s=new Node;}r->next=NULL;return head;}(Matrix.h)#include"Node.h"#include"Snode.h"#include<iostream.h>#ifndef MATRIX_H#define MATRIX_H#ifdef DLL_FILEclass __declspec(dllexport) Matrix#elseclass __declspec(dllimport) Matrix#endif{private:Node *m;int a,b;public:Matrix(int i,int j);void set(Snode aa);Matrix operator+(Matrix &s);Matrix operator-();friend __declspec(dllexport)ostream &operator<<(ostream& out,Matrix& s); };#endif(Matrix.cpp)#ifndef DLL_FILE#define DLL_FILE#endif#include"Matrix.h"Matrix::Matrix(int i,int j){a=i;b=j;m=new Node[a*b];}void Matrix::set(Snode aa){for(int i=0;i<a;i++)for(int j=0;j<b;j++)m[i*b+j]=*aa.set();}Matrix Matrix::operator+(Matrix &s){Matrix num(s.a,s.b);Node *r,*q;for(int i=0;i<a;i++)for(int j=0;j<b;j++){r=&m[i*b+j];q=&s.m[i*b+j];while(r->next&&q->next){r=r->next;q=q->next;int a=r->data;r->data=q->data+r->data;q->data=a+q->data;}if(q->next)num.m[i*b+j]=s.m[i*b+j];elsenum.m[i*b+j]=m[i*b+j];}return num;}Matrix Matrix::operator-(){Matrix n(b,a);for(int i=0;i<a;i++)for(int j=0;j<b;j++)n.m[i*b+j]=m[j*a+i];return n;}__declspec(dllexport)ostream &operator<<(ostream& out,Matrix& s) {for(int i=0;i<s.a;i++){for(int j=0;j<s.b;j++){Node *r;r=&s.m[i*s.b+j];int k=0;while(r->next){r=r->next;out<<r->data<<"*x"<<'^'<<k<<'+';k++;}out<<' ';}out<<endl;}return out;}(调用链接库的函数)#include"I:\logic\DLL\Matrix.h"#include"I:\logic\DLL\Snode.h"#include"I:\logic\DLL\Node.h"#pragma comment(lib,"dll.lib");void main(){Snode aa;Matrix bb(2,2),dd(2,2),cc(2,2);bb.set(aa);dd.set(aa);cc=bb+dd;cout<<cc;}四、调试在动态调用动态链接库时出现找不到.h文件和build时不产生.lib文件,经调试后可以产生动态链接库文件了。
大学数学实验

大学数学实验项目一矩阵运算与方程组求解实验1 行列式与矩阵实验目的掌握矩阵的输入方法. 掌握利用Mathematica (4.0以上版本) 对矩阵进行转置、加、减、数乘、相乘、乘方等运算, 并能求矩阵的逆矩阵和计算方阵的行列式.基本命令在Mathematica 中, 向量和矩阵是以表的形式给出的.1. 表在形式上是用花括号括起来的若干表达式, 表达式之间用逗号隔开. 如输入{2,4,8,16}{x,x+1,y,Sqrt[2]}则输入了两个向量.2. 表的生成函数(1) 最简单的数值表生成函数Range, 其命令格式如下:Range[正整数n]—生成表{1,2,3,4,…,n }; Range[m, n]—生成表{m ,…,n };Range[m, n, dx]—生成表{m ,…,n }, 步长为d x . (2) 通用表的生成函数Table. 例如,输入命令Table[n^3,{n,1,20,2}]则输出 {1,27,125,343,729,1331,2197,3375,4913,6859}输入Table[x*y,{x,3},{y,3}]则输出 {{1,2,3},{2,4,6},{3,6,9}}3. 表作为向量和矩阵一层表在线性代数中表示向量, 二层表表示矩阵. 例如,矩阵⎪⎪⎭⎫ ⎝⎛5432 可以用数表{{2,3},{4,5}}表示.输入A={{2,3},{4,5}}则输出 {{2,3},{4,5}}命令MatrixForm[A]把矩阵A 显示成通常的矩阵形式. 例如, 输入命令:MatrixForm[A] 则输出 ⎪⎪⎭⎫⎝⎛5432 但要注意, 一般地, MatrixForm[A]代表的矩阵A 不能参与运算.输入B={1,3,5,7}输出为{1,3,5,7}输入MatrixForm[B]输出为⎪⎪⎪⎪⎪⎭⎫ ⎝⎛7531 虽然从这个形式看向量的矩阵形式是列向量, 但实质上Mathematica 不区分行向量与列向量. 或者说在运算时按照需要, Mathematica 自动地把向量当作行向量或列向量.下面是一个生成抽象矩阵的例子. 输入Table[a[i,j],{i,4},{j,3}] MatrixForm[%]则输出⎪⎪⎪⎪⎪⎭⎫⎝⎛]3,4[]2,4[]1,4[]3,3[]2,3[]1,3[]3,2[]2,2[]1,2[]3,1[]2,1[]1,1[a a a a a a a a a a a a 注:这个矩阵也可以用命令Array 生成,如输入Array[a,{4,3}]//MatrixForm则输出与上一命令相同.4. 命令IdentityMatrix[n]生成n 阶单位矩阵. 例如,输入IdentityMatrix[5]则输出一个5阶单位矩阵(输出略).5. 命令DiagonalMatrix[…]生成n 阶对角矩阵. 例如,输入DiagonalMatrix[{b[1],b[2],b[3]}]则输出 {{b[1],0,0},{0,b[2],0},{0,0,b[3]}}它是一个以b[1], b[2], b[3]为主对角线元素的3阶对角矩阵.6. 矩阵的线性运算:A+B 表示矩阵A 与B 的加法;k*A 表示数k 与矩阵A 的乘法; A.B 或Dot[A,B]表示矩阵A 与矩阵B 的乘法.7. 求矩阵A 的转置的命令:Transpose[A].8. 求方阵A 的n 次幂的命令:MatrixPower[A,n]. 9. 求方阵A 的逆的命令:Inverse[A]. 10.求向量a 与b 的内积的命令:Dot[a,b].实验举例矩阵A 的转置函数Transpose[A] 例1.1 求矩阵的转置. 输入ma={{1,3,5,1},{7,4,6,1},{2,2,3,4}}; Transpose[ma]//MatrixForm输出为⎪⎪⎪⎪⎪⎭⎫⎝⎛411365243271 如果输入Transpose[{1,2,3}]输出中提示命令有错误. 由此可见, 向量不区分行向量或列向量.矩阵线性运算例1.2 设,291724,624543⎪⎪⎭⎫⎝⎛=⎪⎪⎭⎫⎝⎛=B A 求.24,A B B A -+输入A={{3,4,5},{4,2,6}}; B={{4,2,7},{1,9,2}}; A+B//MatrixForm 4B-2A//MatrixForm输出为⎪⎪⎭⎫ ⎝⎛--⎪⎪⎭⎫ ⎝⎛43241801081151267如果矩阵A 的行数等于矩阵B 的列数, 则可进行求AB 的运算. 系统中乘法运算符为“.”, 即用A.B 求A 与B 的乘积,也可以用命令Dot[A,B]实现. 对方阵A , 可用MatrixPower[A,n]求其n 次幂.例1.3 设,148530291724,36242543⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎭⎫ ⎝⎛=mb ma 求矩阵ma 与mb 的乘积. 输入Clear[ma,mb];ma={{3,4,5,2},{4,2,6,3}};mb={{4,2,7},{1,9,2},{0,3,5},{8,4,1}}; ma.mb//MatrixForm输出为⎪⎪⎭⎫ ⎝⎛655642566532矩阵的乘法运算例1.4 设,101,530291724⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛=B A 求AB 与,A B T 并求.3A输入Clear[A,B];A={{4,2,7},{1,9,2},{0,3,5}}; B={1,0,1}; A.B输出为{11,3,5}这是列向量B 右乘矩阵A 的结果. 如果输入B.A输出为{4,5,12}这是行向量B 左乘矩阵A 的结果,A B T 这里不需要先求B 的转置. 求方阵A 的三次方, 输入MatrixPower[A,3]//MatrixForm输出为⎪⎪⎪⎭⎫ ⎝⎛26047754444932141555660119 例1.5 设,421140123,321111111⎪⎪⎪⎭⎫⎝⎛--=⎪⎪⎪⎭⎫ ⎝⎛--=B A 求A AB 23-及.B A T输入A={{-1,1,1},{1,-1,1},{1,2,3}} MatrixForm[A]B={{3,2,1},{0,4,1},{-1,2,-4}} MatrixForm[B]3A.B -2A//MatrixFormTranspose[A].B//MatrixForm则输出A AB 23-及B A T 的运算结果分别为⎪⎪⎪⎭⎫⎝⎛-----334421424141010 ⎪⎪⎪⎭⎫⎝⎛----10120821444求方阵的逆例1.6 设,5123641033252312⎪⎪⎪⎪⎪⎭⎫⎝⎛=A 求.1-A 输入Clear[ma]ma={{2,1,3,2},{5,2,3,3},{0,1,4,6},{3,2,1,5}}; Inverse[ma]//MatrixForm则输出⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--------1652116114581081218192829211161121162147 注: 如果输入Inverse[ma//MatrixForm]则得不到所要的结果, 即求矩阵的逆时必须输入矩阵的数表形式例1.7 求矩阵⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--027926243043286345248127的逆矩阵.解 A={{7,12,8,24},{5,34,6,-8},{32,4,30,24},{-26,9,27,0}}MatrixForm[A]Inverse[A]//MatrixForm例1.8 设,221331317230,5121435133124403⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎭⎫⎝⎛=B A 求.1B A - 输入Clear[A,B];A={{3,0,4,4},{2,1,3,3},{1,5,3,4},{1,2,1,5}}; B={{0,3,2},{7,1,3},{1,3,3},{1,2,2}}; Inverse[ma].B//MatrixForm输出为⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-----1671635583891898932516916619对于线性方程组,b AX =如果A 是可逆矩阵, X ,b 是列向量, 则其解向量为.1b A -例1.9 解方程组⎪⎩⎪⎨⎧-=-+=+-=++.2442,63,723z y x z y x z y x 输入Clear[A,b];A={{3,2,1},{1,-1,3},{2,4,-4}}; b={7,6,-2}; Inverse[A].b输出为{1,1,2}求方阵的行列式例1.10 求行列式 .3351110243152113------=D 输入Clear[A];A={{3,1,-1,2},{-5,1,3,-4},{2,0,1,-1},{1,-5,3,-3}}; Det[A]输出为40例1.11 求.11111111111122222222ddd d c c c c b b b b a a a a D ++++=输入Clear[A,a,b,c,d];A={{a^2+1/a^2,a,1/a,1},{b^2+1/b^2,b,1/b,1}, {c^2+1/c^2,c,1/c,1},{d^2+1/d^2,d,1/d,1}}; Det[A]//Simplify则输出2222d c b a )abcd 1)(d c )(d b )(d a )(c b )(c a )(b a (+--------例1.12 计算范德蒙行列式.1111145444342413534333231252423222154321x x x x x x x x x x x x x x x x x x x x 输入Clear[x];Van=Table[x[j]^k,{k,0,4},{j,1,5}]//MatrixForm输出为⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛444443333322222]5[]4[]3[]2[]1[]5[]4[]3[]2[]1[]5[]4[]3[]2[]1[]5[]4[]3[]2[]1[11111x x x x x x x x x x x x x x x x x x x x再输入Det[van]则输出结果比较复杂(项很多)若改为输入Det[van]//Simplify或Factor[Det[van]]则有输出(x[1]-x[2])(x[1]-x[3])(x[2]-x[3])(x[1]-x[4]) (x[2]-x[4])(x[3]-x[4])(x[1]-x[5])(x[2]-x[5]) (x[3]-x[5])(x[4]-x[5])例1.13 设矩阵 ,60975738723965110249746273⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----=A 求.),(|,|3A A tr A 输入A={{3,7,2,6,-4},{7,9,4,2,0},{11,5,-6,9,3},{2,7,-8,3,7},{5,7,9,0,-6}}MatrixForm[A] Det[A] Tr[A]MatrixPower[A,3]//MatrixForm则输出3),(|,|A A tr A 分别为11592 3⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛---12574547726668013841222451984174340410063122181713228151626315018483582949442062726向量的内积向量内积的运算仍用“.”表示, 也可以用命令Dot 实现 例1.14 求向量}3,2,1{=u 与}0,1,1{-=v 的内积. 输入u={1,2,3}; v={1,-1,0}; u.v输出为-1或者输入Dot[u,v]所得结果相同.实验习题1.设,150421321,111111111⎪⎪⎪⎭⎫ ⎝⎛--=⎪⎪⎪⎭⎫ ⎝⎛--=B A 求A AB 23-及.B A '2.设,001001⎪⎪⎪⎭⎫ ⎝⎛=λλλA 求.10A 一般地?=k A (k 是正整数).3.求⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛+++++a a a aa 1111111111111111111111111的逆. 4.设,321011324⎪⎪⎪⎭⎫ ⎝⎛-=A 且,2B A AB +=求.B5.利用逆矩阵解线性方程组⎪⎩⎪⎨⎧=++=++=++.353,2522,132321321321x x x x x x x x x实验2 矩阵的秩与向量组的极大无关组实验目的学习利用Mathematica 求矩阵的秩,作矩阵的初等行变换; 求向量组的秩与极大无关组.基本命令1. 求矩阵M 的所有可能的k 阶子式组成的矩阵的命令:Minors[M,k].2. 把矩阵A 化作行最简形的命令:RowReduce[A].3. 把数表1,数表2, …,合并成一个数表的命令:Join[list1,list2,…]. 例如输入Join[{{1,0,-1},{3,2,1}},{{1,5},{4,6}}]则输出 {{1,0,-1},{3,2,1},{1,5},{4,6}}实验举例求矩阵的秩例2.1 设,815073*********⎪⎪⎪⎭⎫ ⎝⎛-------=M 求矩阵M 的秩.输入Clear[M];M={{3,2,-1,-3,-2},{2,-1,3,1,-3},{7,0,5,-1,-8}}; Minors[M,2]则输出{{-7,11,9,-5,5,-1,-8,8,9,11},{-14,22,18,-10,10,-2, -16,16,18,22},{7,-11,-9,5,-5,1,8,-8,-9,-11}}可见矩阵M 有不为0的二阶子式. 再输入Minors[M,3]则输出{{0,0,0,0,0,0,0,0,0,0}}可见矩阵M 的三阶子式都为0. 所以.2)(=M r例2.2 已知矩阵⎪⎪⎪⎭⎫ ⎝⎛----=1t 0713123123M 的秩等于2, 求常数t 的值.左上角的二阶子式不等于0. 三阶子式应该都等于0. 输入Clear[M];M={{3,2,-1,-3},{2,-1,3,1},{7,0,t,-1}}; Minors[M,3]输出为{{35-7t,45-9t,-5+t}}当5=t 时, 所有的三阶子式都等于0. 此时矩阵的秩等于2.例2.3 求矩阵⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-----3224211631095114047116的行最简形及其秩. 输入A={{6,1,1,7},{4,0,4,1},{1,2,-9,0},{-1,3,-16,-1},{2,-4,22,3}} MatrixForm[A]RowReduce[A]//MatrixForm则输出矩阵A 的行最简形⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-0000000100005100101 根据矩阵的行最简形,便得矩阵的秩为3.矩阵的初等行变换命令RowfReduce[A]把矩阵A 化作行最简形. 用初等行变换可以求矩阵的秩与矩阵的逆.例2.4 设,41311221222832A ⎪⎪⎪⎭⎫ ⎝⎛--=求矩阵A 的秩.输入Clear[A];A={{2,-3,8,2},{2,12,-2,12},{1,3,1,4}}; RowReduce[A]//MatrixForm输出为⎪⎪⎪⎪⎭⎫ ⎝⎛-00003232102301 因此A 的秩为2.例2.5 用初等变换法求矩阵⎪⎪⎪⎭⎫⎝⎛343122321的逆矩阵.输入 A={{1,2,3},{2,2,1},{3,4,3}}MatrixForm[A]Transpose[Join[Transpose[A],IdentityMatrix[3]]]//MatrixForm RowReduce[%]//MatrixForm Inverse[A]//MatrixForm则输出矩阵A 的逆矩阵为⎪⎪⎪⎭⎫ ⎝⎛---1112/532/3231向量组的秩矩阵的秩与它的行向量组, 以及列向量组的秩相等, 因此可以用命令RowReduce 求向量组的秩. 例2.6 求向量组)0,3,0,2(),2,5,4,0(),1,1,2,1(231=--=-=ααα的秩. 将向量写作矩阵的行, 输入Clear[A];A={{1,2,-1,1},{0,-4,5,-2},{2,0,3,0}}; RowReduce[A]//MatrixForm则输出⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-000021541002301 这里有两个非零行, 矩阵的秩等于2. 因此, 它的行向量组的秩也等于2.例2.7 向量组)7,5,1,3(),5,4,3,1(),1,1,1,1(),3,2,1,1(4321==-==αααα是否线性相关?输入Clear[A];A={{1,1,2,3},{1,-1,1,1},{1,3,4,5},{3,1,5,7}}; RowReduce[A]//MatrixForm则输出⎪⎪⎪⎪⎪⎭⎫⎝⎛0000010010102001向量组包含四个向量, 而它的秩等于3, 因此, 这个向量组线性相关.例2.8 向量组)3,1,1(),2,1,3(),7,2,2(321=-==ααα是否线性相关?输入Clear[A];A={{2,2,7},{3,-1,2},{1,1,3}}; RowReduce[A]//MatrixForm则输出⎪⎪⎪⎭⎫ ⎝⎛100010001 向量组包含三个向量, 而它的秩等于3, 因此, 这个向量组线性无关.向量组的极大无关组 例2.9 求向量组)0,5,1,2(),0,2,1,1(),14,7,0,3(),2,1,3,0(),4,2,1,1(54321=-===-=ααααα的极大无关组, 并将其它向量用极大无关组线性表示.输入Clear[A,B];A={{1,-1,2,4},{0,3,1,2},{3,0,7,14},{1,-1,2,0},{2,1,5,0}}; B=Transpose[A];RowReduce[B]//MatrixForm则输出⎪⎪⎪⎪⎪⎭⎫⎝⎛-000002/51000101102/10301在行最简形中有三个非零行, 因此向量组的秩等于3. 非零行的首元素位于第一、二、四列,因此421,,ααα是向量组的一个极大无关组. 第三列的前两个元素分别是3,1,于是.3213ααα+=第五列的前三个元素分别是,25,1,21-于是.25214215αααα++-=向量组的等价可以证明:两个向量组等价的充分必要条件是: 以它们为行向量构成的矩阵的行最简形具有相同的非零行, 因此, 还可以用命令RowReduce 证明两个向量组等价.例2.10 设向量),7,3,5,4(),12,5,8,5(),2,1,2,3(),3,1,1,2(2121--=--=--=-=ββαα 求证:向量组21,αα与21,ββ等价.将向量分别写作矩阵A , B 的行向量, 输入Clear[A,B];A={{2,1,-1,3},{3,-2,1,-2}}; B={{-5,8,-5,12},{4,-5,3,-7}}; RowReduce[A]//MatrixForm RowReduce[B]//MatrixForm则输出⎪⎪⎪⎪⎭⎫⎝⎛--7137510747101 与⎪⎪⎪⎪⎭⎫⎝⎛--7137510747101 两个行最简形相同, 因此两个向量组等价.实验习题1.求矩阵⎪⎪⎪⎪⎪⎭⎫⎝⎛----=12412116030242201211A 的秩.2.求t , 使得矩阵⎪⎪⎪⎭⎫ ⎝⎛-=t A 23312231的秩等于2.3.求向量组)0,0,1(),1,1,1(),1,1,0(),1,0,0(4321====αααα的秩.4.当t 取何值时, 向量组),3,1(),3,2,1(),1,1,1(321t ===ααα的秩最小?5.向量组)1,1,1,1(),1,1,1,1(),1,1,1,1(),1,1,1,1(4321-=--=--==αααα是否线性相关?6.求向量组)6,5,4,3(),5,4,3,2(),4,3,2,1(321===ααα的最大线性无关组. 并用极大无关组线性表示其它向量.7.设向量),6,3,3,2(),6,3,0,3(),18,3,3,8(),0,6,3,1(2121=-=-=-=ββαα求证:向量组21,αα 与21,ββ等价.实验3 线性方程组实验目的熟悉求解线性方程组的常用命令,能利用Mathematica 命令各类求线性方程组的解. 理解计算机求解的实用意义.基本命令1.命令NullSpace []A ,给出齐次方程组0=AX 的解空间的一个基.2.命令LinearSolve []b A ,,给出非齐次线性方程组b AX =的一个特解.3.解一般方程或方程组的命令Solve 见Mathematica 入门.实验举例求齐次线性方程组的解空间设A 为n m ⨯矩阵,X 为n 维列向量,则齐次线性方程组0=AX 必定有解. 若矩阵A 的 秩等于n ,则只有零解;若矩阵A 的秩小于n ,则有非零解,且所有解构成一向量空间. 命令 NullSpace 给出齐次线性方程组0=AX 的解空间的一个基.例3.1 求解线性方程组⎪⎪⎩⎪⎪⎨⎧=---=++=+--=--+.0532,0375,023,02432143243214321x x x x x x x x x x x x x x x 输入Clear[A];A={{1,1,-2,-1},{3,-2,-1,2},{0,5,7,3},{2,-3,-5,-1}}; NullSpace[A]则输出{{-2,1,-2,3}}说明该齐次线性方程组的解空间是一维向量空间,且向量(-2,1,-2,3)是解空间的基. 注:如果输出为空集{ },则表明解空间的基是一个空集,该方程组只有零解.例3.2 求解线性方程组⎪⎪⎩⎪⎪⎨⎧=---=++=+--=-++053203750232302432143243214321x x x x x x x x x x x x x x x 输入Clear[A];A={{1,1,2,-1},{3,-2,-3,2},{0,5,7,3},{2,-3,-5,-1}}; Nullspace[A]输出为{ }因此解空间的基是一个空集,说明该线性方程组只有零解.例3.3 向量组)7,5,1,3(),5,4,3,1(),1,1,1,1(),3,2,1,1(4321==-==αααα是否线性相关?根据定义, 如果向量组线性相关, 则齐次线性方程组044332211='+'+'+'ααααx x x x 有非零解.输入Clear[A,B];A={{1,1,2,3},{1,-1,1,1},{1,3,4,5},{3,1,5,7}}; B=Transpose[A]; NullSpace[B]输出为{{-2,-1,0,1}}说明向量组线性相关,且02421=+--ααα非齐次线性方程组的特解例3.4 求线性方程组⎪⎪⎩⎪⎪⎨⎧=----=++=+--=--+45322375222342432143243214321x x x x x x x x x x x x x x x 的特解.输入Clear[A,b];A={{1,1,-2,-1},{3,-2,-1,2},{0,5,7,3},{2,-3,-5,-1}}; b={4,2,-2,4} LinearSolve[A,b]输出为{1,1,-1,0}注: 命令LinearSolve 只给出线性方程组的一个特解.例3.5 求线性方程组⎪⎪⎩⎪⎪⎨⎧=---=++=+--=--+45322375222342432143243214321x x x x x x x x x x x x x x x 的特解.输入Clear[A,b];A={{1,1,2,-1},{3,-2,-1,2},{0,5,7,3},{2,-3,-5,-1}}; b={4,2,2,4}Linearsolve[A,b]输出为Linearsolve::nosol:Linear equation encountered which has no solution.说明该方程组无解.例3.6 向量)4,3,1,2(-=β是否可以由向量)1,3,2,1(1-=α,)11,12,5,5(2-=α,()3,6,3,13-=α 线性表示?根据定义, 如果向量β可以由向量组32,1,ααα线性相关, 则非齐次线性方程组βααα'='+'+'332211x x x 有解.输入Clear[A,B,b];A={{1,2,-3,1},{5,-5,12,11},{0,5,7,3},{1,-3,6,3}}; B=Transpose[A]; b={2,-1,3,4}; Linearsolve[B,b]输出为{31,31,0} 说明β可以由32,1,ααα线性表示,且213131ααβ+=例3.7 求出通过平面上三点(0,7),(1,6)和(2,9)的二次多项式,2c bx ax ++并画出其图形.根据题设条件有 ,924611700⎪⎩⎪⎨⎧=+⋅+⋅=+⋅+⋅=+⋅+⋅c b a c b a c b a 输入Clear[x];A={{0,0,1},{1,1,1},{4,2,1}} y={7,6,9}p=LinearSolve[A,y]Clear[a,b,c,r,s,t];{a,b,c}.{r,s,t}f[x_]=p.{x^2,x,1};Plot[f[x],{x,0,2},GridLines ->Automatic,PlotRange ->All];则输出c b a ,,的值为{2,-3,7}并画出二次多项式7322+-x x 的图形(略).非齐次线性方程组的通解用命令Solve 求非齐次线性方程组的通解.例3.8 求出通过平面上三点(0,0),(1,1),(-1,3)以及满足9)1(,20)1(='=-'f f 的4次多项式).(x f 解 设,)(234e dx cx bx ax x f ++++=则有⎪⎪⎪⎩⎪⎪⎪⎨⎧=+++=+-+-=+-+-=++++=923420234310d c b a d c b a e d c b a e d c b a e 输入Clear[a,b,c,d,e];q[x_]=a*x^4+b*x^3+c*x^2+d*x+e;eqs=[q[0]= =0,q[1]= =1,q[-1]= =3,q ’[-1]= =20,q ’[1]= =9]; {A,y}=LinearEquationsToMatrices[eqs,{a,b,c,d}]; p=LinearSolve[A,y];f[x_]=p.{x^4,x^3,x^2,x,1};Plot[f[x],{x,-1,1},GridLines->Automatic,PlotRange->All];则输出所求多项式,435427431419)(234x x x x x f -++-=非齐次线性方程组的通解用命令solve 求非齐次线性方程组的通解.例3.9解方程组⎪⎪⎩⎪⎪⎨⎧=+-=+-=++-=++-53323221242143143214321x x x x x x x x x x x x x x输入solve[{x-y+2z+w==1,2x-y+z+2w==3,x-z+w==2,3x-y+3w==5},{x,y,z,w}] 输出为{{x →2-w+z,y →1+3z}}即3412x x x +-=,3231x x +=.于是,非齐次线性方程组的特解为(2,1,0,0).对应的齐次线性方程组的基础解系为(1,3,1,0)与(-1,0,0,1).例3.10解方程组⎪⎪⎩⎪⎪⎨⎧-=++-=++-=+-=-+-33713344324324214324321x x x x x x x x x x x x x 解法1 用命令solve输入solve[{x-2y+3z-4w==4, y-z+w==-3,x+3y+w==1,-7y+3z+3w==-3},{x,y,z,w}] 输出为{{x →-8,y →3, z →6, w →0}}即有唯一解81-=x ,32=x ,63=x ,04=x .解法 2 这个线性方程组中方程的个数等于未知数的个数,而且有唯一解 ,此解可以表示为b A x 1-=.其中A 是线性方程组的系数矩阵,而b 是右边常数向量. 于是, 可以用逆阵计算唯一解.输入Clear[A,b,x];A={{1,-2,3,-4},{0,1,-1,1},{1,3,0,1},{0,-7,3,1}}; b={4,-3,1,-3};x=Inverse[A].b 输出为{-8,3,6,0}解法3 还可以用克拉默法计算这个线性方程组的唯一解.为计算各行列式,输入未知数的系数向量,即系数矩阵的列向量.输入Clear[a,b,c,d,e]; a={1,0,1,0}; b={-2,1,3,-7}; c={3,-1,0,3}; d={-4,1,1,1}; e={4,-3,1,-3};Det[{e,b,c,d}]/ Det[{a,b,c,d}] Det[{a,e,c,d}]/ Det[{a,b,c,d}] Det[{a,b,e,d}]/ Det[{a,b,c,d}] Det[{a,b,c,e}]/ Det[{a,b,c,d}] 输出为-8 3 6 0例3.10当a 为何值时,方程组⎪⎩⎪⎨⎧=++=++=++111321321321ax x x x ax x x x ax 无解、有唯一解、有无穷多解?当方程组有解时,求通解.先计算系数行列式,并求a ,使行列式等于0.输入Clear[a];Det[{{a,1,1},{1,a,1},{1,1,a}}];Solve[%==0,a]则输出{{a →-2},{a →1},{a →1}}当a 2-≠,a 1≠时,方程组有唯一解.输入Solve[{a*x +y +z ==1,x +a*y +z ==1,x +y +a*z ==1},{x,y,z}] 则输出{{x →,21a + y →,21a+ z →a +21}}当a =-2时,输入Solve[{-2x+y+z==1,x -2y+z==1,x+y -2z==1},{x,y,z}]则输出{ }说明方程组无解. 当a =1时,输入Solve[{x+y+z==1,x+y+z==1,x+y+z==1},{x,y,z}]则输出{{x →1-y -z}}}说明有无穷多个解.非齐次线性方程组的特解为(1,0,0),对应的齐次线性方程组的基础解 系为为(-1,1,0)与(-1,0,1).例3.11 求非齐次线性方程组 ⎪⎩⎪⎨⎧-=+-+=-+-=+-+2534422312432143214321x x x x x x x x x x x x 的通解.解法1 输入A={{2,1,-1,1},{3,-2,1,-3},{1,4,-3,5}};b={1,4,-2}; particular=LinearSolve[A,b]nullspacebasis=NullSpace[A]generalsolution=t*nullspacebasis[[1]]+k*nullspacebasis[[2]]+Flatten[particular] generalsolution//MatrixForm 解法2 输入B={{2,1,-1,1,1},{3,-2,1,-3,4},{1,4,-3,5,-2}} RowReduce[B]//MatrixForm根据增广矩阵的行最简形, 易知方程组有无穷多解. 其通解为⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-+⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-+⎪⎪⎪⎪⎪⎭⎫ ⎝⎛+⎪⎪⎪⎪⎪⎭⎫ ⎝⎛007/57/6107/97/1017/57/14321t k x x x x (k ,t 为任意常数)实验习题1.解方程组⎪⎩⎪⎨⎧=++=++=+-.024,02,032321321321x x x x x x x x x2.解方程组⎪⎩⎪⎨⎧=++-=++-=++-.0111784,02463,03542432143214321x x x x x x x x x x x x3. 解方程组⎪⎩⎪⎨⎧-=-+-=+-=-+-.22,3,44324314324321x x x x x x x x x x 4.解方程组⎪⎩⎪⎨⎧=++-=+++=-++.254,32,22432143214321x x x x x x x x x x x x5.用三种方法求方程组⎪⎪⎩⎪⎪⎨⎧=-+=-+=-+=-+127875329934,8852321321321321x x x x x x x x x x x x 的唯一解. 6.当b a ,为何值时,方程组⎪⎪⎩⎪⎪⎨⎧-=+++=--+-=++=+++1232)3(122043214324324321ax x x x b x x a x x x x x x x x 有唯一解、无解、有无穷多解?对后 者求通解.实验4 交通流模型(综合实验)实验目的利用线性代数中向量和矩阵的运算, 线性方程组的求解等知识,建立交通流模型. 掌握线性代数在交通规划方面的应用.应用举例假设某城市部分单行街道的交通流量(每小时通过的车辆数)如图4.1所示.300300300200500x x 8x 图4.1试建立数学模型确定该交通网络未知部分的具体流量.假定上述问题满足下列两个基本假设(1)全部流入网络的流量等于全部流出网络的流量; (2)全部流入一个节点的流量等于流出此节点的流量.于是, 根据图4.1及上述基本两个假设, 可建立该问题的线性方程组⎪⎪⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎪⎪⎨⎧=++==+-==+=+=+=+-=+=+-1000600200400100080018002005003008631010998751217654432x x x x x x x x x x x x x x x x x x x x 即⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛---100060020040010008008002005003000010100110000000001100000000010000000000110000000000010001000000001100011000000000011000000000111010987654321x x x x x x x x x x 若将上述矩阵方程记为b Ax =,则问题就转化为求b Ax =的全部解. 下面我们利用Mathmatica 软件来求解 1、输入矩阵A ,并利用RowReduce[A ]命令求得A 的秩为8. 输入RowReduce[A]//MatrixForm Out[2]//MatrixForm=则输出⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-00000000000000000000100000000001000000000011000000001010000000000110000000000100000001001000000100012、应用命令NullSpace[A]求出齐次线性方程组0=Ax 的基础解系. 输入In[3]:=NullSpace[A]//MatrixForm Out[3]//MatrixForm=则输出⎪⎪⎭⎫ ⎝⎛----00000110110011100000 由此即得到所求齐次线性方程组的基础解系:⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛--+⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--=+=00000110110011100000212211C C c c ξξη, (21,C C 为任意常数). 3、输入增广阵(A b ),求出其秩为8, 由,108)()(=<==n Ab r A r 知方程组有无穷多个解. 输入RowReduce[Ab]//MatrixFormOut[5]//MatrixForm=则输出⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-0000000000000000000006001000000000400010000000010000011000000800001010000050000000110002000000000100000000100108000000010001 4、应用命令LinearSolve[A, b],求得非齐次线性方程组b Ax =的一个特解. 输入LinearSolve[A,b]Out[9]={{800},{0},{200},{500},{0},{800},{1000},{0},{400},{600}}则得到所求非齐次线性方程组的一个特解:T )6004000100080005002000800(*=ξ综上所述,我们就得到了非齐次线性方程组b Ax =的全部解为,*2211*ξξξξη++++=C C x (21,C C 为任意常数).在解的表示式中, x 的每一个分量即为交通网络中未知部分的具体流量, 该问题有无穷多解(为什么? 并思考其实际意义).本模型具有实际应用价值, 求出该模型的解, 可以为交通规划设计部门提供解决交通堵塞、车流运行不畅等问题的方法, 知道在何处应建设立交桥, 那条路应设计多宽等, 为城镇交通规划提供科学的指导意见. 但是,在本模型中,我们只考虑了单行街道这样一种简单情形,更复杂的情形留待读者在更高一级的课程中去研究. 此外,本模型还可推广到电路分析中的网络节点流量等问题中.实验报告请读者应用本模型的思想方法, 为你所在或你熟悉的城镇建立一个区域的交通流量模型. 并提供一个具体的解决方案, 即从无穷多个解中根据具体限制确定出一个具体的解决方案.。
矩阵转置实验报告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 0typedef int Status;typedef int ElemType;struct Triple{int i,j;ElemType e;};class TSMatrix{public:TSMatrix(){mu=0;nu=0;tu=0;}; TSMatrix(int,int,int);~TSMatrix(){};void setTSMatrix();Status PrintSMatrix();Status TransposeSMatrix(TSMatrix &T);Status FastTransposeSMatrix(TSMatrix &T);private:Triple data[MAXSIZE+1]; int mu,nu,tu;};TSMatrix::TSMatrix(int a,int b,int c){mu=a;nu=b;tu=c;for(int p=1;p {printf("依次输入稀疏矩阵第%d个非零元的行号,列号,元素:",p);scanf("%d,%d,%d",&data[p].i,&data[p].j,&dat a[p].e);}}void TSMatrix::setTSMatrix(){cout cin>>mu;cout cin>>nu;cout cin>>tu;for(int p=1;p {printf("依次输入稀疏矩阵第%d个非零元的行号,列号,元素:",p);scanf("%d,%d,%d",&data[p].i,&data[p].j,&dat a[p].e);}}Status TSMatrix::PrintSMatrix(){int k=1,t=0;for(int p=1;p {for(int q=1;q {if(p==data[k].i&&q==data[k].j&&k { cout.width(3);cout.setf(ios::left);cout cout.unsetf(ios::left);k++;}else{cout.width(3);cout.setf(ios::left);cout cout.unsetf(ios::left);}}cout }return OK;}Status TSMatrix::TransposeSMatrix(TSMatrix &T){int col,p,q;T.mu=nu;T.nu=mu;T.tu=tu;if(T.tu){q=1;for(col=1;col for(p=1;p if(data[p].j==col){T.data[q].i=data[p].j;T.data[q].j=data[p].i;T.data[q].e=data[p].e;++q;}}return OK;}Status TSMatrix::FastTransposeSMatrix(TSMatrix &T){int col,p,q,t;int *num=new int[10],*cpot=new int[10];num=(int*)malloc(tu*sizeof(int));cpot=(int*)malloc(tu*sizeof(int));T.mu=nu;T.nu=mu;T.tu=tu;if(T.tu){for(col=1;col for(t=1;t cpot[1]=1;for(col=2;col {col=data[p].j;q=cpot[col];T.data[q].i=data[p].j; T.data[q].j=data[p].i; T.data[q].e=data[p].e; ++cpot[col];}}return OK;}“TSMstrixMain.cpp”#include"iostream" using namespace std; #include"TSMatrix.h" int main(){TSMatrix M,T;cout M.setTSMatrix();M.PrintSMatrix();M.TransposeSMatrix(T);cout T.PrintSMatrix();M.FastTransposeSMatrix(T);cout T.PrintSMatrix();return 0;篇二:稀疏矩阵三元组实现矩阵转置算法实验报告实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1. 掌握稀疏矩阵的三元组顺序表存储表示;2. 掌握稀疏矩阵三元组表示的传统转置算法的实现;3. 掌握稀疏矩阵三元组表示的快速转置算法的实现;二.实习内容1. 稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现传统转置算法,输出按通常的阵列形式输出。
矩阵转置实验报告

矩阵转置实验报告篇一:矩阵运算实验报告实验报告--矩阵运算一.实验目的。
1.通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。
2.通过实践进一步领会程序设计的特点和应用,提高运用C++ 语言以及面向对象知识解决实际问题的能力。
3.通过实践掌握用C++ 语言编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;4.学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力。
为后续的相关课程的学习打下基础。
二.实验要求。
1.学会建立模板类;2.实现矩阵的“加”、“减”、“乘”、“数乘”、“转置” ;3.动态内存分配并用随机数填充;4.注意“加”、“减”、“乘” 要进行条件的判断;三.设计思路。
算法基本流程1)2)3)4)5)6) 获取用户输入的矩阵1的行数和列数,动态生成一个一维数组利用随机数生成数组成员,并利用两个循环输出数组,使其符合矩阵的格式矩阵2同矩阵1的处理方法通过两个矩阵的行数和列数比较来判断能否进行加减乘等运算,如不能,输出相关信息如能够进行计算,则利用数组进行相应运算,并按照正确格式输出通过改变一维数组中元素的顺序来实现转置并输出算法流程图四.基本界面。
五.关键代码。
关键类的声明class CMatrixclass{public:CMatrixclass{int m_Row = 0; //行int m_Col = 0; //列m_pElements = NULL; //一维数组};virtual ~CMatrixclass{delete m_pElements;}public:int m_Row;int m_Col;int * m_pElements;};关键函数代码void CMyView::OnCHECKadd {m_;m_;m_;}void CMyView::OnCHECKsubtrict {m_;m_;m_;}void CMyView::OnCHECKcombine {m_;m_;m_;}void CMyView::OnCHECKnums {m_;m_;m_;}void CMyView::OnBUTTONcompute{UpdateData;// TODO: Add your control notification handler code here if==1) {if{m_result=“行数列数不等无法相加!”;}else{matrix c;c=*op1+*op2;m_result=“matrix1+matrix2”;m_result+=“\r\n”;m_result+=_show;}}else if==1){if{m_result=“行数列数不等无法相减!”;}else{matrix c;c=*op1-*op2;m_result=“matrix1-matrix2”;m_result+=“\r\n”;m_result+=_show;}}else if==1){if{m_result=“以上无法相乘!”;}else{matrix c;c=*;m_result=“matrix1*matrix2”;m_result+=“\r\n”;m_result+=_show;}篇二:稀疏矩阵三元组实现矩阵转置算法实验报告实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1. 掌握稀疏矩阵的三元组顺序表存储表示;2. 掌握稀疏矩阵三元组表示的传统转置算法的实现;3. 掌握稀疏矩阵三元组表示的快速转置算法的实现;二.实习内容1. 稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现传统转置算法,输出按通常的阵列形式输出。
矩阵运算基础实验报告

一、实验目的1. 理解矩阵的基本概念和性质。
2. 掌握矩阵的创建、基本运算和常用函数。
3. 熟悉MATLAB软件在矩阵运算中的应用。
二、实验环境1. 操作系统:Windows 102. 软件环境:MATLAB R2020b三、实验内容1. 矩阵的创建与基本运算(1)创建矩阵在MATLAB中,可以使用多种方式创建矩阵,如:- 使用方括号[]直接输入矩阵元素。
- 使用冒号(:)生成向量。
- 使用linspace()、logspace()、zeros()、ones()等函数生成特殊矩阵。
(2)矩阵的基本运算- 矩阵加减法:两个矩阵的对应元素相加或相减。
- 矩阵乘法:包括标量乘法、矩阵乘法和转置运算。
- 矩阵除法:使用除号(/)或乘方运算符()实现。
- 矩阵求逆:使用inv()函数计算矩阵的逆。
2. 矩阵的常用函数(1)矩阵转置:使用T()或'符号实现。
(2)矩阵求行列式:使用det()函数。
(3)矩阵求特征值和特征向量:使用eig()函数。
(4)矩阵求条件数:使用cond()函数。
3. 矩阵的应用实例(1)求解线性方程组给定线性方程组:$$\begin{cases}2x + 3y = 8 \\x - y = 1\end{cases}$$在MATLAB中,可以使用以下代码求解:```A = [2, 3; 1, -1];b = [8; 1];x = A\b;disp(x);```(2)求解矩阵的逆给定矩阵A:```A = [4, 7; 2, 6];A_inv = inv(A);disp(A_inv);```四、实验结果与分析1. 创建矩阵(1)创建一个3x3矩阵:```A = [1, 2, 3; 4, 5, 6; 7, 8, 9];```(2)创建一个向量:```v = [1, 2, 3, 4, 5];```2. 矩阵的基本运算(1)矩阵加减法:```A = [1, 2; 3, 4];B = [5, 6; 7, 8];disp(A + B); % 结果为[6, 8; 10, 12] disp(A - B); % 结果为[-4, -4; -2, -4] ```(2)矩阵乘法:```A = [1, 2; 3, 4];B = [5, 6; 7, 8];disp(A B); % 结果为[19, 22; 43, 50] ```(3)矩阵求逆:```A = [4, 7; 2, 6];disp(inv(A)); % 结果为[-3, 7; 2, -1] ```3. 矩阵的常用函数(1)矩阵转置:```A = [1, 2, 3; 4, 5, 6];disp(A'); % 结果为[1, 4; 2, 5; 3, 6] ```(2)矩阵求行列式:```A = [4, 7; 2, 6];disp(det(A)); % 结果为-12```(3)矩阵求特征值和特征向量:```A = [1, 2; 3, 4];[V, D] = eig(A);disp(V); % 特征向量disp(D); % 特征值```五、实验总结通过本次实验,我们掌握了矩阵的基本概念、创建方法、基本运算和常用函数。
数学系实验报告

实验名称:线性代数矩阵运算实验实验目的:1. 理解矩阵的基本概念和运算规则。
2. 掌握矩阵的加法、减法、乘法等基本运算。
3. 利用矩阵解决实际问题。
实验时间:2023年X月X日实验地点:XX大学数学系实验室实验器材:1. 计算机一台2. 线性代数实验软件(如MATLAB、Mathematica等)实验内容:一、矩阵的加法和减法1. 实验目的:掌握矩阵的加法和减法运算。
2. 实验步骤:(1)打开线性代数实验软件;(2)创建两个矩阵A和B;(3)对矩阵A和B进行加法和减法运算;(4)观察结果并记录。
实验结果:(1)矩阵A:1 2 34 5 67 8 9(2)矩阵B:9 8 76 5 43 2 1(3)矩阵A+B:10 10 1010 10 1010 10 10(4)矩阵A-B:-8 -1 -2-2 -1 -2-4 -6 -8二、矩阵的乘法1. 实验目的:掌握矩阵的乘法运算。
2. 实验步骤:(1)打开线性代数实验软件;(2)创建两个矩阵A和B;(3)对矩阵A和B进行乘法运算;(4)观察结果并记录。
实验结果:(1)矩阵A:1 2 34 5 67 8 9(2)矩阵B:9 8 76 5 43 2 1(3)矩阵AB:30 24 1884 69 54138 114 90三、矩阵的逆1. 实验目的:掌握矩阵的逆运算。
2. 实验步骤:(1)打开线性代数实验软件;(2)创建一个矩阵A;(3)对矩阵A进行逆运算;(4)观察结果并记录。
实验结果:(1)矩阵A:1 2 34 5 67 8 9(2)矩阵A的逆:-2/3 1/3 02/3 -1/3 0-1 0 1/3四、矩阵的应用1. 实验目的:利用矩阵解决实际问题。
2. 实验步骤:(1)打开线性代数实验软件;(2)创建一个实际问题;(3)将实际问题转化为矩阵运算;(4)进行矩阵运算并求解问题;(5)观察结果并记录。
实验结果:(1)实际问题:某工厂生产三种产品,其产量分别为1000、1500、2000件,总成本为120000元。
数学院的实验报告

实验名称:线性代数矩阵运算实验实验日期:2023年4月10日实验地点:数学院计算机实验室一、实验目的1. 理解矩阵的基本概念和性质。
2. 掌握矩阵的运算方法,包括矩阵的加法、减法、乘法、转置等。
3. 熟悉矩阵运算在科学计算中的应用。
二、实验原理矩阵是一种由数字构成的矩形阵列,是线性代数中的一个基本概念。
矩阵运算包括矩阵的加法、减法、乘法、转置等。
矩阵运算在科学计算、工程应用、经济管理等领域有着广泛的应用。
三、实验仪器与材料1. 计算机2. 线性代数教材3. 矩阵运算软件(如MATLAB)四、实验内容与步骤1. 矩阵的创建与显示(1)创建一个3x3的矩阵A:A = [1 2 3; 4 5 6; 7 8 9](2)创建一个2x2的矩阵B:B = [9 8; 7 6](3)显示矩阵A和B:disp(A)disp(B)2. 矩阵的加法与减法(1)计算矩阵A和B的和:C = A + B(2)计算矩阵A和B的差:D = A - B(3)显示矩阵C和D:disp(C)disp(D)3. 矩阵的乘法(1)计算矩阵A和B的乘积:E = A B(2)显示矩阵E:disp(E)4. 矩阵的转置(1)计算矩阵A的转置:F = A'(2)显示矩阵F:disp(F)五、实验结果与分析1. 矩阵A和B的创建及显示成功,矩阵A为:1 2 34 5 67 8 9矩阵B为:9 87 62. 矩阵A和B的加法运算成功,结果C为:10 1012 11矩阵A和B的减法运算成功,结果D为:-8 -23 03. 矩阵A和B的乘法运算成功,结果E为:57 5439 364. 矩阵A的转置运算成功,结果F为:1 4 72 5 83 6 9六、实验结论通过本次实验,我们掌握了矩阵的基本概念和性质,以及矩阵的运算方法。
实验结果表明,矩阵运算在科学计算、工程应用、经济管理等领域有着广泛的应用。
在实际应用中,熟练掌握矩阵运算对于解决实际问题具有重要意义。
矩阵基本运算实验报告

MFC课题报告——矩阵计算器学生姓名:学生学号:02610224指导老师:程洁实验日期:2011年十月一、课题名称矩阵计算器二、问题陈述本系统为了更方便的进行矩阵计算,并通过该系统编写的实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。
通过实践进一步领会程序设计的特点和应用,提高运用C++ 语言以及面向对象知识解决实际问题的能力。
通过实践掌握用C++ 语言编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;学会利用C++程序设计语言编写出一些短小、可靠的Windows 实用程序,切实提高面向对象的程序设计能力。
为后续的相关课程的学习打下基础。
三、设计目标和设计任务要求实现具有加,减,乘及转置的矩阵运算功能设计基于MFC框架的,具有友好界面的Windows应用程序可设置输入矩阵元素是整数或小数可根据设置的行列生成随机矩阵四、解题算法思想与系统设计说明1)创建模板类Matrix用于处理矩阵2)声明六个全局变量分别用于存贮整型和浮点三个编辑框的内容3)设置行列数的读取4)在确定已选择生成数类型以及行列数后进行随机数生成5)完成运算符编辑及结果显示五、基本界面六、关键代码template<typename T>class Matrix{public:Matrix();Matrix(const Matrix &);Matrix(const int,const int);~Matrix();void setMatrix(int,int);Matrix<T> operator =(const Matrix<T> &);Matrix<T> operator +(const Matrix<T> &);Matrix<T> operator -(const Matrix<T> &);Matrix<T> operator *(const Matrix<T> &);// const Matrix operator *(const Matrix &,const Matrix &);Matrix<T> transpose ();void print();CString printCString();private:int col;int row;T **element;};template<typename T>Matrix<T>::Matrix(){row=0;col=0;element=NULL;}template<typename T>Matrix<T>::Matrix(const Matrix &temp) {row=temp.row;col=temp.col;element=new T*[row];for(int k=0;k<row;k++)element[k]=new T[col];for(int i=0;i<row;i++)for(int j=0;j<col;j++)element[i][j]=temp.element[i][j];}template<typename T>void Matrix<T>::setMatrix(int m_row,int m_col){for(int y=0;y<row;y++)delete [] element[y];delete [] element;row=m_row; //throwcol=m_col;element=new T*[row];for(int i=0;i<row;i++)element[i]=new T[col];for(int temprow=0;temprow<row;temprow++)for(int tempcol=0;tempcol<col;tempcol++)if(sizeof(T)==sizeof(double))element[temprow][tempcol]=rand()*1.0/10000;elseelement[temprow][tempcol]=rand()%255+1; }template<typename T>Matrix<T>::Matrix(const int m_row,const int m_col){row=col=0;element=NULL;setMatrix(m_row,m_col);}template<typename T>Matrix<T>::~Matrix(){for(int i=0;i<row;i++)delete [] element[i];delete [] element;}template<typename T>Matrix<T> Matrix<T>::operator =(const Matrix<T> &right){for(int p=0;p<row;p++)delete [] element[p];delete [] element;row=right.row;col=right.col;element=new T*[row];for(int i=0;i<row;i++)element[i]=new T[col];for(int k=0;k<row;k++)for(int j=0;j<col;j++)element[k][j]=right.element[k][j];return *this;}template<typename T>Matrix<T> Matrix<T>::operator +(const Matrix<T>& right) {if(row!=right.row || col!=right.col) //throwthrow string("error");Matrix<T> result(row,col);for(int i=0;i<row;i++)for(int j=0;j<col;j++)result.element[i][j]=element[i][j]+right.element[i][j];return result;}template<typename T>Matrix<T> Matrix<T>::operator -(const Matrix<T>& right) {if(row!=right.row || col!=right.col) //throwthrow string("error");Matrix<T> result(row,col);for(int i=0;i<row;i++)for(int j=0;j<col;j++)result.element[i][j]=element[i][j]-right.element[i][j];return result;}template<typename T>Matrix<T> Matrix<T>::operator *(const Matrix<T>& right){if(col!=right.row)throw string("error");Matrix<T> result(row,right.col);for(int i=0;i<row;i++)for(int j=0;j<right.col;j++){result.element[i][j]=0;for(int p=0;p<col;p++)result.element[i][j]+=element[i][p]*right.element[p][j];};return result;}template<typename T>Matrix<T> Matrix<T>::transpose(){Matrix<T> result(col,row);for(int i=0;i<result.row;i++)for(int j=0;j<result.col;j++)result.element[i][j]=element[j][i];return result;}template<typename T>void Matrix<T>::print(){for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(10)<<element[i][j];cout<<endl;};}template<typename T>CString Matrix<T>::printCString(){CString s,temp;for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(sizeof(T)==sizeof(double))temp.Format("%f",element[i][j]);elsetemp.Format("%d",element[i][j]);s+=temp;s+=" ";};s+="\r\n";};return s;}七、设计小结此程序在完成时有些难度,主要在矩阵的处理上,后来在参考书与网上资料及思考后才稍有明白。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验内容和要求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={<ai,j,ai,j+1>|1≤i≤m, 1≤j≤n-1}Col ={<ai,j,ai+1,j>|1≤i≤m-1, 1≤j≤n}基本操作:CreateTSMatrix(&M)操作结果:创建矩阵MPrintTSMatrix(M)初始条件:矩阵M已存在操作结果:输出矩阵M中三元组形式的非零元素PrintTSMatrix1(M)初始条件:矩阵M已存在操作结果:以阵列形式输出矩阵UnZore(M, row, col)初始条件:矩阵M已存在操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号TSMatrix_Add(M, N,&Q)初始条件:矩阵M,N已存在操作结果:将矩阵M,N相加得到Q并返回矩阵QFastTransposeSMatrix(M,&N)初始条件:矩阵M已存在操作结果:将矩阵M快速转置得到转置矩阵N并返回}ADT TSMatrix;⒊本程序模块结构⑴主函数模块void main(){初始化迷矩阵;创建矩阵并输出;将矩阵转置并输出;将矩阵相加并输出结果;}三、详细设计1、基本数据类型操作⑴typedef int ElemType;typedef struct{int i,j;ElemType e;}Triple;//数据类型三元组typedef struct{Triple data[maxsize+1];//矩阵大小int mu,nu,tu; //}TSMatrix;//矩阵抽象数据类型2、参数设置:#define maxsize 10000//----------基本操作的算法描述--------------------Status CreateTSMatrix(TSMatrix *M){//创建一个随机矩阵(data[0]未用)srand((int)time(NULL));printf("Please Input The Lines And Columns Of The Matrix:\n");printf("...(矩阵的期望规格大于4*5(或5*4))...\n");scanf(M->mu,M->nu);for(m=0;m<M->mu;m++){for(n=0;n<M->nu;n++){k[m][n]=rand()%20;if(k[m][n]==0){if(rand()%2)M->data[p].e=rand()%20+1;elseM->data[p].e=rand()%20-20;M->data[p].i=m+1;M->data[p].j=n+1;p++;}}}M->tu=p-1; //p从1开始,非零元个数刚好等于p-1return OK;}void PrintTSMatrix(TSMatrix M){//输出矩阵的三元组顺序表if(M.tu==0)printf("无非零元!\n");else{printf("该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:\n\n",M.mu,M.nu,M.tu);printf(" 行列元素值\n");for(i=1;i<=M.tu;i++){printf("%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e);}printf("\n");}}void PrintTSMatrix1(TSMatrix M){//输出矩阵的阵列形式printf("阵列形式为:\n");for(i=1;i<=M.mu;i++){for(j=1;j<=M.nu;j++)if (k<M.tu&&p->i==i&&p->j==j){printf("%4d",p->e); //data[0]未用,p从data[1]开始p++;k++;}elseprintf("%4d",0);printf("\n");}printf("\n");}int UnZore(TSMatrix M,int row,int col){while(order<=M.tu){if(M.data[order].i==row&&M.data[order].j==col)//order从1开始return order;order++;}return 0;}Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *Q){//矩阵相加得到新的矩阵,order从1开始if(M.mu==N.mu&&M.nu==N.nu){for(row=1;row<=M.mu;row++){for(col=1;col<=M.nu;col++){order1=UnZore(M,row,col);order2=UnZore(N,row,col);if(order1&&order2){Q->data[order].i=row;Q->data[order].j=col;Q->data[order].e=M.data[order1].e+N.data[order2].e;order++;}else if(order1&&(!order2)){Q->data[order].e=M.data[order1].e;Q->data[order].i=M.data[order1].i;Q->data[order].j=M.data[order1].j;order++;}else if((!order1)&&order2){Q->data[order].e=N.data[order2].e;Q->data[order].i=N.data[order2].i;Q->data[order].j=N.data[order2].j;order++;}}}Q->mu=M.mu;Q->nu=M.nu;Q->tu=order-1;return OK;}else{printf("\n不是同型矩阵不能进行相加!\n");return ERROR;}}Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N){//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵NN->mu=M.nu;N->nu=M.mu;N->tu=M.tu;if(N->tu){for(i=1;i<=M.nu;++i)num[i]=0;for(t=1;t<=M.tu;++t)++num[M.data[t].j];//求M中每一列非零元个数 cpot[1]=1;//求第col列中第一个元素在b.data中的序号for(i=2;i<=M.nu;++i)cpot[i]=cpot[i-1]+num[i-1];for(p=1;p<=M.tu;++p){i=M.data[p].j;q=cpot[i];N->data[q].i=M.data[p].j;N->data[q].j=M.data[p].i;N->data[q].e=M.data[p].e;++cpot[i];}}return OK;}⑶主函数算法:void main(){TSMatrix A,A1,B,C;printf("矩阵A:\n");CreateTSMatrix(&A);PrintTSMatrix(A);PrintTSMatrix1(A);printf("由矩阵A转置得矩阵A1...\n");FastTransposeSMatrix(A,&A1);PrintTSMatrix(A1);PrintTSMatrix1(A1);printf("矩阵B:\n");CreateTSMatrix(&B);PrintTSMatrix(B);PrintTSMatrix1(B);printf("矩阵A加矩阵B得到矩阵C...\n");if(TSMatrix_Add(A,B,&C)){PrintTSMatrix(C);PrintTSMatrix1(C);}}四、调试分析1、三元组顺序表的输出顺序应该是先按行排序再按列排序,即行主序,依次输出。
2、生成的非零元应该有正数和负数,选取在-20到20之间的数(不包括0),生成随机数时同时随机生成其正负号,为正数时将rand()%20再加1,避免再产生0,为负数时将rand()%20-20。
3、由于稀疏矩阵非零元个数极少,故要求矩阵规格在4*5(或5*4)以上为好,实际上生成非零元时其位置具备随机性,其个数也具备随机性,并不严格小于等于矩阵元素个数的5%,因为控制其随机位置的是通过rand()%20,当该随机数值为0时,将该位置做为非零元位置。