MATLAB基本矩阵运算
MATLAB中对矩阵的基本操作
MATLAB中对矩阵的基本操作在MATLAB中,可以对矩阵进行多种基本操作,包括创建矩阵、访问元素、改变矩阵的大小、插入和删除元素、矩阵的运算等。
以下是对这些操作的详细说明:1.创建矩阵:在MATLAB中,可以使用多种方式创建矩阵。
其中最常用的方式是使用方括号将元素排列成行或列,例如:```A=[1,2,3;4,5,6;7,8,9];```这将创建一个3x3的矩阵A,其元素为1到92.访问元素:可以使用括号和下标来访问矩阵中的元素。
下标从1开始计数。
例如,要访问矩阵A的第二行第三列的元素,可以使用以下代码:```A(2,3);```这将返回矩阵A的第二行第三列的元素。
3.改变矩阵的大小:可以使用函数如reshape和resize来改变矩阵的大小。
reshape函数可以将矩阵重新组织为不同的行和列数。
例如,以下代码使用reshape 将3x3的矩阵A重新组织为1x9的矩阵B:```B = reshape(A, 1, 9);```resize函数可以改变矩阵的大小,可以用来增加或减少矩阵的行和列数。
例如,以下代码将矩阵A的大小改变为2x6:```A = resize(A, 2, 6);```4.插入和删除元素:可以使用括号和下标来插入和删除矩阵中的元素。
例如,以下代码会在矩阵A的第二行的末尾插入一个元素10:```A(2, end+1) = 10;```同时,可以使用括号和下标来删除矩阵中的元素。
以下代码将删除矩阵A的第一行的第二个元素:```A(1,2)=[];```这将删除矩阵A的第一行的第二个元素。
5.矩阵的运算:-矩阵乘法:使用*符号进行矩阵乘法运算。
例如,以下代码将矩阵A 与矩阵B相乘:```C=A*B;```-矩阵加法和减法:使用+和-符号进行矩阵加法和减法运算。
例如,以下代码将矩阵A和矩阵B相加得到矩阵C:```C=A+B;```-矩阵转置:使用'符号进行矩阵的转置操作。
例如,以下代码将矩阵A转置:```B=A';```-矩阵相乘:使用.*符号进行矩阵的元素级相乘运算。
matlab矩阵的代数运算
matlab矩阵的代数运算操作:1.矩阵相加:C = A + B,其中A、B和C都是具有相同维度的矩阵。
2.矩阵相减:C = A - B,其中A、B和C都是具有相同维度的矩阵。
3.矩阵乘法:C = A * B,其中A的列数与B的行数相等,C的维度为A的行数乘以B的列数。
4.矩阵点乘(对应元素相乘):C = A .* B,其中A、B和C都是具有相同维度的矩阵。
5.矩阵的转置:B = A',其中A和B具有相同的维度,但是B的行和列与A的行和列交换。
6.矩阵的逆:B = inv(A),其中A是一个可逆方阵,B是A的逆矩阵,满足A *B = B * A = I,其中I是单位矩阵。
7.矩阵的行列式:det_A = det(A),其中A是一个方阵,det_A是A的行列式。
8.矩阵的迹:trace_A = trace(A),其中A是一个方阵,trace_A是A的迹,即A的主对角线元素之和。
9.矩阵的特征值和特征向量:[V, D] = eig(A),其中A是一个方阵,V是特征向量矩阵,D是特征值矩阵,满足 A * V = V * D。
10.矩阵的广义逆矩阵:B = pinv(A),其中A是一个矩阵,B是A的广义逆矩阵,满足 A * B * A = A。
11.矩阵的克罗内克积:C = kron(A, B),其中A和B是两个矩阵,C是A和B的克罗内克积。
12.矩阵的行合并:C = [A; B],其中A和B具有相同的列数,C是将A和B按行合并得到的矩阵。
13.矩阵的列合并:C = [A, B],其中A和B具有相同的行数,C是将A和B按列合并得到的矩阵。
矩阵相加:A = [1 2; 3 4];B = [5 6; 7 8];C = A + B;矩阵相减:A = [1 2; 3 4];B = [5 6; 7 8];C = A - B;矩阵乘法A = [1 2; 3 4];B = [5 6; 7 8];C = A * B;矩阵点乘(对应元素相乘):A = [1 2; 3 4];B = [5 6; 7 8];C = A .* B;矩阵的转置:A = [1 2; 3 4];B = A';矩阵的逆:A = [1 2; 3 4];B = inv(A);矩阵的行列式:A = [1 2; 3 4];det_A = det(A);矩阵的特征值和特征向量:A = [1 2; 3 4];[V, D] = eig(A); % V为特征向量矩阵,D为特征值矩阵。
Matlab矩阵运算基础数值运算
data =
1.1000 3.0000 4.0000
2.3000 2.0000 1.0000
.
13
3.2 矩阵运算
主要介绍矩阵的算术运算、关系运算、逻辑 运算和常用的有关矩阵的其他运算(矩阵的 逆,矩阵的秩、矩阵的分解等)。
.
14
3.2.1 矩阵的算术运算
1、矩阵的加(+)减(-)运算:
A±B 矩阵A和矩阵B的和与差,即矩阵相应 位置的元素相加、减。
>> A=magic(3)
D=
A= 816
0.5492 0.2421 -0.6520 0.9075
357
1.0047 -0.4941
492
>> C*D
>> B=inv(A)
ans =
B=
1.0000 0.0000
0.1472 -0.1444 0.0639
0.0000 1.0000
-0.0611 0.0222 0.1056
~ A 对单个矩阵或标量进行取反运算,结果是0-1矩阵。
.
28
3.2.3 矩阵的逻辑运算
例3-11 1 0 3
1 2 0
A2.6 1 2, B0 5 0
0 3 1
1 0 1
计算 A&B, A|B, ~A Nhomakorabea.
29
3.2.4 矩阵函数
1、矩阵的共轭
MATLAB中求矩阵的共轭矩阵的函数是conj,其 调用格式为:
除或浮点溢出都不按错误处理,只是给出警告信息,同时用“Inf”
标记。
.
20
3.2.1 矩阵的算术运算
4、 矩阵的幂运算:^ A^B A的B次方。
matlab中的矩阵的基本运算命令
1.1 矩阵的表示1.2 矩阵运算1.2.14 特殊运算1.矩阵对角线元素的抽取函数diag格式X = diag(v,k) %以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。
X = diag(v) %以v为主对角线元素,其余元素为0构成X。
v = diag(X,k) %抽取X的第k条对角线元素构成向量v。
k=0:抽取主对角线元素;k>0:抽取上方第k条对角线元素;k<0抽取下方第k条对角线元素。
v = diag(X) %抽取主对角线元素构成向量v。
2.上三角阵和下三角阵的抽取函数tril %取下三角部分格式L = tril(X) %抽取X的主对角线的下三角部分构成矩阵LL = tril(X,k) %抽取X的第k条对角线的下三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。
函数triu %取上三角部分格式U = triu(X) %抽取X的主对角线的上三角部分构成矩阵UU = triu(X,k) %抽取X的第k条对角线的上三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。
3.矩阵的变维矩阵的变维有两种方法,即用“:”和函数“reshape”,前者主要针对2个已知维数矩阵之间的变维操作;而后者是对于一个矩阵的操作。
(1)“:”变维(2)Reshape函数变维格式 B = reshape(A,m,n) %返回以矩阵A的元素构成的m×n矩阵BB = reshape(A,m,n,p,…) %将矩阵A变维为m×n×p×…B = reshape(A,[m n p…]) %同上B = reshape(A,siz) %由siz决定变维的大小,元素个数与A中元素个数相同。
(5)复制和平铺矩阵函数repmat格式 B = repmat(A,m,n) %将矩阵A复制m×n块,即B由m×n块A平铺而成。
第二部分 矩阵的运算符号(1)
第2章Matlab及其应用2.1 MATLAB的基本矩阵运算2.2 MATLAB的变量2.3 关系和逻辑运算2.4 矩阵操作2.1、MATLAB的基本矩阵运算2.1.1 简单矩阵输入1、命令行简单键盘输入用于很少数据输入矩阵的方向:, ; NaNInf2、文件形式输入文本文件:从文本文件中读入数据mat文件:matlab自有的数据格式>> B=[1 2 3; 4 5 6]B =1 2 34 5 62.1.2 语句生成矩阵1、线性等间距格式矩阵(1)X=起始值:增加值:结束值(2)linspace命令a=linspace(1,10,5);(3)logspace命令b=logspace(0,2,10)2、矩阵连接c=[a b];生成矩阵的函数zeros ones eye randn2.1.3 矩阵运算1、矩阵的运算符+:加法-:減法*:乘法;点乘:.*/:右除;右除:./\:左除;左除:.\^:乘方2、矩阵的转置等运算’ 共轭转置;.’ 转置inv:矩阵求逆det:求行列式值eig:求特征值与特征向量1/ () ; \ () :()*; \a ba b a bb aAx bx A b Inv A b x A b-======除法左除法對矩陣运算规则:从左到右;先乘除后加减;乘方运算符最高(1)两矩阵加减,前提是维数相同,进行加减运算时,对应的元素进行加减;(2)矩阵与标量加减,用矩阵中的每个元素都与标量进行加减运算;(3)两矩阵相乘,前提是前一矩阵的列等于后一矩阵的行,与数学约定一样;(4)矩阵与标量相乘,用矩阵中的每个元素都与标量进行相乘;(5)矩阵中的元素对元素的相乘:.*矩阵中的元素对元素的相除:./ .\z=x.^y x,y均为向量:z(i)=x(i) ^y(i)x为向量,y为标量:z(i)=x(i) ^yx为标量,y为向量:z(i)=x^y(i)2.1.4 矩阵的超越函数函数名含义abs绝对值或者复数模sqrt平方根real实部imag虚部conj复数共轭round4舍5入到整数fix舍入到最接近0的整数floor舍入到最接近-∞的整数ceil舍入到最接近∞的整数函数名含义sign符号函数rem留数sin正弦cos余弦tan正切asin反正弦acos反余弦atan反正切atan2第四象限反正切函数名含义sinh双曲正弦cosh双曲余弦tanh双曲正切exp自然指数log自然对数log10以10为底的对数2.2 关系和逻辑运算1、关系操作符(1)MATLAB常用的关系操作符有:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、= =(等于)、~=(不等于)。
matlab里矩阵运算
matlab里矩阵运算
在MATLAB中,矩阵运算是非常方便且强大的。
下面是一些常见的矩阵运算操作:
1. 矩阵相加或相减:
matlab
C = A + B; % 矩阵A和B相加,结果存储在C中
D = A - B; % 矩阵A和B相减,结果存储在D中
2. 矩阵相乘:
matlab
C = A * B; % 矩阵A和B相乘,结果存储在C中
3. 矩阵与标量相乘或相除:
matlab
C = A * scalar; % 矩阵A与标量相乘,结果存储在C中
D = A / scalar; % 矩阵A与标量相除,结果存储在D中
4. 矩阵转置:
matlab
B = A.'; % 矩阵A的转置存储在B中
5. 矩阵求逆:
matlab
B = inv(A); % 矩阵A的逆矩阵存储在B中
6. 矩阵的点乘或点除:
matlab
C = A .* B; % 矩阵A和B对应元素相乘,结果存储在C中
D = A ./ B; % 矩阵A和B对应元素相除,结果存储在D中
这些只是矩阵运算中的一些基本操作,MATLAB还提供了更多高级的矩阵运算函数和工具,如特征值分解、奇异值分解、矩阵乘法、内积、外积等。
您可以进一步研究MATLAB的文档以了解更多相关函数和操作。
matlab 变量、矩阵基本运算代码
matlab 变量、矩阵基本运算代码详解
MATLAB是一种高效的编程语言和环境,主要用于数值计算和数据分析。
它支持多种数据类型,其中矩阵是最基本的数据结构之一。
下面是一些关于MATLAB变量和矩阵基本运算的代码示例。
1.变量定义
在MATLAB中,变量不需要提前声明,可以直接赋值。
例如:
2.矩阵基本运算
MATLAB支持多种矩阵基本运算,包括加法、减法、乘法和转置等。
例如:
注意,在MATLAB中,矩阵乘法需要用*符号表示,而不是普通的乘号x。
此外,MATLAB还支持一些特殊的矩阵运算,例如逆矩阵、行列式和特征值等。
例如:
3.变量替换和循环结构
MATLAB还支持变量替换和循环结构,可以方便地进行批量计算和数据处理。
例如:
以上是一些关于MATLAB变量和矩阵基本运算的代码示例,希望能对您有所帮助。
MATLAB基础教程 第2章 数组、矩阵及其运算
写出MATLAB表达式。 解:根据MATLAB的书写规则,以上MATLAB表达式为: (1)y=1/(a*log(1-x-1)+C1) (2)f=2*log(t)*exp(t)*sqrt(pi) (3)z=sin(abs(x)+abs(y))/sqrt(cos(abs(x+y))) (4)F=z/(z-exp(T*log(8)))
命令:X(3:-1:1)
命令:X(find(X>0.5)) 命令:X([1 2 3 4 4 3 2 1])
第二章 数组、矩阵及其运算
2.1 数组(矩阵)的创建和寻访
2. 二维数组的创建和寻访
例2-3 综合练习。将教材P.31~P.44的实例按顺序在MATLAB的 command窗口中练习一遍,观察并体会其输出结果。 (注意变量的大小写要和教材上的严格一致。)
A./B
B.\A
A的元素被B的对应元素相除
(与上相同)
第二章 数组、矩阵及其运算
2.3 数组、矩阵的其他运算
1. 乘方开方运算
数组的乘方运算与power函数 格式:c=a.^k或c=power(a,k) 例如: >> g=[1 2 3;4 5 6] >>g.^2 矩阵的乘方运算与mpower函数 格式:C=A^P或C=mpower(A,P) 注意:A必须为方阵
第二章 数组、矩阵及其运算
2.2 数组、矩阵的运算
3. 矩阵的加法、减法
运算规则是:若A和B矩阵的维数相同,则可以执行矩阵的加减运算, A和B矩阵的相应元素相加减。如果维数不相同,则MATLAB将给出
出错信息。
第二章 数组、矩阵及其运算
2.2 数组、矩阵的运算
3. 矩阵的乘法
如何使用Matlab进行矩阵运算
如何使用Matlab进行矩阵运算随着科学技术的不断发展,矩阵运算在各个领域的应用日益广泛。
Matlab作为一款功能强大的数学软件,其矩阵运算能力非常强大。
本文将介绍如何使用Matlab进行矩阵运算,希望能对读者在科学研究和工程实践中的矩阵计算有所帮助。
一、Matlab的基本矩阵运算1. 创建矩阵在Matlab中,可以使用一对方括号`[]`来创建矩阵。
例如,要创建一个3行3列的矩阵A,可以使用如下命令:A = [1 2 3; 4 5 6; 7 8 9]。
这样就创建了一个元素分别为1到9的3行3列矩阵。
2. 矩阵加法和减法Matlab中可以使用加号和减号来进行矩阵的加法和减法运算。
例如,要计算矩阵A和B的和,可以使用命令C = A + B;要计算矩阵A和B的差,可以使用命令D = A - B。
3. 矩阵乘法Matlab中使用乘号`*`来进行矩阵的乘法运算。
例如,要计算矩阵A和B的乘积,可以使用命令C = A * B。
需要注意的是,矩阵乘法是满足结合律的,即A *(B * C) = (A * B) * C。
4. 矩阵转置在Matlab中,可以使用单引号`'`来对矩阵进行转置操作。
例如,对矩阵A进行转置,可以使用命令B = A'。
需要注意的是,转置操作只能应用于二维矩阵。
5. 求逆矩阵在Matlab中,可以使用inv函数来求解矩阵的逆矩阵。
例如,要求矩阵A的逆矩阵,可以使用命令B = inv(A)。
需要注意的是,只有方阵才有逆矩阵。
6. 矩阵的特征值和特征向量Matlab中可以使用eig函数来求解矩阵的特征值和特征向量。
例如,要求矩阵A的特征值和特征向量,可以使用命令[V,D] = eig(A),其中V为特征向量矩阵,D 为特征值对角矩阵。
二、Matlab的高级矩阵运算1. 矩阵的点乘和叉乘Matlab中使用.*和.^来进行矩阵的点乘和叉乘运算。
例如,要计算矩阵A和B 的点乘,可以使用命令C = A .* B;要计算矩阵A和B的叉乘,可以使用命令D =A .^ B。
matlab 矩阵运算程序
matlab 矩阵运算程序(实用版)目录一、引言二、MATLAB 矩阵运算的基本概念1.矩阵的代数运算2.矩阵的关系运算3.矩阵的逻辑运算三、MATLAB 矩阵运算的实例1.矩阵的代数运算实例2.矩阵的关系运算实例3.矩阵的逻辑运算实例四、MATLAB 矩阵运算的注意事项五、结论正文一、引言MATLAB 是一种基于矩阵和数组计算的编程语言,被广泛应用于各个领域,如科学计算、数据分析、图像处理等。
矩阵在 MATLAB 中扮演着非常重要的角色,熟练掌握 MATLAB 矩阵运算对于使用 MATLAB 进行相关工作至关重要。
本文将介绍 MATLAB 矩阵运算的基本概念、实例以及注意事项。
二、MATLAB 矩阵运算的基本概念1.矩阵的代数运算矩阵的代数运算包括矩阵加法、减法、数乘、矩阵乘法等。
例如,给定两个 3x3 的矩阵 A 和 B,可以进行如下运算:A + B:将 A 和B 对应位置的元素相加,得到一个新的 3x3 矩阵。
A - B:将 A 和B 对应位置的元素相减,得到一个新的 3x3 矩阵。
k * A:将矩阵 A 中的每个元素乘以 k,得到一个新的矩阵。
A * B:将矩阵 A 和矩阵B 进行矩阵乘法,得到一个新的矩阵。
2.矩阵的关系运算矩阵的关系运算包括矩阵的转置、求逆、行列式等。
例如,给定一个3x3 的矩阵 A,可以进行如下运算:A":矩阵 A 的转置。
A^-1:矩阵 A 的逆矩阵,当且仅当矩阵 A 是可逆矩阵时才有逆矩阵。
det(A):矩阵 A 的行列式。
3.矩阵的逻辑运算矩阵的逻辑运算包括矩阵的比较、逻辑与、逻辑或等。
例如,给定两个 3x3 的矩阵 A 和 B,可以进行如下运算:A > B:判断矩阵 A 是否大于矩阵 B。
A & B:计算矩阵 A 和矩阵B 的逻辑与。
A | B:计算矩阵 A 和矩阵B 的逻辑或。
Matlab 矩阵的运算
(1) 矩阵加减运算 假定有两个矩阵A和B,则可以由A+B和 A-B实现矩阵的加减运算。 运算规则是:若A和B矩阵的维数相同, 则可以执行矩阵的加减运算,A和B矩阵的相 应元素相加减。如果A与B的维数不相同,则 MATLAB将给出错误信息,提示用户两个矩 阵的维数不匹配。 (2) 矩阵乘法 假定有两个矩阵A和B,若A为m×n矩阵, B为n×p矩阵,则C=A*B为m×p矩阵。
关系运算符的运算法则为: (1) 当两个比较量是标量时,直接比较两 数的大小。若关系成立,关系表达式结果为1, 否则为0。 (2) 当参与比较的量是两个维数相同的矩 阵时,比较是对两矩阵相同位置的元素按标 量关系运算规则逐个进行,并给出元素比较 结果。最终的关系运算的结果是一个维数与 原矩阵相同的矩阵,它的元素由0或1组成。
例3-3 先建立 5×5矩阵A,然后将A的第一 行元素乘以1,第二行乘以2,…,第五行乘 以5。 A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22; 10,12,19,21,3;11,18,25,2,19]; D=diag(1:5); D*A %用D左乘A,对A的每行 乘以一个指定常数
3.3 字符串
在MATLAB中,字符串是用单撇号(‘)括 起来的字符序列。 MATLAB 将字符串当作一个行向量, 每个元素对应一个字符,其标识方法和数值 向量相同。也可以建立多行字符串矩阵。
字符串是以ASCII码形式存储的。abs和 double函数都可以用来获取字符串矩阵所对 应的ASCII码数值矩阵。 相反,char函数可以把ASCII码矩阵转换 为字符串矩阵。
3.2.4 方阵的行列式
把一个方阵看作一个行列式,并对其按 行列式的规则求值,这个值就称为矩阵所对 应的行列式的值。 在MATLAB中,求方阵A所对应的行列 式的值的函数是det(A)。
matlab基本矩阵运算
0.778 0 2332 54 3.14 6 9.54
(二) 、将以下代码输入到 command window 窗口中,回车即可。 1.题 M=10+magic(4) M=(2:4,2:4) %这里提取 2,3,4 行和 2,3,4 列的元素值。
完成下列操作: (1)输出 A 在[10,25]范围内的全部元素。 (2)取出 A 前 3 行构成矩阵 B,前两列构成矩阵 C,右下角 3*2 子矩阵构成矩阵 D,B 与 C 的乘 积构成矩阵 E. (3)分别求表达式 E<D、E&D、E|D 和~E|~D 的值。 3. 求下列矩阵的主对角线元素、上对角线、下对角线矩阵、逆矩阵、行列式的值、秩、范数、 条件数、迹。 A(K) B=A(1:3,:) 2.题 A=[23,10,-0.778,0;41,-45,65,5;32,5,0,32;6,-9.54,54,3.14] K=find(A>=10&A<=25)
C=A(:,1:2) D=A(2:4,2:4) E=B*C
P3=cond(A,inf) T=trace(A) (2)代码类似(1)
4.题 A=[2,2,1;3,1,-1;4,3,3;5,3,8;6,6,12]; B=spconvert(A) 3.题 (1)A=[1,-1,2,3;5,1,-4,2;3,0,5,2;11,15,0,9] D=diag(A) B=triu(A) B=tril(A) F=inv(A) D=det(A) r=rank(A) V1=norm(A,1) V2=norm(A) Vinf=norm(A,inf) P1=cond(A,1) P2=cond(A) 五、实验心得: 通过本次实验,我对 MATLAB 矩阵分析与处理这章知识有了一定的认识,学会了矩阵转置、相乘、求 逆等基本矩阵运算,学会了矩阵的变换方法,掌握稀疏矩阵的生成方法。当然,在这次实验中,也难 免遇到了一些问题,比如操作不当,代码输入错误等,后来通过我认真的分析,终于找到了错误并加 以改正。
matlab中的基本运算
matlab中的基本运算基本运算是MATLAB中最基础的操作之一,它涵盖了数值计算、数据处理和绘图等各个方面。
本文将详细介绍MATLAB中的基本运算,包括算术运算、矩阵运算、逻辑运算和位运算等。
一、算术运算算术运算是最基本的运算之一,MATLAB中支持的算术运算包括加法、减法、乘法和除法等。
例如,可以使用"+"符号进行两个数的加法运算,用"-"符号进行减法运算,用"*"符号进行乘法运算,用"/"符号进行除法运算。
此外,还可以使用"^"符号进行幂运算,使用"sqrt"函数进行开方运算。
二、矩阵运算MATLAB中的矩阵运算是其强大功能之一。
可以使用矩阵进行加法、减法、乘法和除法等运算。
例如,可以使用"+"符号进行矩阵的逐元素加法运算,用"-"符号进行逐元素减法运算,用"*"符号进行矩阵的乘法运算,用"./"符号进行矩阵的逐元素除法运算。
三、逻辑运算逻辑运算在MATLAB中广泛应用于判断条件和控制流程。
MATLAB 支持的逻辑运算有与、或、非和异或等。
例如,可以使用"&&"符号进行逻辑与运算,用"||"符号进行逻辑或运算,用"~"符号进行逻辑非运算,用"xor"函数进行逻辑异或运算。
四、位运算位运算是对二进制数进行逐位操作的运算。
MATLAB支持的位运算有与、或、非、异或、左移和右移等。
例如,可以使用"&"符号进行位与运算,用"|"符号进行位或运算,用"~"符号进行位非运算,用"xor"函数进行位异或运算,用"<<"符号进行左移运算,用">>"符号进行右移运算。
MATLAB基础(矩阵运算和矩阵操作)2
223445.68
数学运算符号及标点符号
+ — * .* / ./ ^ 减法运算 乘法运算 点乘运算 除法运算 点除运算 乘幂运算
加法运算,适用于两个数或两个同阶矩阵相加
(1)MATLAB的每条命令后,若为逗号或无标点符号, .^ 点乘幂运算 则显示命令的结果;若命令后为分号,则禁止显示结果. \ 后面所有文字为注释. (2)“%” 反斜杠表示左除. 36 (3) “...”表示续行.
10
命令窗口
11
工作间
12
当前目录
13
历史命令
14
设置路径搜索 当前目录
15
进入搜索对话框
16
设置搜索路径对话框
17
18
Editpath or pathtool
20
‘帮助’的使用
help 命令:已知命令 lookfor命令:知道命令的关键词 MATLAB Help:命令查找,索引,说明书 Demo
2.2345e+005
>> format rat >> 223445.6778987654
>> format bank >> 223445.6778987654
ans =
ans =
670337/3 >> format long e >> 223445.6778987654 ans = 2.234456778987654e+005
39
clear命令用于删除MATLAB工作空间中的变 量。 who和whos这两个命令用于显示在MATLAB工 作空间中已经驻留的变量名清单。 who命令只显示出驻留变量的名称,whos在给 出变量名的同时,还给出它们的大小、所占 字节数及数据类型等信息。
matlab matrix 矩阵基本运算
第1章矩阵及其基本运算MATLAB,即“矩阵实验室”,它是以矩阵为基本运算单元。
因此,本书从最基本的运算单元出发,介绍MATLAB的命令及其用法。
1.1 矩阵的表示1.1.1 数值矩阵的生成1.实数值矩阵输入MATLAB的强大功能之一体现在能直接处理向量或矩阵。
当然首要任务是输入待处理的向量或矩阵。
不管是任何矩阵(向量),我们可以直接按行方式输入每个元素:同一行中的元素用逗号(,)或者用空格符来分隔,且空格个数不限;不同的行用分号(;)分隔。
所有元素处于一方括号([ ])内;当矩阵是多维(三维以上),且方括号内的元素是维数较低的矩阵时,会有多重的方括号。
如:>> Time = [11 12 1 2 3 4 5 6 7 8 9 10]Time =11 12 1 2 3 4 5 6 7 8 9 10>> X_Data = [2.32 3.43;4.37 5.98]X_Data =2.433.434.375.98>> vect_a = [1 2 3 4 5]vect_a =1 2 3 4 5>> Matrix_B = [1 2 3;>> 2 3 4;3 4 5]Matrix_B = 1 2 32 3 43 4 5>> Null_M = [ ] %生成一个空矩阵2.复数矩阵输入复数矩阵有两种生成方式:第一种方式例1-1>> a=2.7;b=13/25;>> C=[1,2*a+i*b,b*sqrt(a); sin(pi/4),a+5*b,3.5+1]C=1.0000 5.4000 + 0.5200i 0.85440.7071 5.3000 4.5000第2种方式例1-2>> R=[1 2 3;4 5 6], M=[11 12 13;14 15 16]R =1 2 34 5 6M =11 12 1314 15 16>> CN=R+i*MCN =1.0000 +11.0000i2.0000 +12.0000i3.0000 +13.0000i4.0000 +14.0000i5.0000 +15.0000i6.0000 +16.0000i1.1.2 符号矩阵的生成在MATLAB中输入符号向量或者矩阵的方法和输入数值类型的向量或者矩阵在形式上很相像,只不过要用到符号矩阵定义函数sym,或者是用到符号定义函数syms,先定义一些必要的符号变量,再像定义普通矩阵一样输入符号矩阵。
MATLAB的矩阵运算
MATLAB的矩阵运算阅读⽬录 MATLAB是基于矩阵和数组计算的,可以直接对矩阵和数组进⾏整体的操作,MATLAB有三种矩阵运算类型:矩阵的代数运算、矩阵的关系运算和矩阵的逻辑运算。
其中,矩阵的代数运算应⽤最⼴泛。
本⽂主要讲述矩阵的基本操作,涉及矩阵的创建、矩阵的代数运算、关系运算和逻辑运算等基本知识。
矩阵的创建直接输⼊法创建矩阵% 1. 直接输⼊法创建矩阵>> A = [1,2,3; 4,5,6; 7,8,9]A =1 2 34 5 67 8 9函数法创建矩阵简单矩阵% 2. 函数法创建矩阵>> zeros(3)% ⽣成3x3的全零矩阵ans =0 0 00 0 00 0 0>> zeros(3,2)% ⽣成3x2的全零矩阵ans =0 00 00 0>> eye(3)% ⽣成单位矩阵ans =1 0 00 1 00 0 1>> ones(3)% ⽣成全1矩阵ans =1 1 11 1 11 1 1>> magic(3)% ⽣成3x3的魔⽅阵ans =8 1 63 5 74 9 2>> diag(1:3)% 对⾓矩阵ans =1 0 00 2 00 0 3>> diag(1:5,1)% 对⾓线向上移1位矩阵ans =0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 3 0 0 0 0 0 0 4 0 0 0 0 0 0 5 0 0 0 0 0 0 >> diag(1:5,-1)% 对⾓线向下移1位矩阵ans =0 0 0 0 0 01 0 0 0 0 0 02 0 0 0 0 0 03 0 0 0 0 0 04 0 0 0 0 0 05 0 >> triu(ones(3,3))% 上三⾓矩阵ans =1 1 10 1 10 0 1>> tril(ones(3,3))% 下三⾓矩阵ans =1 0 01 1 01 1 1随机矩阵>> rand(3)% ⽣成随机矩阵ans =0.2898 0.8637 0.05620.4357 0.8921 0.14580.3234 0.0167 0.7216>> rand('state',0); % 设定种⼦数,产⽣特定种⼦数下相同的随机数>> rand(3)ans =0.9501 0.4860 0.45650.2311 0.8913 0.01850.6068 0.7621 0.8214>> a = 1; b = 100;>> x = a + (b-a)* rand(3)% 产⽣区间(1,100)内的随机数x =38.2127 20.7575 91.113389.9610 31.0064 53.004043.4711 54.2917 31.3762>> a = 1; b = 100;>> a + fix(b * rand(1,50))% 产⽣50个[1,100]内的随机正整数ans =列 1 ⾄ 154 72 77 6 63 27 32 53 41 90 58 57 40 70 57列 16 ⾄ 3035 60 28 5 84 11 73 45 100 57 47 42 22 24 32列 31 ⾄ 4587 26 97 31 38 35 71 62 76 80 22 90 90 94 28列 46 ⾄ 5048 26 37 53 39相似函数扩展>> randn(3)% ⽣成均值为0,⽅差为1的正太分布随机数矩阵ans =-0.4326 0.2877 1.1892-1.6656 -1.1465 -0.03760.1253 1.1909 0.3273>> randperm(10)% ⽣成1-10之间随机分布10个正整数ans =4 9 10 25 8 1 3 7 6% 多项式x^3 - 7x + 6 的伴随矩阵>> u = [1,0,-7,6];>> A = compan(u)% ⽣成伴随矩阵A =0 7 -61 0 00 1 0>> eig(A) % 此处eig()函数⽤于求特征值% 利⽤伴随矩阵求得⽅程的根ans =-3.00002.00001.0000矩阵的运算矩阵的代数运算矩阵的算术运算>> A = [1,1;2,2];>> B = [1,1;2,2];>> AA =1 12 2>> BB =1 12 2>> A + Bans =2 24 4>> B-Aans =0 00 0>> A * Bans =3 36 6>> A^2ans =3 36 6>> A^3ans =9 918 18矩阵的运算函数>> C = magic(3)C =8 1 63 5 74 9 2>> size(C)ans =3 3>> length(C)ans =3>> sum(C)ans =15 15 15>> max(C)ans =8 9 7>> C'ans =8 3 41 5 96 7 2>> inv(C)ans =0.1472 -0.1444 0.0639 -0.0611 0.0222 0.1056 -0.0194 0.1889 -0.1028矩阵的元素群运算元素群运算,是指矩阵中的所有元素按单个元素进⾏运算,也即是对应位置进⾏运算。
MATLAB矩阵运算
MATLAB矩阵运算1. 矩阵的加减乘除和(共轭)转置(1) 矩阵的加法和减法 如果矩阵A和B有相同的维度(⾏数和列数都相等),则可以定义它们的和A+B以及它们的差A-B,得到⼀个与A和B同维度的矩阵C,其中C ij=A ij+B ij或A ij-B ij.另外Matlab还⽀持任意⼀个矩阵A与⼀个标量s相加,结果为矩阵的每⼀个元素加减标量,得到⼀个与A同维度的新的矩阵,即A+s的各个元素为A ij+s.(2) 矩阵的乘法 如果矩阵A的列数等于矩阵B的⾏数,则可以将A和B相乘,命令为A*B,得到⼀个新的矩阵C,C的⾏数等于A的⾏数,列数等于B的列数. 由于矩阵的乘法不满⾜交换律,所以⼀般A*B不等于B*A.(3) 矩阵的张量积(tensor product) 矩阵A和B的张量积A⊗B可以⽅便地⽤kron函数计算,即使⽤命令kron(A,B), 例如(4) 矩阵的除法 在MatLab中,有两个矩阵除法符号,左除\和右除/. 如果A是⼀个⾮奇异⽅阵(nonsingular square, 即满秩⽅阵),B的⾏数与A的⾏数相等,那么A\B=A-1B. 如果C的列数与A的列数相等,那么C/A=CA-1. 从另⼀个⾓度来看,X=A\B是矩阵⽅程AX=B的解,X=C/A是矩阵⽅程XA=C的解. 如果b是⼀个⾏数与A的⾏数相等的列向量,则向量x=A\b是线性⽅程组 Ax=b的解. 且在矩阵⽅程AX=B中,A可以是⼀个m×n的矩阵,如果m=n则有唯⼀解;如果m<n则有多个解,Matlab会返回⼀个基础解;如果m>n则会返回⼀个最⼩⽅阵解.(5) 矩阵的转置和共轭转置 在Matlab中,矩阵的共轭转置⽤撇号’表⽰,如果不需要对元素进⾏共轭运算,仅仅只对矩阵进⾏转置,则在撇号之前输⼊⼀个点号,即.’ . 对于实数矩阵A,A’和A.’是相同的.2. 矩阵元素操作运算 矩阵的运算既可以是如前所述的正常的整体运算,也可以是矩阵对应的元素依次进⾏标量运算,也叫数组运算,即把矩阵看做是⼆维数组. 对矩阵进⾏数组运算后得到的结果是⼀个与参与运算的矩阵维度相同的新矩阵,.这种元素间的算术运算的前提是参与运算的两个矩阵的维数要相同.对于加法和减法,元素操作运算和矩阵运算没有差别,⽽对于乘、除和幂运算符,相应的数组运算符是在⼀般的算术运算符前⾯加上⼀个点号,如+ - .* ./ .\ .^其中,A./B 是指A中的元素除以B中相应的元素,即A./B 的第i⾏第j列的元素(A./B)ij=A ij/B ij,⽽(A.\B)ij=B ij\A ij. 这些元素运算符的使⽤例⼦如下所⽰: 在Matlab中预定义的数学标准函数,如sin(x), abs(x)等都是基于对矩阵元素的运算. 如果函数f(x)是这样的⼀个函数,A是⼀个m×n的矩阵,其元素是a ij ,那么 f(A)也是⼀个m×n的矩阵,其第i⾏第j列的元素为f(a ij),例如其中pi是Matlab的预定义变量,值为π,i也是预定义变量,表⽰复数的单位.3. 常⽤的矩阵函数 矩阵函数是指参数为矩阵的函数,函数结果可能是⼀个标量值也可能是⼀个函数或者向量. Matlab中常⽤的矩阵函数包括: (1) rank(A): 求矩阵A的秩,即A中线性⽆关的⾏数或者线性⽆关的列数. (2) det(A): 求矩阵A的⾏列式值. (3) inv(A): 如果A是⼀个⾮奇异(nonsingular)矩阵,则inv(A)返回A的逆矩阵. 另外还可以⽤左除A\eye(n)或右除eye(n)/A来计算A的逆,且在Matlab中⽤左除或右除来计算逆所花的计算时间⽐⽤inv函数要少,也⽐inv具有更好的容错性(error-detection properties). (4) dot(x,y): 求同维度的向量x和y的内积/点积. 若A和B是两个具有相同维度的矩阵,则dot(A,B)是计算A和B对应列的内积,结果是⼀个⾏向量,这个⾏向量的列数等于A或B的列数. 例如 (5) cross(x,y): 计算同维度的向量x和y的叉积,结果是⼀个向量,其⽅向由右⼿定则决定,长度等于|x|*|y|sin<x,y>. 若A和B是两个具有相同维度的矩阵,则cross(A,B)是计算A和B对应列的叉积,结果是⼀个维度与A和B相等的矩阵. (6) kron(A,B): 得到矩阵A和B的张量积. (7) isequal(A,B): 如果矩阵A和B是相同的,即具有相同的维数和相同的内容,则返回1. (8) isreal(A): 判断A是否是⼀个实矩阵,如果是则返回1,否则返回0. (9) trace(A): 计算⽅阵A的迹,即对⾓线元素之和. (10) eig(A): 计算⽅阵A的特征值,结果是⼀个列向量,向量中元素的个数等于特征值的个数,即A的维度(A的⾏数或列数). (11) [U,D]=eig(A): 计算⽅阵A的特征值和特征向量,得到两个⽅阵U和D,其中D的对⾓线元素为A的特征值,U的列向量为A的特征向量(可能是未normalize的结果),例如 (12) length(V): 求向量V的长度,即V的元素数量. (14) size(A): 若A是m⾏n列的矩阵,则返回⾏向量[m,n].。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Basic Matrix Operations一、实验目的1、掌握向量和矩阵的创建方法;2、掌握向量和矩阵元素的索引方法;3、掌握向量和矩阵的基本操作;4、利用MATLAB编写程序进行矩阵运算。
二、基础知识1、常见数学函数函数名数学计算功能函数名数学计算功能Abs(x) 实数的绝对值或复数的幅值floor(x) 对x朝-∞方向取整Acos(x) 反余弦arcsin x gcd(m,n)求正整数m和n的最大公约数acosh(x) 反双曲余弦arccosh x imag(x) 求复数x的虚部angle(x) 在四象限内求复数 x 的相角lcm(m,n) 求正整数m和n的最小公倍数asin(x) 反正弦arcsin x log(x) 自然对数(以e为底数)asinh(x) 反双曲正弦arcsinh x log10(x) 常用对数(以10为底数)atan(x) 反正切arctan x real(x) 求复数x的实部atan2(x,y) 在四象限内求反正切Rem(m,n) 求正整数m和n的m/n之余数atanh(x) 反双曲正切arctanh x round(x) 对x四舍五入到最接近的整数ceil(x) 对x朝+∞方向取整sign(x) 符号函数:求出x的符号conj(x) 求复数x的共轭复数sin(x) 正弦sin xcos(x) 余弦cos x sinh(x) 反双曲正弦sinh xcosh(x) 双曲余弦cosh x sqrt(x) 求实数x的平方根:xexp(x) 指数函数xe tan(x) 正切tan xfix(x) 对x朝原点方向取整tanh(x) 双曲正切tanh x2、常量与变量系统的变量命名规则:变量名区分字母大小写;变量名必须以字母打头,其后可以是任意字母,数字,或下划线的组合。
此外,系统内部预先定义了几个有特殊意义和用途的变量,见下表:特殊的变量、常量取值ans 用于结果的缺省变量名pi 圆周率π的近似值(3.1416)eps 数学中无穷小(epsilon)的近似值(2.2204e - 016)inf 无穷大,如 1/0 = inf (infinity)NaN 非数,如 0/0 = NaN (Not a Number),inf / inf = NaNi,j 虚数单位:i = j =1−数值型向量(矩阵)的输入①任何矩阵(向量),可以直接按行方式……输入每个元素:同一行中的元素用逗号(,)或者用空格符来分隔;行与行之间用分号(;)分隔。
所有元素处于一方括号([ ])内;例1:>> Time = [11 12 1 2 3 4 5 6 7 8 9 10]>> X_Data = [2.32 3.43;4.37 5.98]②系统中提供了多个命令用于输入特殊的矩阵:函数功能函数功能compan 伴随阵toeplitz Toeplitz矩阵diag 对角阵vander Vandermonde矩阵hadamard Hadamard矩阵zeros 元素全为0的矩阵hankel Hankel矩阵ones 元素全为1的矩阵invhilb Hilbert矩阵的逆阵 rand 元素服从均匀分布的随机矩阵kron Kronercker张量积randn 元素服从正态分布的随机矩阵magic 魔方矩阵eye 对角线上元素为1的矩阵pascal Pascal矩阵meshgrid 由两个向量生成的矩阵上面函数的具体用法,可以用帮助命令help得到。
如:meshgrid(x,y)输入 x=[1 2 3 4]; y=[1 0 5]; [X,Y]=meshgrid(x, y),则X = Y =1 2 3 4 1 1 1 11 2 3 4 0 0 0 01 2 3 4 5 5 5 5目的是将原始数据x,y转化为矩阵数据X,Y。
3、数组(矩阵)的点运算运算符:+(加)、-(减)、./(右除)、.\(左除)、.^(乘方),例3:>> g = [1 2 3 4];h = [4 3 2 1];>> s1 = g + h, s2 = g.*h, s3 = g.^h, s4 = g.^2, s5 = 2.^h4、矩阵的运算运算符:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)、’(转置)等;常用函数:det(行列式)、inv(逆矩阵)、rank(秩)、eig(特征值、特征向量)、rref(化矩阵为行最简形)例4:>> A= [2 0 –1; 1 3 2]; B= [1 7 –1; 4 2 3; 2 0 1];>> M = A*B % 矩阵A与B按矩阵运算相乘M =0 14 -317 13 10>> det_B = det(B) % 矩阵A的行列式det_B =20>> rank_A = rank(A) % 矩阵A的秩rank_A =2>> inv_B = inv(B) % 矩阵B的逆矩阵inv_B =0.1000 -0.3500 1.15000.1000 0.1500 -0.3500-0.2000 0.7000 -1.3000>> [V,D] = eig(B) % 矩阵B的特征值矩阵V与特征向量构成的矩阵D =7.2680 0 00 -1.6340 + 0.2861i 00 0 -1.6340 - 0.2861i>> X = A/B % A/B = A*B-1,即XB=A,求X0.4000 -1.4000 3.60000.0000 1.5000 -2.5000>> Y = B\A % B\A = B-1*A,即BY=A,求Y三、实验内容1、练习数据和符号的输入方式,将前面的命令在命令窗口中执行通过。
2、键入常数矩阵输入命令:a = [1 2 3] 与 a = [1;2;3]记录结果,比较显示结果有何不同;b = [1 2 5] 与 b = [1 2 5];记录结果,比较显示结果有何不同;a a’b b’记录结果,比较变量加“’”后的区别;c = a * b 1 2 52 4 103 6 15c = a* b’记录显示结果与出错原因;a = [1 2 3; 4 5 6; 7 8 0],求a^2a^0.5。
30 36 1566 81 4239 54 690.5977 + 0.7678i 0.7519 + 0.0979i 0.5200 - 0.4680i1.4102 + 0.1013i 1.7741 + 0.6326i 1.2271 - 0.7467i1.2757 - 1.0289i 1.6049 - 1.0272i 1.1100 + 1.6175i3、使用冒号选出指定元素:已知 A=[1 2 3;4 5 6;7 8 9],求 A 中第 3 列前 2 个元素,A 中所有列第 2,3 行的元素。
ns =36ns =4 5 67 8 04、输入 A=[7 1 5; 2 5 6; 3 1 5],B=[1 1 1; 2 2 2; 3 3 3],在命令窗口中执行下列表达式,掌握其含义:A(2,3)ans =6A(:,2)A(3,:) A(:,1:2:3)ans =7 52 63 5A(:,3).*B(:,2)ns =51215A(:,3)*B(2,:) A*B A.*B A^2 A.^2 B/A B./A5、建立M 文件,求123221343A⎛⎫⎪= ⎪⎪⎝⎭的逆矩阵。
nv_M =1.0000 3.0000 -2.0000 -1.5000 -3.0000 2.5000 1.0000 1.0000 -1.00006、设123221343A⎛⎫⎪= ⎪⎪⎝⎭,2153B⎛⎫= ⎪⎝⎭,132031C⎛⎫⎪= ⎪⎪⎝⎭,建立M文件,求矩阵X ,使满足:AXB = C。
四,详细设计(1)存储要点position[col]=position[col-1]+num[col-1];三元组表(row,col,v)稀疏矩阵((行数m,列数n,非零元素个数t),三元组,...,三元组)row col vA->data[0] 0 4 81 1 0 12 1 2 33 2 1 24 3 0 6………max-1(2)乘法运算要点已知稀疏矩阵A(m1× n1)和B(m2× n2),求乘积C(m1× n2)。
稀疏矩阵A、B、C及它们对应的三元组表A.data、B.data、C.data如图6所示。
由矩阵乘法规则知:C(i,j)=A(i,1)×B(1,j)+A(i,2)×B(2,j)+…+A(i,n)×B(n,j)=这就是说只有A(i,k)与B(k,p)(即A元素的列与B元素的行相等的两项)才有相乘的机会,且当两项都不为零时,乘积中的这一项才不为零。
矩阵用二维数组表示时,a11只有可能和B中第1行的非零元素相乘,a12只有可能和B中第2行的非零元素相乘,…,而同一行的非零元是相邻存放的,所以求c11和c12同时进行:求a11*b11累加到c11,求a11*b12累加到c12,再求a12*b21累加到c11,再求a12*b22累加到c22.,…,当然只有aik和bkj(列号与行号相等)且均不为零(三元组存在)时才相乘,并且累加到cij当中去。
(3)稀疏矩阵的快速转置要点:矩阵A中三元组的存放顺序是先行后列,对同一行来说,必定先遇到列号小的元素,这样只需扫描一遍A.data 。
所以需引入两个向量来实现:num[n+1]和position [n+1],num[col]表示矩阵A中第col列的非零元素的个数(为了方便均从1单元用起),position [col]初始值表示矩阵A中的第col列的第一个非零元素在B.data中的位置。
于是position的初始值为:position [1]=1;position [col]= position [col-1]+num[col-1]; 2≤col≤n依次扫描A.data,当扫描到一个col列元素时,直接将其存放在B.data的position [col]位置上,position [col]加1,position [col]中始终是下一个col列元素在B.data中的位置。
A->row[0] 01 12 33 4(4)逆矩阵⒈判断矩阵是否为方阵⒉逆矩阵的算法:①求行列式的值②求矩阵的伴随矩阵③用伴随矩阵除以行列式⒊求逆矩阵的流程:五、源程序(测试结果)#include<iostream>#include<string>#include<iomanip>#include<cmath>using namespace std;#define max 100#define datatype int typedef struct{int row,col;//行,列datatype v;//非0数值}Node;typedef struct{Node data[max];//稀疏矩阵int m,n,t;//m行,n列,t非0数个数}Matrix;/*求逆矩阵存储*/typedef struct{ //存储结构int m, n; //行、列数double *p; //矩阵基址}nMatrix;void In(nMatrix a){ //求逆输入cout<<"请将矩阵a的行、列数再次输入:";cin >>a.m>>a.n;int m = a.m, n = a.n;int i, j;double *p = a.p = new double[m * n]; //p是行指针cout<<"请按行优先输入矩阵a的全部数值:\n";for (i = 0; i < m; p += n, i++){for (j = 0; j < n; j++)cin>>p[j]; //即a.p[i*n+j]}}void Out(nMatrix a){ //求逆输出int m = a.m, n = a.n;int i, j;double *p = a.p;for (i = 0; i < m; p += n, i++){for (j = 0; j < n; j++)cout<<p[j]<<'\t';cout<<endl;}}istream& operator >>(istream& input,Matrix &A){ int i;cout<<"请输入行数:";input>>A.m;cout<<"请输入列数:";input>>A.n;cout<<"请输入非0值个数:";input>>A.t;for(i=1;i<=A.t;i++){cout<<"请输入行数,列数,非0值:"<<"("<<i<<")\n";input>>A.data[i].row>>A.data[i].col>>A.data[i].v;}return input;}ostream& operator <<(ostream& output,Matrix &A){int i,j,t=1,k=0;for(i=1;i<=A.m;i++){for(j=1;j<=A.n;j++){if(A.data[t].row==i&&A.data[t].col==j){output<<A.data[t].v<<'\t';t++;}elseoutput<<k<<'\t';}cout<<"\n";}return output;}Matrix operator +(Matrix A,Matrix B){//加法int i,j,k;Matrix C;if(A.m!=B.m||A.n!=B.n){cout<<"这两个矩阵不能相加"<<endl;exit(0);}C.m=A.m;C.n=A.n;C.t=0;if(A.t==0&&B.t==0) exit(0);i=j=k=1;while(i<=A.t&&j<=B.t){if(A.data[i].row<B.data[j].row){C.data[k]=A.data[i];i++;k++;}else{if(A.data[i].row>B.data[j].row){C.data[k]=B.data[j];j++;k++;}else{if(A.data[i].col<B.data[j].col){C.data[k]=A.data[i];i++;k++;}else{if(A.data[i].col>B.data[j].col){C.data[k]=B.data[j];j++;k++;}else{if(A.data[i].v+B.data[j].v!=0){C.data[k].row=A.data[i].row;C.data[k].col=A.data[i].col;C.data[k].v=A.data[i].v+B.data[j].v;k++;}i++;j++;}}}}}while(i<A.t){C.data[k]=A.data[i];i++;k++;}while(j<B.t){C.data[k]=B.data[j];j++;k++;}C.t=k;return C;}Matrix operator -(Matrix A,Matrix B){ Matrix C;int i,j,k;if(A.m!=B.m||A.n!=B.n){cout<<"这两个矩阵不能相减";exit(0);} C.m=A.m;C.n=A.n;C.t=0;if(A.t==0&&B.t==0) exit(0);i=j=k=1;while(i<=A.t&&j<=B.t){ if(A.data[i].row<B.data[j].row){ C.data[k]=A.data[i];i++;k++;}else{ if(A.data[i].row>B.data[j].row){ C.data[k]=B.data[j];j++;k++;}else{ if(A.data[i].col<B.data[j].col) { C.data[k]=A.data[i];i++;k++;}else{ if(A.data[i].col>B.data[j].col) { C.data[k]=B.data[j];j++;k++;}else{ if(A.data[i].v-B.data[j].v!=0){ C.data[k].row=A.data[i].row;C.data[k].col=A.data[i].col;C.data[k].v=A.data[i].v-B.data[j].v;k++;}i++;j++;}}}}}while(i<A.t){ C.data[k]=A.data[i];i++;k++;}while(j<B.t){ C.data[k]=B.data[j];j++;k++;}C.t=k;return C;}Matrix operator *(Matrix A,Matrix B){Matrix C;int k,p,crow,brow,q,ccol;int num[max],pos[max],ctemp[max];if (A.n==B.m){for(k=1;k<=B.m;k++)num[k]=0;for(k=1;k<=B.t;k++)num[B.data[k].row]++;pos[1]=1;for(k=2;k<=B.t;k++)pos[k]=pos[k-1]+num[k-1];pos[1+B.t]=pos[B.t]+1;C.m=A.m; C.n=B.n; C.t=0; p=1;while(p<=A.t){crow=A.data[p].row;for(k=1;k<=C.n;k++)ctemp[k]=0;while (p<=A.t&&A.data[p].row==crow){brow=A.data[p].col;for(q=pos[brow];q<=pos[brow+1]-1;q++){ccol=B.data[q].col;ctemp[ccol]=ctemp[ccol]+A.data[p].v*B.data[q].v;}p=p+1;}for(ccol=1;ccol<=B.n;ccol++)if(ctemp[ccol]!=0){C.t=C.t+1;C.data[C.t].row=crow;C.data[C.t].col=ccol;C.data[C.t].v=ctemp[ccol];}}}elsecout<<"这两个矩阵不能相乘";return C;}Matrix operator ~(Matrix A){Matrix B;int col,i,p,q;int num[max],position[max];B.t=A.t;B.m=A.n; B.n=A.m;if(B.t){for(col=1;col<=A.n;col++)num[col]=0;for(i=1;i<=A.t;i++)num[A.data[i].col]++;position[1]=1;for(col=2;col<=A.n;col++)position[col]=position[col-1]+num[col-1];for(p=1;p<=A.t;p++){col=A.data[p].col;q=position[col];B.data[q].row=A.data[p].col;B.data[q].col=A.data[p].row;B.data[q].v=A.data[p].v;position[col]++;}}return B;}nMatrix Trs(nMatrix a){ //求逆矩阵的先转置nMatrix trs;trs.m = a.n;trs.n = a.m;trs.p = new double[a.m * a.n];for (int i = 0; i < a.m; i++){for (int j = 0; j < a.n; j++){trs.p[j * a.m + i] = a.p[i * a.n + j];}}return trs;}nMatrix Adjunct(nMatrix a, int indexm, int indexn){ //求第indexm行indexn列元素的代数余子式nMatrix adj;adj.m=a.m - 1;adj.n=a.n - 1;adj.p = new double[(a.n - 1) * (a.n - 1)];for (int i = 0; i < indexm; i++){for (int j = 0; j < indexn; j++){adj.p[i * (a.n - 1) + j] = a.p[i * a.n + j];}for (int k = indexn + 1; k < a.n; k++){adj.p[i *(a.n - 1) + k -1] = a.p[i * a.n + k];}}for (int m = indexm + 1; m < a.n; m++){for (int j = 0; j < a.n - 1; j++){adj.p[(m - 1) * (a.n - 1) + j] = a.p[m * a.n + j];}for (int k = indexn + 1; k < a.n; k++){adj.p[(m - 1) * (a.n - 1) + k - 1] = a.p[m * a.n + k];}}return adj;}double Det(nMatrix a) //递归求行列式{double det = 0;if (a.m != a.n){cout<<"不是方阵,没有行列式!"<<endl;cout<<"求行列式退出"<<endl;}if (a.n == 1){det = a.p[0];return det;}else{for (int i = 0; i < a.n; i++){if (i % 2 == 0)det += a.p[i * a.n] * Det(Adjunct(a, i, 0));elsedet -= a.p[i * a.n] * Det(Adjunct(a, i, 0));}}return det;}nMatrix operator !(nMatrix a) { //求矩阵的逆nMatrix temp;temp.m=a.n;temp.n=a.m;temp.p = new double[a.m * a.n];//矩阵的逆 = 伴随矩阵 / 行列式double det = Det(a);if (det == 0) //如果行列式的值为0,则没有逆{cout<<"此矩阵没有逆!"<<endl;cout<<"求矩阵逆退出!"<<endl;}for (int i = 0; i < temp.m; i++){for (int j = 0; j < temp.n; j++){if ((i +j) % 2 == 0)temp.p[i * temp.m + j] = Det(Adjunct(a, i, j)) / det;elsetemp.p[i * temp.m + j] = -Det(Adjunct(a, i, j)) / det;}}return Trs(temp);}void main(){Matrix C={0},A={0},B={0};nMatrix a={0}, b={0},temp={0};cin>>A; cout<<"a=\n"<<A;cin>>B; cout<<"b=\n"<<B;C=A+B;cout<<"a+b=\n"<<C;C=A-B;cout<<"a-b=\n"<<C;C=A*B;cout<<"a*b=\n"<<C;C=~A;cout<<"~a=\n"<<C;In(a);cout<<"矩阵的行列式为:"<<endl;cout<<Det(a)<<endl;cout<<"矩阵的逆为:"<<endl;temp=!a;cout<<"!a=\n"<<Trs<<endl;六、总结这次数据结构课程设计的制作使我对matlab的理解更加深刻,也使我认识到了自己很多不足之处。