矩阵转置及相加实验报告

合集下载

C++矩阵的加法转置

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文件,经调试后可以产生动态链接库文件了。

matlab矩阵实验报告

matlab矩阵实验报告

matlab矩阵实验报告《MATLAB矩阵实验报告》摘要:本实验报告利用MATLAB软件进行了矩阵实验,通过对矩阵的运算、转置、逆矩阵、特征值等操作进行了分析和讨论。

实验结果表明,MATLAB在矩阵运算方面具有高效、准确的特点,能够满足工程和科学计算的需求。

引言:矩阵是线性代数中的重要概念,广泛应用于工程、物理、经济等领域。

MATLAB是一种强大的数学软件,能够对矩阵进行各种运算和分析。

本实验旨在利用MATLAB软件对矩阵进行实验,探讨其在矩阵运算中的应用和优势。

实验方法:1. 创建矩阵:利用MATLAB软件创建不同大小的矩阵,包括方阵和非方阵。

2. 矩阵运算:进行矩阵的加法、减法、乘法等运算,比较不同大小矩阵的计算效率和结果准确性。

3. 矩阵转置:对矩阵进行转置操作,观察转置后矩阵的性质和应用。

4. 逆矩阵:求解矩阵的逆矩阵,并分析逆矩阵在实际问题中的应用。

5. 特征值和特征向量:利用MATLAB软件求解矩阵的特征值和特征向量,分析其在物理、工程等领域的应用。

实验结果与讨论:通过实验发现,MATLAB软件在矩阵运算中具有高效、准确的特点。

对于大规模矩阵的运算,MATLAB能够快速进行计算并给出准确的结果。

在矩阵转置和逆矩阵求解方面,MATLAB也能够满足工程和科学计算的需求。

此外,通过求解矩阵的特征值和特征向量,可以得到矩阵的重要性质,为实际问题的分析和求解提供了有力支持。

结论:本实验利用MATLAB软件进行了矩阵实验,通过对矩阵的运算、转置、逆矩阵、特征值等操作进行了分析和讨论。

实验结果表明,MATLAB在矩阵运算方面具有高效、准确的特点,能够满足工程和科学计算的需求。

希望本实验能够对矩阵运算和MATLAB软件的应用有所启发,为相关领域的研究和应用提供参考。

用MATLAB解决线性代数问题实验报告

用MATLAB解决线性代数问题实验报告

实验三使用MATLAB解决线性代数问题学院:数计学院班级:1003班姓名:黄晓丹学号:1051020144实验目的:学习MATLAB有关线性代数运算的指令,主要学习运用MATLAB解决矩阵除法,线性方程组的通解,矩阵相似对角化问题,以及解决投入产出分析等应用问题。

实验内容:矩阵转置:A=[1 2;3 4];B=[4 3;2 1];>> A',B'ans =1 32 4ans =4 33 1矩阵加减:A-Bans=-3 -11 3矩阵乘法:A*B,A.*B(数组乘法)||比较矩阵乘法与数组乘法的区别ans=8 520 13ans=4 66 4矩阵除法:A\B,B./Aans=-6 -55 4ans=4 1.50.6667 0.25特殊矩阵生成:zeros(m,n)||生成m行n列的矩阵ones(m,n)||生成m行n列的元素全为一的矩阵eye(n)||生成n阶单位矩阵rand(m,n)||生成m行n列[0 ,1]上均匀分布随机数矩阵zeros(2,3)ans =0 0 00 0 0>> ones(3,3)ans =1 1 11 1 11 1 1>> eye(3)ans =1 0 00 1 00 0 1>> rand(2,4)ans =Columns 1 through 30.9501 0.6068 0.89130.2311 0.4860 0.7621Column 40.45650.0185矩阵处理:trace(A)||返回矩阵的迹diag(A)||返回矩阵对角线元素构成的向量tril(A)||提取矩阵的下三角部分triu(A)||提取矩阵的上三角部分flipud(A)||矩阵上下翻转fliplr(A)||矩阵左右翻转reshape(A,m,n)||将矩阵的元素重排成m行n列矩阵A=[1 2 3;4 5 6;7 8 9];>> t=trace(A),d=diag(A),u=triu(A)t =15d =159u =1 2 30 5 60 0 9 flipud(A),fliplr(A)ans =7 8 94 5 61 2 3 ans =3 2 16 5 49 8 7矩阵特征值与标准型:[V,D]=eig(A)||返回矩阵特征值与特征向量[V J]=Jordan(A)||返回矩阵的相似变换矩阵和若尔当标准型A=[1 2;3 4];>> [V,D]=eig(A)V =-0.8246 -0.41600.5658 -0.9094D =-0.3723 00 5.3723>> [V,J]=jordan(A)V =0.2389 0.76110.5222 -0.5222J =5.3723 00 -0.3723线性方程组求解A=[1 2 1;3 -2 1];B=[1;4];x=A\B x =1.2500 ||求一特解-0.1250>> A=[1 2;3 -2;1 -1];B=[1;4;2];x=A\Bx = ||求得一最小二乘近似解1.2838-0.1757:方阵的相似对角化及应用:A=[1 1/4 0;0 1/2 0;0 1/4 1];[P,T]=eig(A) P =1.0000 0 -0.40820 0 0.81650 1.0000 -0.4082T =1.0000 0 00 1.0000 00 0 0.5000求得三个特征值1,1,0.5,对应特征向量(1,0,0),(0,0,1),(-0.4028,0.8165,-0.4082),由于三个特征向量线性无关,从而A 可相似对角化,即p-1AP=T.那么A∧n=p[1 0 0;0 1 0;0 0 0]p-1,计算的P*diag([1,1,0])*inv(P)ans =1.0000 0.50000 00 0 00 0.5000 1.0000所以得到近似解。

矩阵转置实验报告doc

矩阵转置实验报告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、稀疏矩阵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、三元组顺序表的输出顺序应该是先按行排序再按列排序,即行主序,依次输出。

实验十一矩阵的基本运算解读

实验十一矩阵的基本运算解读

实验十一 矩阵的基本运算【实验目的】1. 了解矩阵的转置、加、减、乘、逆等基本运算。

2. 学习掌握MATLAB 软件有关的命令。

【实验准备】矩阵基本元算的有关Matlab 命令矩阵的加减法用”+” 和”-”运算符,矩阵相乘用”*”运算符,矩阵转置用’运算符,矩阵的逆用inv 命令.【实验方法与步骤】练习1 输入矩阵⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=16151413121110987654321A 相应的MA TLAB 代码为:>>a=[1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16]结果为a =1 2 3 45 6 7 89 10 11 1213 14 15 16练习2(矩阵的初等运算)已知矩阵⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=101012111,321212113B A , 求(1)屏幕输出A 与B ;(2)A 的转置'A ;(3)B A +; (4)B A -;(5)A 6;(6)AB ; (7)A 的逆1-A . 相应的MA TLAB 代码及计算结果如下:A=[3 1 1;2 1 2;1 2 3]A =3 1 12 1 21 2 3B=[1 1 -1;2 -1 0;1 0 1]B =1 1 -12 -1 01 0 1A' %A 的转置'Aans =3 2 11 1 21 2 3A+Bans =4 2 04 0 22 2 4A-Bans =2 0 20 2 20 2 26*A %A 6ans =18 6 612 6 126 12 18A*Bans =6 2 -26 1 08 -1 2C=inv(A) %1-=A CC =0.2500 0.2500 -0.25001.0000 -2.0000 1.0000-0.7500 1.2500 -0.2500D=A.*B %D 中元素为A 与B 中对应的元素相乘,ij ij ij B A D =.D =3 1 -14 -1 01 0 3练习3生成33⨯单位矩阵,零矩阵,元素全为1的矩阵.相应的MA TLAB 代码及结果为:eye(3,3)ans =1 0 00 1 00 0 1A=zeros(3)A =0 0 00 0 00 0 0B=ones(3,4)B =1 1 1 11 1 1 11 1 1 1【练习与思考】已知矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡--=1098765987654876543765432654321,129418987263215741206356192143B A ,求(1)A 的转置'A ;(2)B A +;(3)B A -;(4)B A *;(5)A 的逆1-A .。

有关矩阵数学实验报告

有关矩阵数学实验报告

有关矩阵数学实验报告引言矩阵是数学中一个重要的概念,广泛应用于线性代数、图论、计算机科学等众多领域。

本实验旨在通过实际操作和计算,加深对矩阵的理解,并探索矩阵在现实问题中的应用。

本报告将从实验目的、实验步骤、实验结果和实验结论几个方面进行介绍。

实验目的1. 了解矩阵的基本概念和运算规则;2. 掌握矩阵的求逆、转置和乘法等操作;3. 实践利用矩阵解决实际问题。

实验步骤1. 实验准备:安装并学习使用相应的矩阵数学软件;2. 实验1:矩阵加法和乘法- 创建两个相同维度的矩阵A和B;- 计算A + B和A * B;- 分析结果并进行讨论。

3. 实验2:矩阵求逆和转置- 创建一个可逆矩阵C;- 计算C的逆矩阵C'和C的转置矩阵C^T;- 检验计算结果是否正确。

4. 实验3:矩阵在实际问题中的应用- 选择一个实际问题,并将其抽象成矩阵形式;- 利用矩阵运算解决问题;- 分析结果,并与传统解法进行对比。

实验结果1. 实验1结果分析:经过计算发现,矩阵的加法和乘法满足交换律和结合律,与数的加法和乘法类似。

但是,矩阵乘法不满足交换律,即A * B ≠B * A。

这进一步说明矩阵并不是普通数的简单扩展。

2. 实验2结果检验:针对可逆矩阵C,计算得到的逆矩阵C'和转置矩阵C^T经过验证均正确,满足逆矩阵和转置矩阵的定义和性质。

3. 实验3结果分析:我们选择了一个线性方程组问题,利用矩阵运算求解。

与传统解法相比,矩阵运算更简洁、高效,尤其对于高维度复杂问题具有很大优势。

实验结论通过本次实验,我们对矩阵的概念和运算规则有了更深入的理解。

矩阵不仅仅是一种数学工具,它在现实问题的建模和求解中发挥着重要作用。

矩阵的加法、乘法、逆矩阵和转置等运算规则的学习,为我们处理实际问题提供了更多的方法和思路。

在未来的学习和研究中,矩阵将会贯穿于我们的整个数学和科学计算的领域,为我们带来更大的便利和创造力。

数学实验报告线性代数

数学实验报告线性代数

数学实验报告(线性代数) 数学实验报告(线性代数)一、实验目的本次实验旨在通过对线性代数基本概念的探究,熟悉并掌握矩阵运算、向量空间、特征值与特征向量等核心概念,培养我们的数学思维与解决实际问题的能力。

二、实验内容1.矩阵运算我们首先通过Excel或其他数学软件,进行矩阵的加减法、乘法、转置等基本运算,并计算矩阵的行列式、逆矩阵等。

通过这些运算,我们深入理解矩阵这一基本概念以及其在线性代数中的重要性。

2.向量空间我们对向量空间进行深入的研究,包括向量的加减法、数乘等基本运算,以及向量空间的各种性质,如封闭性、结合律、分配律等。

通过具体的计算和证明,我们对向量空间有了更深入的理解。

3.特征值与特征向量在本次实验中,我们通过计算矩阵的特征多项式,找到矩阵的特征值,并求出相应的特征向量。

我们通过这种方法,理解了特征值和特征向量的物理意义,也掌握了求解特征值和特征向量的基本方法。

三、实验过程记录实验开始时间:XXXX年XX月XX日实验地点:数学实验室参与人员:小组成员1、小组成员2、小组成员3实验具体过程:1.矩阵运算:我们利用Excel软件进行矩阵的加减法、乘法等基本运算,通过具体的计算,我们发现矩阵的乘法并不满足交换律,而且矩阵的乘积的行列式并不等于原来两个矩阵行列式的乘积。

这让我们更深入的理解了矩阵乘法的规则和其意义。

2.向量空间:我们首先对向量的加减法、数乘等基本运算进行计算,以深入理解向量空间的基本性质。

接着我们对向量空间的封闭性、结合律、分配律等进行了证明。

通过这一系列的操作,我们明白了向量空间是一个具有丰富性质的数学结构。

3.特征值与特征向量:首先我们计算了矩阵的特征多项式,然后用求根公式求出了特征值。

接着我们根据定义求出了相应的特征向量。

在这个过程中,我们明白了特征值和特征向量的物理意义,也掌握了求解特征值和特征向量的基本方法。

实验结束时间:XXXX年XX月XX日四、实验总结及感想通过这次实验,我们更深入地理解了线性代数的基本概念和性质。

矩阵论的实验报告

矩阵论的实验报告

一、实验目的1. 理解矩阵的基本概念和性质。

2. 掌握矩阵的运算方法,包括加法、减法、乘法、转置等。

3. 学习矩阵的行列式、逆矩阵、秩和迹的计算方法。

4. 熟悉矩阵的分解方法,如三角分解、Cholesky分解等。

5. 通过实验加深对矩阵论理论的理解和应用。

二、实验原理矩阵论是线性代数的一个重要分支,主要研究矩阵及其运算。

矩阵在自然科学、工程技术、经济学等领域都有广泛的应用。

本实验主要涉及以下内容:1. 矩阵的基本运算:矩阵的加法、减法、乘法、转置等。

2. 矩阵的行列式、逆矩阵、秩和迹的计算方法。

3. 矩阵的分解方法,如三角分解、Cholesky分解等。

三、实验仪器与软件1. 仪器:计算机2. 软件:MATLAB四、实验内容1. 矩阵的基本运算(1)编写MATLAB程序,计算矩阵A和B的加法、减法、乘法、转置。

(2)验证矩阵运算的性质,如结合律、分配律等。

2. 矩阵的行列式、逆矩阵、秩和迹的计算(1)编写MATLAB程序,计算矩阵A的行列式、逆矩阵、秩和迹。

(2)验证计算结果与理论值的一致性。

3. 矩阵的分解方法(1)编写MATLAB程序,对矩阵A进行三角分解(LU分解)。

(2)编写MATLAB程序,对矩阵A进行Cholesky分解。

(3)验证分解结果与理论值的一致性。

4. 应用实例(1)使用矩阵运算解决实际问题,如线性方程组的求解。

(2)使用矩阵分解方法解决实际问题,如求解最小二乘问题。

五、实验步骤1. 编写MATLAB程序,实现矩阵的基本运算。

2. 编写MATLAB程序,计算矩阵的行列式、逆矩阵、秩和迹。

3. 编写MATLAB程序,对矩阵进行三角分解和Cholesky分解。

4. 对实验结果进行分析,验证理论值与实验结果的一致性。

5. 使用矩阵运算和分解方法解决实际问题。

六、实验结果与分析1. 矩阵的基本运算实验结果与分析通过编写MATLAB程序,实现了矩阵的加法、减法、乘法、转置等基本运算。

实验结果与理论值一致,验证了矩阵运算的性质。

数据结构-矩阵转置1

数据结构-矩阵转置1

实验报告课程名称:数据结构院(系):管理学院专业班级:信息管理与信息系统*名:***学号:*********指导教师:***2012 年4 月19 日《矩阵转置1-普通转置》实验报告课程名称:数据结构实验项目名称:矩阵转置1-普通转置实验类型:学生姓名:王舜禹专业:信管班级:1001同组学生姓名:指导教师:顾清华实验地点:管理学院实践中心实验日期:2012年4月28日一、实验目的练习矩阵的转置,这是一种简单的矩阵运算,我们利用一种压缩存储方式,三元组顺序表。

加深对于数组的理解,掌握矩阵存储方式的理解。

二、实验内容和原理M是m*n的矩阵,转化为T,是n*m的矩阵。

T,M是TSMatrix型的变量。

1.将矩阵的行列值相互交换;2.将每个三元组中的i和j相互调换;3.重新排列三元组之间的次序就可实现矩阵转置。

三、软、硬件环境硬件:Pentium(R)************************1.99GB软件:windows XPC++程序设计与试验系统四、实验步骤#include "stdafx.h"#include<stdio.h>#include <stdlib.h>#define MAXSIZE 50typedef struct{int i,j;int e;}T riple;typedef struct{int mu,nu,tu;}TSMatrix;TSMatrix CreateSMaxtrix(int a[5][3],int m,int n,int k){TSMatrix M;M.mu=m;M.nu=n;M.tu=k;if(k!=0)for(int i=0;i<k;i++){M.data[i].i=a[i][0];M.data[i].j=a[i][1];M.data[i].e=a[i][2];}return M;}void main(){TSMatrix T,M;int col,p,q,d,e,i,c,f;int b[5][4];int s[4][5];int m=5,n=4,k=5;int a[5][3]={{0,1,4},{1,2,12},{2,3,9},{3,1,3},{4,2,24}};//初始化矩阵for(c=0;c<5;c++)for(f=0;f<4;f++){b[c][f]=0;} //将b[][]中元素初始化为0for(i=0;i<5;i++){c=a[i][0];f=a[i][1];b[c][f]=a[i][2]; //将a[][]三元组转为数组形式,就是按每行每列排。

矩阵基本运算的数学实验及思考

矩阵基本运算的数学实验及思考

矩阵基本运算的数学实验及思考## 矩阵基本运算的数学实验及思考### 引言矩阵是线性代数中的重要工具,广泛应用于各个科学领域。

本文旨在通过数学实验深入探讨矩阵的基本运算,包括加法、减法、乘法等,以及通过实验得出的结论和对矩阵运算的思考。

### 实验一:矩阵加法首先,我们考察矩阵加法的性质。

通过设计实验,我们可以验证矩阵加法的交换律和结合律。

选择不同的矩阵进行加法运算,并观察结果,验证加法的基本性质。

### 实验二:矩阵减法类似于加法,矩阵减法也是线性代数中的基本运算之一。

在这个实验中,我们将研究矩阵减法的性质,包括减法的反交换性和减法与加法的关系。

通过多组实验数据,我们将深入理解矩阵减法的特性。

### 实验三:矩阵乘法矩阵乘法是矩阵运算中的关键部分,对于线性变换和解方程组等问题具有重要意义。

通过实验,我们将验证矩阵乘法的结合律、分配律,并讨论乘法与加法的关联。

此外,我们还将研究单位矩阵的性质以及其在矩阵乘法中的作用。

### 实验四:矩阵转置与逆矩阵转置和逆矩阵是矩阵运算中的两个重要概念。

在这个实验中,我们将通过数学手段验证矩阵转置的性质,如转置的转置等,并研究逆矩阵存在的条件以及逆矩阵在方程求解中的应用。

### 实验五:矩阵的秩和行列式秩和行列式是矩阵理论中的重要概念,与矩阵的线性无关性和行列式的性质有密切关系。

通过实验,我们将研究秩的计算方法,行列式的展开与性质,以及它们在解决线性方程组和判断矩阵可逆性中的应用。

### 思考与结论通过以上一系列的实验,我们不仅加深了对矩阵基本运算的理解,还对矩阵在线性代数中的重要性有了更深刻的认识。

矩阵的性质和运算规律贯穿于多个学科领域,从物理学到计算机科学,都离不开对矩阵的运用。

在未来的学习中,我们可以进一步拓展矩阵的应用,探讨更高级的线性代数概念,以及矩阵在机器学习和数据科学中的广泛运用。

通过深入思考矩阵的数学本质,我们能够更好地应用这一工具,为解决实际问题提供更为丰富的思路和方法。

矩阵运算实验报告

矩阵运算实验报告

矩阵运算实验报告实验目的:通过矩阵运算实验,探究矩阵的基本运算规则、性质及应用,并加深对矩阵运算的理解。

实验原理:矩阵是一个由元素按照行和列排列成的矩形阵列,可以进行加法、减法、乘法等基本的运算。

矩阵的加法与减法满足交换律、结合律和分配律;矩阵的乘法满足结合律、分配律和左乘右乘不一定相等的性质。

实验步骤:1. 实验前的准备:准备两个矩阵A和B,并确定其维度。

2. 进行矩阵加法运算:将矩阵A与矩阵B的对应元素相加,得到新的矩阵C。

3. 进行矩阵减法运算:将矩阵A与矩阵B的对应元素相减,得到新的矩阵D。

4. 进行矩阵乘法运算:将矩阵A的行元素与矩阵B的列元素对应相乘,并将结果相加,得到新的矩阵E。

5. 对矩阵进行转置:将矩阵A的行与列互换,得到新的矩阵F。

6. 求矩阵的逆:若矩阵A可逆,则找到矩阵A的逆矩阵G。

实验结果:1. 矩阵加法运算的结果:得到新的矩阵C,其维度与矩阵A和B相同,且C(i,j) = A(i,j) + B(i,j)。

2. 矩阵减法运算的结果:得到新的矩阵D,其维度与矩阵A和B相同,且D(i,j) = A(i,j) - B(i,j)。

3. 矩阵乘法运算的结果:得到新的矩阵E,其维度为A的行数乘以B的列数,且E(i,j) = Σ(A(i,k)*B(k,j)),k的取值范围为1到B的行数(或A的列数)。

4. 矩阵转置的结果:得到新的矩阵F,其维度与矩阵A相反,即F的行数等于A的列数,F的列数等于A的行数,且F(i,j) = A(j,i)。

5. 矩阵逆矩阵的结果:得到新的矩阵G,其与矩阵A的乘积为单位矩阵,即A*G = G*A = I,其中I为单位矩阵。

实验分析:1. 从矩阵加法与减法运算的结果可以看出,矩阵的加法和减法满足交换律、结合律和分配律。

这说明矩阵加法和减法具有良好的运算性质。

2. 从矩阵乘法运算的结果可以看出,矩阵的乘法满足结合律和分配律,但左乘右乘不一定相等,即AB≠BA。

实验4矩阵转置

实验4矩阵转置

稀疏矩阵赵俊1041901229 问题描述:由于矩阵在程序中常使用二维阵列表示,二维阵列的大小稀疏矩阵与使用的存储器空间成正比,如果多数的元素没有数据,则会造成存储器空间的浪费,为此,必须设计稀疏矩阵的阵列储存方式,利用较少的存储器空间储存完整的矩阵数据。

二维数组Amn中有N个非零元素,若N<<m*n,则称A为稀疏矩阵。

由于稀疏矩阵中含有很多的0元素,在计算机中存储会浪费很多的空间,因此我们通常采用压缩存储的方法。

实验目的:掌握矩阵算法实验代码:class Matrix{private:int **m_ppHead;int m_xSize;int m_ySize;public:Matrix();Matrix(int xSize,int ySize);~Matrix();//重?新?开a辟括?内ú存?空?间?Matrix(Matrix &a);//维?护¤void Input(int x,int y,int Item);int GetData(int x,int y);int GetxSize();int GetySize();void SetxSize(int x);void SetySize(int y);void Set(int xSize, int ySize );void Print();//使?用?Suqare必?须?保馈?证¤是?奇?数簓正y方?矩?阵óvoid Square();};class SparseMatrix{private:ENode *m_Data;int m_Crow;//总哩?的?行D数簓int m_Ccol;//总哩?的?列 数簓int m_Czero;//总哩?的?零?的?个?数簓public:SparseMatrix();~SparseMatrix();SparseMatrix( Matrix &a);//主÷要癮操ù作痢?bool TranForm();bool ToNormal(Matrix &a);//数簓据Y维?护¤int GetCcol() const;int GetCzero() const;int GetCrow() const;ENode * GetData() const;void Print();};#pragma once#include"Matrix.h"#include<iostream>Matrix::Matrix(){m_ppHead=NULL;}Matrix::Matrix(int xSize,int ySize){m_ppHead=new int *[xSize];m_xSize=xSize;for(int i=0;i<xSize;i++){m_ppHead[i]=new int[ySize];}m_ySize=ySize;}Matrix::~Matrix(){if(m_ppHead){for(int i=0;i<m_xSize;i++){delete []m_ppHead[i];}}}Matrix::Matrix(Matrix &a){m_ppHead=new int *[a.m_xSize];m_xSize=a.m_xSize;for(int i=0;i<a.m_xSize;i++){m_ppHead[i]=new int[a.m_ySize];}m_ySize=a.m_ySize;for(int i=0;i<a.m_xSize;i++){for(int j=0;j<a.m_ySize;j++){this->Input(i,j,a.GetData(i,j));}}}void Matrix::Input(int x,int y,int Item){m_ppHead[x][y]=Item;}int Matrix::GetData(int x,int y){return m_ppHead[x][y];}int Matrix:: GetxSize(){return m_xSize;}int Matrix::GetySize(){return m_ySize;}void Matrix::SetxSize(int x){m_xSize=x;}void Matrix::SetySize(int y){m_ySize=y;}void Matrix::Set(int xSize, int ySize ) {m_ppHead=new int *[xSize];m_xSize=xSize;for(int i=0;i<xSize;i++){m_ppHead[i]=new int[ySize];}m_ySize=ySize;}void Matrix::Print(){for(int y=0;y<m_xSize;y++){for(int x=0;x<m_ySize;x++){std::cout<<m_ppHead[x][y]<<" ";}std::cout<<std::endl;}}void Matrix::Square(){int i=0;int n=m_xSize;int j=n/2;m_ppHead[j][0]=1;for(int k=2;k<=m_xSize*m_ySize;k++){int itemp,jtemp;itemp=i;jtemp=j;i=(i-1+n)%n;j=(j-1+n)%n;if(m_ppHead[j][i]>0){i=(itemp+1)%n;j=jtemp;}m_ppHead[j][i]=k;}}#pragma once#include"SparseMatrix.h"#include<iostream>#include<memory>SparseMatrix::SparseMatrix(){m_Data=NULL;m_Crow=0;//总哩?的?行D数簓m_Ccol=0;//总哩?的?列 数簓m_Czero=0;//总哩?的?零?的?个?数簓}SparseMatrix::~SparseMatrix(){if(m_Data)delete []m_Data;m_Crow=0;//总哩?的?行D数簓m_Ccol=0;//总哩?的?列 数簓m_Czero=0;//总哩?的?零?的?个?数簓}//转羇换?SparseMatrix::SparseMatrix( Matrix &a){m_Czero=0;m_Crow=a.GetxSize();m_Ccol=a.GetySize();int Size=m_Crow*m_Ccol;int Count=0;for(int i=0;i<m_Crow;i++){for(int j=0;j<m_Ccol;j++){if(0==a.GetData(i,j))++m_Czero;}}m_Data=new ENode[Size-m_Czero];for(int i=0;i<m_Crow;i++){for(int j=0;j<m_Ccol;j++){if(a.GetData(i,j)!=0){m_Data[Count].Col=j;m_Data[Count].Row=i;m_Data[Count].Item=a.GetData(i,j);Count++;}}}}//主÷要癮操ù作痢?bool SparseMatrix::TranForm(){SparseMatrix a;a.m_Ccol=m_Ccol;a.m_Crow=m_Crow;a.m_Czero=m_Czero;int Size=m_Ccol*m_Crow-m_Czero;a.m_Data=new ENode[Size];int *Num=new int[m_Ccol];int *ID=new int[m_Ccol+1];ID[0]=0;for(int i=0;i<m_Ccol;i++){Num[i]=0;}for(int i=0;i<Size;i++){++Num[m_Data[i].Col];}for(int i=0;i<m_Ccol;i++){ID[i+1]=ID[i]+Num[i];}for(int i=0;i<Size;i++){a.m_Data[ID[m_Data[i].Col]].Row=m_Data[i].Col;a.m_Data[ID[m_Data[i].Col]].Col=m_Data[i].Row;a.m_Data[ID[m_Data[i].Col]].Item=m_Data[i].Item;++ID[m_Data[i].Col];}// a.Print();//一?下?拷?贝馈鋋for(int i=0;i<Size;i++){m_Data[i].Col=a.m_Data[i].Col;m_Data[i].Item=a.m_Data[i].Item;m_Data[i].Row=a.m_Data[i].Row;}return true;}bool SparseMatrix::ToNormal(Matrix &a)int Count=0;a.Set(m_Crow,m_Ccol);for(int i=0;i<m_Crow;i++){for(int j=0;j<m_Ccol;j++){if(m_Data[Count].Row==i &&m_Data[Count].Col==j){a.Input(i,j,m_Data[Count].Item);++Count;}else{a.Input(i,j,0);}}}return true;}//数簓据Y维?护¤int SparseMatrix::GetCrow() const{return m_Crow;}int SparseMatrix::GetCcol() const{return m_Ccol;}int SparseMatrix::GetCzero() const{return m_Czero;}ENode * SparseMatrix::GetData() const{return m_Data;}void SparseMatrix::Print(){int Size=m_Ccol*m_Crow-m_Czero;for(int i=0;i<Size;i++){std::cout<< m_Data[i].Row<<" "<<m_Data[i].Col<<" "<<m_Data[i].Item<<std::endl;}std::cout<<m_Crow<<std::endl;std::cout<<m_Ccol<<std::endl;std::cout<<m_Czero<<std::endl;}#include"ds.h"#include<iostream>#include<cstring>#include"head.h"int main(int argc ,char* argv[]){cout<<"原-矩?阵ó"<<endl;Matrix map(3,3);for(int i=0;i<3;i++){for(int j=0;j<3;j++){map.Input(i,j,i*j);}}map.Input(1,1,9);map.Input(1,2,6);map.Input(2,1,5);map.Print();SparseMatrix map1(map);cout<<"转羇成é稀?疏酣?矩?阵ó"<<endl;map1.Print();cout<<"实害?现?转羇置?"<<endl;map1.TranForm();map1.Print();cout<<"将?转羇置?后ó的?稀?疏酣?矩?阵ó回?复′为a矩?阵ó"<<endl;map1.ToNormal(map);map.Print();system("pause");return 0;}实现结果:实验心得:通过学习掌握了稀疏矩阵的算法,为节约内存提供了一点方法。

矩阵转置实验报告

矩阵转置实验报告

一、实验目的1. 理解矩阵转置的概念和原理。

2. 掌握稀疏矩阵的三元组表示方法。

3. 实现稀疏矩阵的转置算法,并对比传统转置算法和快速转置算法的性能。

4. 提高对数据结构中稀疏矩阵处理方法的理解和应用能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 稀疏矩阵存储结构:三元组三、实验原理矩阵转置是指将矩阵的行和列互换位置,得到的新矩阵称为原矩阵的转置矩阵。

对于稀疏矩阵,由于其非零元素较少,使用三元组表示方法可以有效地存储和操作稀疏矩阵。

四、实验内容1. 稀疏矩阵的三元组表示方法:定义三元组结构体,包括行号、列号和元素值。

2. 稀疏矩阵的输入:从文件中读取稀疏矩阵的三元组数据。

3. 稀疏矩阵的传统转置算法:按行优先顺序遍历原矩阵,将非零元素的三元组信息插入到转置矩阵的三元组中。

4. 稀疏矩阵的快速转置算法:利用行压缩技术,减少转置过程中的重复计算,提高算法效率。

5. 转置矩阵的输出:将转置矩阵的三元组信息按照矩阵形式输出。

五、实验步骤1. 定义三元组结构体:```cppstruct Triple {int i; // 行号int j; // 列号double e; // 元素值};```2. 创建稀疏矩阵:```cppvoid CreateSparseMatrix(Triple& data, int& m, int& n, int& tu) { // 从文件中读取稀疏矩阵的三元组数据// ...}```3. 传统转置算法:```cppvoid TransposeMatrix(Triple& data, int& m, int& n, int& tu) {Triple t[MAXSIZE];int k = 0;for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (data[i].j == j) {t[k].i = data[i].j;t[k].j = data[i].i;t[k].e = data[i].e;++k;}}}// 将t复制到data中// ...}```4. 快速转置算法:```cppvoid FastTransposeMatrix(Triple& data, int& m, int& n, int& tu) { // 利用行压缩技术,减少转置过程中的重复计算// ...}```5. 输出转置矩阵:```cppvoid PrintMatrix(Triple& data, int& m, int& n, int& tu) {// 按矩阵形式输出转置矩阵的三元组信息// ...}```六、实验结果与分析1. 实验结果:通过实验,成功实现了稀疏矩阵的传统转置算法和快速转置算法,并验证了算法的正确性。

转置矩阵实验报告

转置矩阵实验报告

一、实验目的1. 理解矩阵转置的概念和性质。

2. 掌握矩阵转置的计算方法,包括普通矩阵和稀疏矩阵的转置。

3. 通过编程实现矩阵转置算法,并分析算法的复杂度。

4. 理解矩阵转置在数值计算中的应用。

二、实验原理矩阵转置是指将矩阵的行和列互换位置得到的新矩阵。

对于任意矩阵 \( A \) ,其转置矩阵记为 \( A^T \) 。

如果 \( A \) 是一个 \( m \times n \) 的矩阵,那么 \( A^T \) 是一个 \( n \times m \) 的矩阵。

三、实验内容1. 普通矩阵转置- 使用二维数组存储矩阵,实现普通矩阵的转置。

- 输入一个 \( m \times n \) 的矩阵,输出其转置矩阵 \( A^T \) 。

2. 稀疏矩阵转置- 使用三元组表示稀疏矩阵,实现稀疏矩阵的转置。

- 输入一个稀疏矩阵,输出其转置矩阵 \( A^T \) 。

3. 算法分析- 分析普通矩阵转置和稀疏矩阵转置算法的时间复杂度。

- 比较两种算法在处理不同类型矩阵时的效率。

四、实验步骤1. 普通矩阵转置- 定义一个二维数组 \( A \) 存储矩阵元素。

- 输入矩阵 \( A \) 的行数 \( m \) 和列数 \( n \) 。

- 输入矩阵 \( A \) 的元素。

- 遍历数组 \( A \),将元素 \( A[i][j] \) 放入新数组 \( A^T[j][i] \) 。

- 输出转置矩阵 \( A^T \) 。

2. 稀疏矩阵转置- 定义一个结构体存储三元组,包括行号、列号和元素值。

- 输入稀疏矩阵的非零元素个数 \( t \) ,行数 \( m \) 和列数 \( n \) 。

- 输入稀疏矩阵的三元组表示。

- 遍历三元组表,将每个三元组 \( (i, j, e) \) 改为 \( (j, i, e) \) 。

- 输出转置矩阵 \( A^T \) 的三元组表示。

3. 算法分析- 普通矩阵转置的时间复杂度为 \( O(mn) \) ,空间复杂度为 \( O(mn) \) 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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++){
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;
PrintTSMatrix(C);
PrintTSMatrix1(C);
}
}
四、调试分析
1、三元组顺序表的输出顺序应该是先按行排序再按列排序,即行主序,依次输出。
2、生成的非零元应该有正数和负数,选取在-20到20之间的数(不包括0),生成随机数时同时随机生成其正负号,为正数时将rand()%20再加1,避免再产生0,为负数时将rand()%20-20。
typedef int Status;
typedef struct{
int i,j;
ElemType e;
}Triple;//数据类型三元组
typedef struct{
Triple data[maxsize+1];//矩阵大小
int mu,nu,tu;//
}TSMatrix;//矩阵抽象数据类型
Status CreateTSMatrix(TSMatrix *M);//创建矩阵
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){
(2)按enter键输出随机生成的矩阵三元组顺序表和整个矩阵
如图所示:
(3)程序自动完成第一个矩阵的转置并输出;
(4)提示输入矩阵B后,用户输入所需矩阵的行数和列数,然后程序将自动完成两个原始矩阵的相加,若不是同型矩阵则提示无法相加。
如图所示:
五、附录(源代码及注释)
#include <stdio.h>
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];
#include <stdlib.h>
#include "time.h"
#define maxsize 10000
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef int ElemType;
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++){
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)
}
}
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);
初始条件:矩阵M,N已存在
操作结果:将矩阵M,N相加得到Q并返回矩阵Q
FastTransposeSMatrix(M,&N)
初始条件:矩阵M已存在
操作结果:将矩阵M快速转置得到转置矩阵N并返回
}ADT TSMatrix;
⒊ 本程序模块结构
⑴ 主函数模块
void main(){
初始化迷矩阵;
创建矩阵并输出;
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;
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;
else
M->data[p].e=rand()%20-20;
M->data[p].i=m+1;
M->data[p].j=n+1;
void PrintTSMatrix(TSMatrix M);//输出矩阵非零元素
void PrintTSMatrix1(TSMatrix M);//以阵列形式输出矩阵
int UnZore(TSMatrix M,int row,int col);//判断位置(row,col)是否存在非零元素
Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *Q);//将矩阵M,N相加得到Q
PrintTSMatrix(A1);
PrintTSMatrix1(A1);
printf("矩阵B:\n");
CreateTSMatrix(&B);
PrintTSMatrix(B);
PrintTSMatrix1(B);
printf("矩阵A加矩阵B得到矩阵C...\n");
if(TSMatrix_Add(A,B,&C)){
}
else{
printf("\n不是同型矩阵不能进行相加!\n");
return ERROR;
}
}
Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N){
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵N
N->mu=M.nu;
N->nu=M.mu;
1、实验内容和要求
1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相加得到矩阵C的算法。
(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。
(2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。
(3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。
int mu,nu,tu;//
}TSMatrix;//矩阵抽象数据类型
2、参数设置:
#define maxsize 10000
//----------基本操作的算法描述--------------------
Status CreateTSMatrix(TSMatrix *M){
//创建一个随机矩阵(data[0]未用)
(4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。
2、实验过程及结果
1、需求分析
1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。
初始条件:矩阵M已存在
操作结果:输出矩阵M中三元组形式的非零元素
相关文档
最新文档