矩阵转置及相加实验报告
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软件对矩阵进行实验,探讨其在矩阵运算中的应用和优势。
实验方法:1. 创建矩阵:利用MATLAB软件创建不同大小的矩阵,包括方阵和非方阵。
2. 矩阵运算:进行矩阵的加法、减法、乘法等运算,比较不同大小矩阵的计算效率和结果准确性。
3. 矩阵转置:对矩阵进行转置操作,观察转置后矩阵的性质和应用。
4. 逆矩阵:求解矩阵的逆矩阵,并分析逆矩阵在实际问题中的应用。
5. 特征值和特征向量:利用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

矩阵转置实验报告篇一:实验报告矩阵快速转置实验报告实验项目名称:实现矩阵的快速转置的操作所属课题名称:数据结构实验类型:验证实验实验日期: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六、实验结论通过本次实验,我们掌握了矩阵的基本概念和性质,以及矩阵的运算方法。
实验结果表明,矩阵运算在科学计算、工程应用、经济管理等领域有着广泛的应用。
在实际应用中,熟练掌握矩阵运算对于解决实际问题具有重要意义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
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中三元组形式的非零元素