数学建模-Matlab学习笔记(五)
本文最后更新于:December 3, 2021 pm
MATLAB(矩阵实验室)是第四代高层次的编程语言和交互式环境数值计算,可视化和编程。由美国MathWorks公司开发的一种编程语言。用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。拥有众多的内置命令和数学函数,可以帮助您在数学计算,绘图和执行数值计算方法。
目录
1.运算符
1.1 算术运算符
允许两种不同类型的算术运算:矩阵算术运算、阵列算术运算。
矩阵的算术运算与线性代数中的定义相同。矩阵运算符和数组运算符是有区别的。然而,由于加法和减法运算矩阵和阵列是相同的,操作这两种情况下是相同的。
运算符 | 描述 |
---|---|
+ | 加法或一元加号。A + B将A和B。 A和B必须具有相同的尺寸,除非一个人是一个标量。一个标量,可以被添加到任何大小的矩阵。 |
- | 减法或一元减号。A - B,减去B从A和B必须具有相同的大小,除非是一个标量。可以从任意大小的矩阵中减去一个标量。 |
***** | 矩阵乘法;是一个更精确的矩阵A和B的线性代数积,矩阵乘法对于非纯量A和B,列一个数必须等于B.标量可以乘以一个任意大小的矩阵的行数。 |
.* | 数组的乘法;A.*B是数组A和B的元素积,A和B必须具有相同的大小,除非A、B中有一个是标量。 |
/ | 斜线或矩阵右除法;B/A与B * inv(A)大致相同。更确切地说: B/A = (A’B’)’ |
./ | 矩阵右除法;矩阵A与矩阵B相应元素相除(A、B为同纬度的矩阵) |
**.\** | 反斜杠或矩阵左除;如果A是一个方阵,AB是大致相同的INV(A)* B,除非它是以不同的方式计算。如果A是一个n*n的矩阵,B是一个n组成的列向量,或是由若干这样的列的矩阵,则X = AB 是方程 AX = B ,如果A严重缩小或者几乎为单数,则显示警告消息。 |
. | 数组左除法;A. B是元素B(i,j)/A(i,j)的矩阵。A和B必须具有相同的大小,除非其中一个是标量。 |
^ | 矩阵的幂。X^P是X到幂P,如果p是标量;如果p是一个整数,则通过重复平方计算功率。如果整数为负数,X首先反转。对P值的计算,涉及到特征值和特征向量,即如果[ D ] = V,EIG(x),那么X^P = V * D.^P / V。 |
.^ | A.^B:A的每个元素的B次幂(A、B为同纬度的矩阵) |
‘ | 矩阵的转置;A’是复数矩阵A的线性代数转置,这是复共轭转置。 |
.’ | 数组的转置;A’是数组A的转置,对于复数矩阵,这不涉及共轭。 |
1.1.1 算术运算函数
函数 | 描述 |
---|---|
uplus(a) |
一元加号;增加量a |
plus (a,b) |
相加;返回 a + b |
uminus(a) |
一元减号;减少a |
minus(a, b) |
相减;返回 a - b |
times(a, b) |
数组相乘;返回 a.*b |
mtimes(a, b) |
矩阵相乘;返回 a* b |
rdivide(a, b) |
右阵划分;返回 a ./ b |
ldivide(a, b) |
左阵划分;返回 a. b |
mrdivide(A, B) |
求解线性方程组xA = B for x |
mldivide(A, B) |
求解线性方程组xA = B for x |
power(a, b) |
数组求幂;返回 a.^b |
mpower(a, b) |
矩阵求幂;返回 a ^ b |
cumprod(A) |
累积乘积;返回与包含累积乘积的数组A相同大小的数组。如果A是向量,则cumprod(A)返回一个包含A的元素的累积乘积的向量。如果A是矩阵,则cumprod(A)返回一个矩阵,其中包含A的每一列的累积乘积。如果A是一个多维数组,那么cumprod(A)将沿着第一个非正整数维。 |
cumprod(A, dim) |
沿维 dim 返回返回累积乘积。 |
cumsum(A) |
累加总和;返回包含累积和的数组A如果A是向量,则cumsum(A)返回一个包含A的元素的累积和的向量。如果A是矩阵,则cumsum(A)返回一个矩阵,其中包含A的每列的累积和。如果A是一个多维数组,那么cumsum(A)将沿着第一个非整数维度起作用。 |
cumsum(A, dim) |
返回沿着dim的元素的累积和。 |
diff(X) |
差分和近似导数;计算x相邻元素之间的差异。如果X是向量,则diff(X)返回相邻元素之间的差异的向量,比X短一个元素:[X(2)-X(1)X(3)-X(2)… X(N)-X(N-1)]如果X是一个矩阵,则diff(X)返回行差的矩阵:[X(2:m,…)-X(1:m-1,:)] |
diff(X,n) |
递归应用n次,导致第n个差异。 |
diff(X,n,dim) |
它是沿标量dim指定的维数计算的第n个差分函数。 如果order n等于或超过Dim的长度,diff将返回一个空数组。 |
prod(A) |
数组元素的乘积;返回A数组元素的乘积。如果A是向量,则prod(A)返回元素的乘积。如果A是非空矩阵,则prod(A)将A的列作为向量,并返回每列乘积的行向量。如果A是一个空的0-by-0矩阵,则prod(A)返回1。如果A是一个多维数组,那么prod(A)将沿着第一个非子集维度行为并返回一个乘积数组。 该维数的尺寸减小到1,而所有其他维数的尺寸保持不变。如果输入A为单个,则prod函数计算并返回B为单个;对于所有其他数字和逻辑数据类型,prod函数计算并返回B为double。 |
prod(A,dim) |
沿dim维度返回乘积。 例如,如果A是矩阵,则prod(A,2)是包含每一行的乘积的列向量。 |
prod(__,datatype) |
在数据类型指定的类中乘以并返回一个数组。 |
sum(A) |
数组元素的总和;返回数组的不同维度的和。如果A是浮动的,那么是双倍或单个,B是本地累加的,它与A相同,B与A具有相同的类。如果A不是浮动的,则B被累加为双,B具有类double。如果A是向量,则sum(A)返回元素的总和。如果A是矩阵,则sum(A)将A的列作为向量,返回每列的和的行向量。如果A是一个多维数组,sum(A)将沿着第一个非单例维度的值作为向量来处理,返回一个行向量的数组。 |
sum(A,dim) |
沿标量A的维度求和。 |
sum(..., 'double')sum(..., dim,'double') |
执行双精度加法,并返回double类型的答案,即使A具有数据类型单一或整型数据类型。这是整型数据类型的默认值。 |
sum(..., 'native')sum(..., dim,'native') |
在本机数据类型A中执行添加,并返回相同数据类型的答案。 这是单和双的默认值。 |
ceil(A) |
向正无穷方向舍入;将a元素舍入为大于或等于A的最近整数。 |
fix(A) |
舍入为零 |
floor(A) |
向负无穷方向舍入;将a元素舍入为小于或等于a的最近整数。 |
idivide(a, b)idivide(a, b,'fix') |
整数除法的舍入选项;与A./B相同,只是分数的商向零舍入到最接近的整数。 |
idivide(a, b, 'round') |
分数的商舍入到最近的整数。 |
idivide(A, B, 'floor') |
分数商向负无穷大舍入到最接近的整数。 |
idivide(A, B, 'ceil') |
分数商向无穷大舍入到最接近的整数。 |
mod (X,Y) |
除法后的模数;返回X - n.* Y,其中 n = floor(X./Y)。 如果Y不是整数,并且商X / Y在整数的舍入误差内,则n是整数。 输入X和Y必须是相同大小的真实数组或实数标量(提供Y〜= 0)。请注意:mod(X,0) 是 Xmod(X,X) 是 0对于 X = Y 和 Y = 0的 mod(X,Y)具有与Y相同的符号。 |
rem (X,Y) |
除法之后的余数;返回X - n.* Y,其中n = fix(X./Y)。 如果Y不是整数,并且商X / Y在整数的舍入误差内,则n是整数。 输入X和Y必须是相同大小的真实数组或实数标量(提供Y〜= 0)。请记住:rem(X,0) 是 NaNX〜= 0的rem(X,X)为0对于 X |
round(X) |
舍入到最接近的整数; 将X的元素舍入到最接近的整数。 正数元素的小数部分为0.5,最大到最接近的正整数。 负数元素的小数部分为-0.5,向下舍入到最接近的负整数。 |
1.1.2 基本算术运算
包括:加(+)、减(-)、乘(*)、右除(/)、左除(\)、乘方(^)。
- 加减运算
- 若两个矩阵同型,则运算时两矩阵的对应元素相加减。若不同型,则会报错。
- 一个标量也可以和矩阵进行加减运算,这时把标量和矩阵的每一个元素进行加减运算。
- 乘法运算
- 矩阵A和B进行乘法运算,要求A的列数与B的行数相等,此时称A、B矩阵是可乘的,或称A和B两矩阵维数和大小相容。如果两者的维数或大小不相容,则会提示错误。
一个矩阵的乘方运算可以表示成 A^x
,要求 A 为方阵,x 为标量。如:
1 |
|
- 除法运算
- 如果A矩阵是非奇异方阵,则
B/A
等效于B*inv(A)
,A\B
等效于inv(a)*B
。其中inv(A)
表示A的逆。
对于矩阵来说,右除和左除表示两种不同的除数矩阵
和被除数矩阵
关系。即两个矩阵做运算时,右除和左除的结果不同;一个矩阵和一个数做运算时,结果相同;两个数做运算时,结果相同。
- 点运算
点运算符包括:.*
、./
、.\
、.^
。
两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵同型。
1.2 逻辑运算符
逻辑运算都是针对元素的操作,运算结果是特殊的逻辑数组;在逻辑分析时,逻辑(真)用1表示,逻辑假用0表示,逻辑运算中所有的非零元素作为1处理。
包括:与(&)
、或(|)
、非(~)
。
- 参与逻辑运算的是两个标量a和b。
a&b
:a、b全为非零时,运算结果为1,否则为0。a|b
:a、b中只要有一个非零时,运算结果为1。~a
:当a为零时,运算结果为1;当a为非零时,运算结果为0。
- 若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由1或0组成。
- 若参与逻辑运算的一个是标量,一个是矩阵,那么将在标量与矩阵中的每个元素之间按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由1或0组成。
1.3 关系运算符
包括:小于(<)
、小于或等于(<=)
、大于(>)
、大于或等于(>=)
、等于(==)
、不等于(~=)
。
- 当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,元素由 0 或 1 组成。
- 当参与比较的一个是标量,而另外一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运行运算规则逐个比较,最终的关系运算的结果是一个与原矩阵同型的矩阵,元素由 0 或 1 组成。
2.字符串
2.1 字符串的访问
1 |
|
2.2 字符串的表示
字符串包含在单引号中,若字符串中的字符含有单引号,则该单引号字符要用两个单引号来表示。
1 |
|
2.3 字符串矩阵
1 |
|
2.4 字符串执行
eval(S)
将字符串中的内容作为 matlab 命令来执行。
1 |
|
2.5 字符串与数值之间的转换
abs
和double
函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。char
函数可以把ASCII码矩阵转换为字符串矩阵。
2.6 字符串的比较
有两种方法:利用关系运算符或字符串比较函数。
关系运算符比较:两个字符串里的每个字符依次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0.
字符串比较函数
①strcmp(s1,s2)
:用来比较字符串s1和s2是否相等,如果相等,返回结果为1,否则返回0。
②strncmp(s1,s2,n)
:用来比较两个字符串前 n 个字符是否相等,如果相等,返回1,否则返回0。
③strcmpi(s1,s2)
:在忽略字母大小写前提下,比较字符串s1和s2是否相等,如果相等,返回1,否则返回0。
④strncmpi(s1,s2,n)
:在忽略字符串大小写前提下,比较两个字符串前 n 个字符是否相等,如果相等,返回1,否则返回0。
2.7 字符串的查找与替换
findstr(s1,s2)
:返回短字符串在长字符串中的开始位置。两个串的位置任意。strrep(s1,s2,s3)
:将字符串s1中的所有子字符串s2替换为字符串s3。
3.矩阵处理
3.1 特殊矩阵
分为通用性的特殊矩阵、用于专门学科的特殊矩阵。
3.1.1 通用的特殊矩阵
3.1.1.1 zeros函数
zeros函数
:产生全 0 矩阵,即零矩阵。
调用格式:
zeros(m)
:产生 m * m 零矩阵。
zeros(m,n)
:产生 m * n 零矩阵。
zeros(size(A))
:产生与矩阵A同样大小的零矩阵,返回的是矩阵。
1 |
|
3.1.1.2 ones函数
ones函数
:产生全 1 矩阵,即幺矩阵。
1 |
|
3.1.1.3 eye函数
eye函数
:产生对角线为 1 的矩阵。当矩阵是方阵时,得到一个单位矩阵。
1 |
|
3.1.1.4 rand函数
rand函数
:产生(0,1)区间均匀分布的随机矩阵。fix(a+(b-a+1)*x)
:产生 [a,b] 区间上均匀分布的随机整数。
1 |
|
[10,99]:
1 |
|
3.1.1.5 randn函数
randn函数
:产生均值为 0 ,方差为 1 的标准正态分布随机矩阵。
u + σx :得到均值为 u 、方差为 σ2 的随机数。
1 |
|
1 |
|
3.1.2 专门学科的特殊矩阵
3.1.2.1 魔方矩阵
n 阶魔方阵由 1,2,3·····,n2共 n2 个整数组成,且每行、每列以及主、副对角线上各 n 个元素之和都相等。
n 阶魔方阵每行每列元素的和为 (1+2+3+···+n2)/ n = (n+n3)/2。
如图:
magic函数
:
1 |
|
3.1.2.2 范德蒙矩阵
vander(v)函数
生成以向量 v 为基础的范德蒙矩阵。
如图:
1 |
|
3.1.2.3 希尔伯特矩阵
hlib(n)函数
如图:
由图可知:希尔伯特矩阵的元素为 H(i,j)=1/(i+j+1) 。
1 |
|
3.1.2.4 伴随矩阵
compan(p)函数
:,其中 p 是一个多项式的系数向量,高次幂系数排在前,低次幂系数排在后。
如图:
示例:生成多项式 x3 - 2x2 - 5x+6 的伴随矩阵。
1 |
|
3.1.2.5 帕斯卡矩阵
pascal(n)函数
:生成一个 n 阶帕斯卡矩阵。
帕斯卡矩阵的第一行元素和第一列元素都为 1 ,其余位置的元素是该元素的左边元素与上面元素相加,即 p(i,j)=p(i,j-1)+p(i-1,j)
,且 p(i,1)=1,p(1,j)=1。
1 |
|
3.2 矩阵变换
3.2.1 对角阵
- 对角矩阵:只有对角线上有非零元素的矩阵。
- 数量矩阵:对角线上的元素相等的对角矩阵。
- 单位矩阵:对角线上的元素都为 1 的对角矩阵。
3.2.1.1 提取矩阵的对角线元素
- diag(a):提取矩阵 a 主对角线元素,产生一个列向量。
- diag(a,k):提取矩阵 a 第 k 条对角线的元素,产生一个列向量。主对角线为第 0 条对角线,向上走为第 1 条、···、第 n 条对角线;向下走为 第 -1 条、····、第 -n 条对角线。
示例:
1 |
|
3.2.1.2 构造对角矩阵
- diag(v):以向量 v 为主对角线元素,产生对角矩阵。
- diag(v,k):以向量 v 为第 k 条对角线元素,产生对角矩阵。
示例1:
1 |
|
示例2:
1 |
|
3.2.2 三角阵
3.2.2.1 上三角阵
矩阵的对角线以下的元素全为零的矩阵。
triu(a)
:提取矩阵 a 的主对角线及以上的元素。
triu(a,k)
:提取矩阵 a 的第 k 条对角线及以上的元素。
示例:
1 |
|
3.2.2.2 下三角阵
对角线以上的元素全为零的矩阵。提取矩阵 a 的下三角矩阵的函数是tril
,用法与 triu函数
完全相同。
3.2.3 矩阵的转置
转置运算符是小数点后面接单引号
.'
。共轭转置,其运算符的单引号
'
,它在转置的基础上还要取每个数的复共轭。如果是实数则一样。
示例:复数
1 |
|
示例:实数
1 |
|
3.2.4 矩阵的旋转
rot90(a,k)
:将矩阵 a 逆时针方向旋转 90°的 k 倍,当 k 为 1 时可省略。
示例:
1 |
|
3.2.5 矩阵的翻转
fliplr(a)
:对矩阵 a 实施左右翻转。
flipud(a)
:对矩阵 a 实施上下翻转。
示例:
1 |
|
3.2.6 矩阵求逆
inv(a)
:求方阵 a 的逆矩阵。
3.3 矩阵求值
3.3.1 矩阵的行列式值
det(a)
:求方阵 a 所对应的行列式的值。
示例:
1 |
|
3.3.2 矩阵的秩
矩阵线性无关的行数或列数称为矩阵的秩。rank(a)
:求矩阵 a 的秩。
示例:
1 |
|
3.3.3 矩阵的迹
矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。trace(a)
:求矩阵 a 的迹。
示例:
1 |
|
3.3.4 向量和矩阵的范数
矩阵或向量的范数用来度量矩阵或向量在某种意义下的长度。
3.3.4.1 向量的 3 种常用范数
- 向量1-范数:向量元素的绝对值之和。
norm(v,1)
:计算向量 v 的1-范数。
- 向量2-范数:向量元素平方和的平方根。
norm(v)或norm(v,2)
:计算向量 v 的 2-范数。
- 向量∞-范数:所有向量元素绝对值中的最大值。
norm(v,inf)
:计算向量 v 的 ∞-范数。
3.3.4.2 矩阵的范数
- 矩阵 a 的 1-范数:矩阵列元素绝对值之和的最大值。
- 矩阵 a 的 2-范数:a’a 矩阵的最大特征值的平方根。
- 矩阵 a 的 ∞-范数:所有矩阵行元素绝对值之和的最大值。
矩阵求3种范数的函数与向量的函数完全相同。
3.3.5 矩阵的条件数
矩阵 a 的条件数等于 a 的范数与 a 的逆矩阵的范数的乘积。
条件数是大于1的,越接近于1,矩阵的性能越好,反之,矩阵的性能越差。
cond(a,1)
:计算 a 的 1-范数下的条件数。
cond(a)或cond(a,2)
:计算 a 的 2-范数下的条件数。
cond(a,inf)
:计算 a 的 ∞-范数下的条件数。
3.4 矩阵的特征值与特征向量
E=eig(a)
:求矩阵 a 的全部特征值,构成向量 E 。
[X,D]=eig(a)
:求矩阵 a 的全部特征值,构成对角阵 D ,并产生矩阵 X,X 各列是相应的特征向量。
Matlab 提供了一个 eigshow函数
,可以演示单位圆上的向量 X 和 Ax 之间的关系。
3.5 稀疏矩阵
矩阵有两种存储方式:完全存储方式、稀疏存储方式。
稀疏存储方式只存储矩阵的非零元素的值及其位置,即行号和列号。但采用稀疏存储方式时,矩阵元素的存储顺序并没有改变,也是按列的顺序进行存储。
示例:
1 |
|
a 矩阵的稀疏存储方式为:
1 |
|
3.5.1 完全存储方式与稀疏存储方式之间的转化
A=sparse(s)
:将矩阵 S 转化为稀疏存储方式的矩阵 A 。S=full(a)
:将矩阵 a 转化为完全存储方式的矩阵 S 。
3.5.2 直接建立稀疏存储矩阵
sparse(m,n)
:生成一个 m * n 的所有元素都是零的稀疏矩阵。sparse(u,v,s)
:其中 u、v、s 是 3 个等长的向量。s 是要建立的稀疏存储矩阵的非零元素,u(i)、v(i)分别是 s(i) 的行和列下标。
使用 spconvert函数
直接建立稀疏存储矩阵,其调用格式为:B = spconvert(A)
A 为一个 m * 3 或者 m * 4 的矩阵,其每行表示一个非零元素,m 是非零元素的个数。
A()
:第 i 个非零元素所在的行。A()
:第 i 个非零元素所在的列。A()
:第 i 个非零元素值的实部。A()
:第 i 个非零元素值的虚部。
若矩阵的全部元素都是实数,则无须第 4 列。
3.5.3 带状稀疏矩阵的稀疏存储
稀疏矩阵有两种基本类型:无规则结构的稀疏矩阵与有规则结构的稀疏矩阵。
带状稀疏矩阵是指所有非零元素集中在对角线上的矩阵。
[B,d]=spdiags(A)
:从带状稀疏矩阵 A 中提取全部非零对角线元素赋给矩阵 B 及其这些非零对角线的位置向量 d 。A=spdiags(B,d,m,n)
:产生带状稀疏矩阵的稀疏存储矩阵 A ,其中m、n 为原带状稀疏矩阵的行数与列数,矩阵 B 的第 i 列即为原带状稀疏矩阵的第 i 条非零对角线,向量 d 为原带状稀疏矩阵所有非零对角线的位置。
3.5.4 单位矩阵的稀疏存储
speye(m,n)
:返回一个 m * n 的稀疏存储单位矩阵。
示例:
1 |
|
本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/2403181932.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!