第二章 MATLAB基础
2.1 基本概念
2.1.1 MATLAB数据类型概述
MATLAB属于弱类型语言
,其变量不需要提前定义类型
❗️图中应补充逻辑型
2.1.2 整数类型
整数类型 | 数值范围 | 转换函数 |
---|---|---|
有符号8位整数 | int8 | |
无符号8位整数 | 0~ 2 8 − 1 2^8-1 28−1 | uint8 |
有符号16位整数 | − 2 15 -2^{15} −215~ 2 15 − 1 2^{15}-1 215−1 | int 16 |
无符号16位整数 | 0~ 2 16 − 1 2^{16}-1 216−1 | uint16 |
有符号32位整数 | − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1 | int32 |
无符号32位整数 | 0~ 2 32 − 1 2^{32}-1 232−1 | uint32 |
有符号64位整数 | − 2 63 -2^{63} −263~ 2 63 − 1 2^{63}-1 263−1 | int64 |
无符号64位整数 | 0~ 2 64 − 1 2^{64}-1 264−1 | uint 64 |
❗️ MATLAB中数值的默认存储类型时双精度浮点型,必须通过表中转换函数才能将双精度浮点型数值转换位指定的整数数值,MATLAB转换小数时,遵守四舍五入原则(向最接近的整数取整),当小数等于0.5时,按绝对值最大的方向取整整数,比如0.5取整就是1,-0.5取整就是-1
>> x = 0.5; y=0.49; z = -0.5;
>> xx = int16(x)
xx =
int16
1
>> yy = int32(y)
yy =
int32
0
>> zz = int32(z)
zz =
int32
-1
MATLAB中还有多种取整策略函数
函数 | 说明 | 举例 |
---|---|---|
round(a) | 向最接近的整数取整 小数部分是0.5时向绝对值大的方向取整 | round(4.3) = 4 round(4.5) = 5 round(-4.5) = -5 |
fix(a) | 向0方向取整 | fix(4.3) = 4 fix(-4.9) = 4 |
floor(a) | 向不大于a的方向取整 | floor(4.3) = 4 floor(-4.3) = -5 |
ceil(a) | 向不小于a的方向取整 | ceil(4.3) = 5 ceil(-4.9) = -4 |
❗️ 在MATLAB中,整数与双精度浮点数,字符型运算的结果都是整数,且只有整数只能与相同类的整数或标量双精度值组合使用。
>> x = uint32(367.2) * uint32(20.3)
x =
uint32
7340
>> y = uint32(24.321) * 359.63
y =
uint32
8631
>> z = uint32(24.321) * uint16(359.63)
错误使用 *
整数只能与相同类的整数或标量双精度值组合使用。
>> whos
Name Size Bytes Class Attributes
x 1x1 4 uint32
y 1x1 4 uint32
2.1.3 浮点数类型
浮点 类型 | 存储 位宽 | 各数据位用处 | 数值范围 | 转换 函数 |
---|---|---|---|---|
双精度 | 64 | 0~51位表示小数部 52~62表示指数部分 63位表示符号(0正,1负) | -1.79769e+308~2.22507e-308 2.22507e-308~1.7969e+308 | double |
单精度 | 32 | 0~22位表示小数部分 23~30表示指数部分 31位表示符号(0正,1负) | -3.40282e+038~-1.17549e-038 1.17549e-038~3.40282e+038 | single |
❗️单精度浮点数不能和整数型进行算术运算,双精度型与逻辑型、字符型进行运算时都返回双精度型;单精度与逻辑性字符型,和双精度运算时都返回单精度型
2.1.4 复数
MATLAB中默认用字符i或j作为虚部标识,创建复数可以直接输入,或者使用complex函数
函数 | 说明 |
---|---|
real(z) | 返回复数z的实部 |
imag(z) | 返回复数z的虚部 |
abs(z) | 返回复数z的幅度 |
angle(z) | 返回复数z的幅角 |
conj(z) | 返回复数z的共轭复数 |
complex(a,b) | 以a为实部,b为虚部创建复数 |
>> a = 2 + 3i
a =
2.0000 + 3.0000i
>> x = rand(3) * 5
x =
4.0736 4.5669 1.3925
4.5290 3.1618 2.7344
0.6349 0.4877 4.7875
>> y = rand(3) * -8
y =
-7.7191 -7.6573 -1.1351
-1.2609 -3.8830 -3.3741
-7.7647 -6.4022 -7.3259
>> z = complex(x,y)
z =
4.0736 - 7.7191i 4.5669 - 7.6573i 1.3925 - 1.1351i
4.5290 - 1.2609i 3.1618 - 3.8830i 2.7344 - 3.3741i
0.6349 - 7.7647i 0.4877 - 6.4022i 4.7875 - 7.3259i
>> whos
Name Size Bytes Class Attributes
a 1x1 16 double complex
x 3x3 72 double
y 3x3 72 double
z 3x3 144 double complex
2.1.5 无穷量(Inf)和非数值量(NaN)
Inf
正无穷
-Inf
负无穷
NaN
非数值的值 一般源自0/0或Inf/Inf型的非正常运算
Inf :既可以通过直接输入Inf来创建无穷量,也可以通过Inf()这种函数形式创建无穷量,-Inf同理
NaN:与Inf相同
>> x = 1/0
x =
Inf
>> y = -1/0
y =
-Inf
>> z = log(0)
z =
-Inf
>> r = 0/0
r =
NaN
>> p = Inf/-Inf
p =
NaN
❗️NaN非数值量直接不相等!即NaN ~= NaN
2.1.6 数值类型的显示格式
默认情况下,MATLAB使用5位定点或浮点型显示格式
可通过Preferences(预设)对话框中的Command Window的设置修改数值显示方式
也可通过format函数进行设置
函数形式 | 说明 | 举例 |
---|---|---|
format short 或 format(‘short’) | 5位定点显示格式(默认) | 3.1416 |
format short e 或 format(‘short’,‘e’) | 5位带指数浮点显示格式 | 3.1416e+00 |
format long 或 format(‘long’) | 15位定点浮点显示格式 (单精度浮点数用7位) | 3.141592653589793 |
format long e 或 format(‘long’,‘e’) | 15位带指数浮点显示格式 (单精度浮点数用7位) | 3.141592653589793e+00 |
format bank 或 format(‘bank’) | 小数点后保留两位的显示格式 | 3.14 |
format rat 或 format(‘rat’) | 分数有理近似格式 | 355/113 |
❗️ rat全称rationa,format rat于format rational等效
>> origFormat = get(0,'format')
origFormat =
'short'
>> format('rat')
>> pi
ans =
355/113
>> format short e
>> pi
ans =
3.1416e+00
>> set(0,'format',origFormat) %使用set函数将之前保持的数值显示格式还原
>> get(0, 'format')
ans =
'short'
2.1.7 确定数值类型的函数
函数 | 用法 | 说明 |
---|---|---|
class | class(A) | 返回变量A的类型名称 |
isa | isa(A,‘class_name’) | 确定变量A是否是class_name的数据类型 |
isnumeric | isnumeric(A) | 确定A是否为数值类型 |
isinteger | isinteger(A) | 确定A是否为整数类型 |
isfloat | isfloat(A) | 确定A是否为浮点类型 |
isreal | isreal(A) | 确定A是否为实数 |
isnan | ianan(A) | 确定A是否为非数值量 |
isInf | isInf(A) | 确定A是否为无穷量 |
isfinite | isfinite(A) | 确定A是否为有限数值 |
2.1.8 常量与变量
常量符号 | 常量含义 |
---|---|
i 或 j | 虚数单位, i 2 = j 2 = − 1 i^2=j^2=-1 i2=j2=−1 |
Inf 或 inf | 正无穷大 |
NaN | 非数值量 |
pi | 圆周率的双精度表示 |
eps | 容差变量,当某量小于eps时可认定为0,即为浮点数的最小分辨率,PC上此值为 2 − 52 2^{-52} 2−52 |
Realmin | 最小浮点数,也可写作realmin,为 2 − 1022 2^{-1022} 2−1022 |
Realmax | 最大浮点数,也可写作realmax,为 2 1023 2^{1023} 21023 |
变量命名规则:
- 变量名必须由字母开头,且只能由
字母
,数字
,下划线
三类符号组成 - 变量名区分大小写
- 变量名不能超过63个字符,MATLAB6.5以前的版本不能超过31个
- 关键字不能作为变量名
- 最好不要用特殊常量名作变量名(可行但最好不要)
2.1.9 标量、向量、矩阵和数组
- 数组不是一个数学量,而是一个用于高级语言程序设计的概念。如果数组元素按一维线性方式组织在一起,那么称其为一维数组,一维数组的数学原型是向量。
如果数组元素分行、列排成一个二维平面表格,那么称其为二维数组,二维数组的数学原型是矩阵。如果元素在排成二维数组的基础上,再将多个行、列数分别相同的二维数组叠成一本立体表格,便形成三维数组。依此类推下去,便有了多维数组的概念。
在MATLAB中,数组的用法与一般高级语言不同,它不借助于循环,而是直接采用运算符,有自己独立的运算符和运算法则。 - 矩阵是一个数学概念,一般高级语言并未引入将其作为基本的运算量,但MATLAB是个例外。一般高级语言是不认可将两个矩阵视为两个简单变量而直接进行加减乘除的,要完成矩阵的四则运算必须借助于循环结构。
当MATLAB将矩阵引人作为基本运算量后,上述局面改变了。MATLAB不仅实现了矩阵的简单加减乘除运算,而且许多与矩阵相关的其他运算也因此简化了。 - 向量是一个数学量,一般高级语言中也未引入,它可视为矩阵的特例。从MATLAB的工作区窗口可以查看到:一个n维的行向量是一个1Xn阶的矩阵,而列向量则当成nX1阶的矩阵。
- 标量的提法也是一个数学概念,但在MATLAB中,一方面可将其视为一般高级语言的简单变量来处理,另一方面又可把它当成1X1阶的矩阵,这一看法与矩阵作为MATLAB的基本运算量是一致的。
- 在MATLAB中,二维数组和矩阵其实是数据结构形式相同的两种运算量。二维数组和矩阵的表示、建立、存储根本没有区别,区别只在它们的运算符和运算法则不同。
例如,向命令行窗口中输人a=[1 2;3 4]这个量,实际上它有两种可能的角色:矩阵a或二维数组a。这就是说,单从形式上是不能完全区分矩阵和数组的,必须再看它使用什么运算符与其他量之间进行运算。 - 数组的维和向量的维是两个完全不同的概念。数组的维是从数组元素排列后所形成的空间结构去定义的:线性结构是一维,平面结构是二维,立体结构是三维,当然还有四维以至多维。向量的维相当于一维数组中的元素个数。
2.1.10 字符串
在MATLAB中,字符串用单引号表示,如s=‘I have a dream’
字符串实际时一个字符数组,每一个字符是字符数组的元素
>> s = 'Hello World'
s =
'Hello World'
>> whos
Name Size Bytes Class Attributes
s 1x11 22 char
2.1.11 运算符
-
算数运算符
表2.1.11.1 矩阵算数运算符
运算符 | 名称 | 示例 | 法则或使用说明 |
---|---|---|---|
+ | 加 | C=A+B | 矩阵加法法则,即C(i,j) = A(i,j) + B(i,j) |
- | 减 | C=A-B | 矩阵减法法则,即C(i,j) = A(i,j) - B(i,j) |
* | 乘 | C=A*B | 矩阵乘法法则 |
/ | 右除 | C=A/B | 定义为线性方程组X*B=A的解,即C=A/B=A*B-1 |
\ | 左除 | C=A\B | 定义为线性方程组A*X=B的解,即C=A\B=A-1*B |
^ | 乘幂 | C=A^B | A、B其中有一个使标量时可运算 |
’ | 共轭转置 | B = A’ | B是A的共轭转置(转置后的复数时转置前复数的共轭复数) |
运算符 | 名称 | 示例 | 法则或使用说明 |
---|---|---|---|
.* | 数组乘 | C = A.*B | C(i,j) = A(i,j) * B(i,j) |
./ | 数组右除 | C = A./B | C(i,j) = A(i,j) / B(i,j) |
.\ | 数组左除 | C = A.\B | C(i,j) = A(i,j) / B(i,j) |
.^ | 数组乘幂 | C = A.^B | C(i,j) = A(i,j) ^ B(i,j) |
.’ | 转置 | B = A.’ | B是A的转置,不做复数共轭 |
数组加减于矩阵加减一致,不再列出
-
关系运算符
< 小于
,<= 小于等于
,> 大于
,>= 大于等于
,== 恒等于
,~= 不等于
- A、B都是标量,结果是或为1(真)或为0(假)的标量。
- A、B若一个为标量,另一个为数组,标量将与数组各元素逐一比较,结果为与运算数组行列相同的数组,其中各元素取值1或0。
- A、B均为数组时,必须行、列数分别相同,A与B各对应元素相比较,结果为与A或B行列相同的数组,其中各元素取值1或0。
- ==和~=运算对参与比较的量同时比较实部和虚部,其他运算只比较实部
-
逻辑运算符
单目逻辑运算符
~ 非
比如~A
双目逻辑运算符
& 与
,| 或
,&& 先决与
,|| 先决非
比如A&B A&&B A|B A||B
- A、B都为标量,结果是或为1(真)或为0(假)的标量
- A、B若一个为标量,另一个为数组,标量将与数组各元素逐一做逻辑运算,结果为与运算数组行列相同的数组,其中各元素取值或1或0
- A、B均为数组时,必须行、 列数分别相同,A与B各对应元素做逻辑运算,结果为与A或B行列相同的数组,其中各元素取值或1或0
- 先决与、先决或是只针对标量的运算
-
运算符的优先级
表2.1.11.3 MATLAB运算符的优先次序
优先次序 | 运算符 |
---|---|
最高 | ' 共轭转置 , ^ 矩阵乘幂 , .' 转置 ,.^ 数组乘幂 |
~ 逻辑非 | |
* ,/ 矩阵右除 ,\ 矩阵左除 ,.* 数组乘 ,./ 数组右除 ,.\ 数组左除 | |
+ , - ,: 冒号运算 | |
关系运算符 | |
& | |
| | |
&& | |
最低 | || |
2.1.12 命令、函数、表达式和语句
-
命令
通常是一个动词,一般没有括号,后可跟参数,如
clear all
clc
等很多命令也可通过函数方式调用,如
clear('all')
命令有一个专门存放的函数库general
-
函数
不再赘述
-
表达式
不再赘述
-
语句
不再赘述
2.2 向量运算
2.2.1 向量的生成
向量生成三种方法 直接输入法
,冒号表达式法
,函数法
-
直接输入法
>> A = [1 2 3] >> B = [1;2;3] >> C = [1,2,2] A = 1 2 3 B = 1 2 3 C = 1 2 2
-
冒号表达式法
start_var:step:stop_var
start_var为起始值 step为步长 stop_var为终值
>> A = 1:2:10 >> B = 1:10 >> C = 10:-1:1 >> D = 10:2:4 >> E = 2:-1:10 A = 1 3 5 7 9 B = 1 2 3 4 5 6 7 8 9 10 C = 10 9 8 7 6 5 4 3 2 1 D = 空的 1×0 double 行矢量 E = 空的 1×0 double 行矢量
-
函数法
linespace函数
logspace(start_var, stop_var, n)产生从start_var开始,到stop_var为结束的n个元素的等差数列
logspace函数
logspace(start_var, stop_var, n) 表示产生从 1 0 s t a r t _ v a r 10^{start\_var} 10start_var 到 1 0 s t o p _ v a r 10^{stop\_var} 10stop_var包含n个元素的等比一维数组,n默认为50。
2.2.2 向量的加减和数乘运算
在MATLAB中,维数相同的行向量之间可以相互加减,维数相同的列向量也可以相互加减
标量数值可以与向量直接相乘除
>> A = [1 2 3 4 5]; B = 3:7; C = linspace(2,4,3);
>> AT = A'; BT = B';
>> E1 = A + B, E2 = A - B, F = AT - BT, G1 = 3 * A, G2 = B/3, H = A + C
E1 =
4 6 8 10 12
E2 =
-2 -2 -2 -2 -2
F =
-2
-2
-2
-2
-2
G1 =
3 6 9 12 15
G2 =
1.0000 1.3333 1.6667 2.0000 2.3333
矩阵维度必须一致。
% 这句是H = A+C 的报错信息
2.2.3 向量的点、叉集运算
-
点积运算
即数量积,点积运算(A·B)的定义是参与运算的两向量各对应位置上元素相乘后,再将各乘积相加,其结果是一标量,而不是向量
dot函数
语法:dot(A,B),A和B是维数相同的两向量
>> A = 1:10; B = linspace(1,10,10); AT = A'; BT = B'; >> e = dot(A,B), f =dot(AT, BT) e = 385 f = 385
-
叉积运算
即向量积又称矢量积,在数学描述中,向量A、B的叉积是一新向量C,C的方向垂直于A与B所决定的平面,用三维坐标表示:
A = A x i + A y j + A z k A = A_xi + A_yj + A_zk A=Axi+Ayj+Azk
B = B x i + B y j + B z k B = B_xi + B_yj + B_zk B=Bxi+Byj+Bzk
C = A × B = ( A y B z − A z B y ) i + ( A z B x − A x B z ) j + ( A x B y − A y B x ) k C = A × B = (A_yB_z - A_zB_y)i + (A_zB_x - A_xB_z)j + (A_xB_y - A_yB_x)k C=A×B=(AyBz−AzBy)i+(AzBx−AxBz)j+(AxBy−AyBx)k
cross 函数
语法:cross(A, B),该函数计算的是A、B叉积后各分量的元素值,且A和B只能是三维向量
>> A = 1:3, B = 3:5 A = 1 2 3 B = 3 4 5 >> E = cross(A,B) E = -2 4 -2
-
混合积运算
>> A = [1 2 3], B = [3 3 4], C = [3 2 1] >> D = dot(C, cross(A,B)) A = 1 2 3 B = 3 3 4 C = 3 2 1 D = 4
2.3 矩阵运算
2.3.1 矩阵元素的存储次序
矩阵元素是按照列的顺序存储元素的
2.3.2 矩阵元素的表示及相关操作
-
元素的下标表示
-
单下标表示法
按列对元素编号,通过一个索引数字确定元素
>> A = magic(5) A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> A(8) % 按列数第8个元素,即第三行第二列的6 ans = 6
-
全下标表示法
以A(i, j)的方式表示元素,i是行,j是列
>> A = magic(5) A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> A(3,2) %与A(8)等效 ans = 6
-
-
矩阵元素的赋值
-
全下标赋值
>> A(1:2,1:3) = [1 1 1;1 1 1] %给数组的第一二行,第一二三列的元素赋值为1 A = 1 1 1 1 1 1 >> A(3,3) = 2 %给本不存在的元素赋值会扩充矩阵阶数,并补0 A = 1 1 1 1 1 1 0 0 2
-
单下标赋值
>> A(3:6) = [-1 1 1 -1] %可用一向量给单下标表示的连续多个矩阵元素赋值 A = 1 1 1 1 1 1 -1 -1 2 >> A(3) = 0; A(6) = 0 A = 1 1 1 1 1 1 0 0 2
-
全元素赋值
>> A(:) = 1:9 %将一向量以列优先顺序赋值给矩阵元素 A = 1 4 7 2 5 8 3 6 9 >> A(3, 4) = 16, B = [11 12 13; 14 15 16; 17 18 19; 0 0 0] A = 1 4 7 0 2 5 8 0 3 6 9 16 B = 11 12 13 14 15 16 17 18 19 0 0 0 >> A(:) = B A = 11 0 18 16 14 12 0 19 17 15 13 0
-
-
矩阵元素的删除
>> clear all >> A(2:3, 2:3) = [1 1;2 2] A = 0 0 0 0 1 1 0 2 2 >> A(2,:)=[] %删除第二行的所有列 A = 0 0 0 0 2 2 >> A(1:2) = [] %数组结构发生变化,若想保持结构,需使用A(:,1)=[] A = 0 2 0 2 >> A = [] A = []
❗️若想删除某一列,又不破坏矩阵结构,要使用双下表索引删除,如删除矩阵第一列用A(:,1)=[],使用单下标索引会破坏矩阵结构,使其称为一维向量
2.3.3 矩阵的创建
-
直接输入法
>> x = 27; y = 3; >> A = [1 2 3; 4 5 6];B = [2,3,4; 7,8,9; 12,2*6+1,14]; >> C = [3 4 5; 7 8 x/y; 10 11 12]; >> A,B,C A = 1 2 3 4 5 6 B = 2 3 4 7 8 9 12 13 14 C = 3 4 5 7 8 9 10 11 12
-
抽取法
-
全下标抽取
>> A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >> B = A(1:3,2:3) B = 2 3 6 7 10 11 >> C = A([1 3],[2 4]) C = 2 4 10 12 >> D = A(4,:) %此处冒号表示取所有列 D = 13 14 15 16 >> E = A([2 4],end) %end指这一行的最大维数 E = 8 16
-
单下标抽取
>> A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >> B = A([4:6;3 5 7;12:14]) B = 13 2 6 9 2 10 15 4 8
-
-
拼接法
行数与行数相同的小矩阵可以在列方向扩展拼接成更大的矩阵。同理,列数与列数相同的小矩阵可以在行方向扩展拼接成更大的矩阵
>> A = [1 2 3;4 5 6;7 8 9],B = [9 8;7 6;5 4], C = [4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 B = 9 8 7 6 5 4 C = 4 5 6 7 8 9 >> E = [A B;B A] E = 1 2 3 9 8 4 5 6 7 6 7 8 9 5 4 9 8 1 2 3 7 6 4 5 6 5 4 7 8 9 >> F = [A;C] F = 1 2 3 4 5 6 7 8 9 4 5 6 7 8 9
-
函数法
表2.3.4.1 常用工具矩阵函数 函数 功能 zeros(m, n) ones(m, n) 生成m×n阶全1矩阵 rand(m, n) 生成取值在0~1区间满足均匀分布的随机矩阵 randn(m,n) 生成满足正态分布的随机矩阵 eye(m,n) 生成m×n阶单位矩阵 表2.3.4.2 特殊矩阵函数 函数 功能 compan Companion矩阵 magic 魔方矩阵 gallery Higham测试矩阵 pascal 帕斯卡矩阵 hadamard Hadamard矩阵 rosser 经典对称特征值测试矩阵 hankel Hankel矩阵 toeplitz Toeplitz矩阵 hilb Hilbert矩阵 vander 范德蒙矩阵 invhilb 反Hilbert矩阵 wilkinson Wilkinson’s特征值测试矩阵 -
拼接函数和变形函数法
cat函数
repmat函数
❗️这两个函数会在第三章数组再学习(数组和矩阵本质上是一致的)
-
加载法
save和load的方法可将矩阵加载到文件并重新读取,具体参数后续有详解
2.3.4 矩阵的代数运算
-
求矩阵行列式的值
det函数
>> A = [3 2 4;1 -1 5;2 -1 3],D1 = det(A) A = 3 2 4 1 -1 5 2 -1 3 D1 = 24 >> B = ones(3),D2 = det(B),C = pascal(4),D3=det(C) B = 1 1 1 1 1 1 1 1 1 D2 = 0 C = 1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 D3 = 1
-
矩阵的加减、数乘与乘法
A = [ 1 3 2 − 1 ] A=\begin{bmatrix} 1&3\\ 2&-1\end{bmatrix} A=[123−1] B = [ 3 0 1 2 ] B=\begin{bmatrix} 3&0\\ 1&2\end{bmatrix} B=[3102]
求A+B,2A,2A-3B,AB
>> A = [1 3;2 -1];B=[3 0;1 2]; >> A+B ans = 4 3 3 1 >> 2*A ans = 2 6 4 -2 >> A*B ans = 6 6 5 -2
-
求矩阵的逆矩阵
inv函数 求逆矩阵
>> A = [1 0 1;2 1 2;0 4 6] A = 1 0 1 2 1 2 0 4 6 >> format rational >> A1 = inv(A) A1 = -1/3 2/3 -1/6 -2 1 0 4/3 -2/3 1/6
-
矩阵的除法
{ x 1 + 4 x 2 − 7 x 3 + 5 x 4 = 0 2 x 2 + x 3 + x 4 = − 8 x 2 + x 3 + 3 x 4 = − 2 x 1 + x 3 − x 4 = 1 \begin{cases} x_1 + 4x_2 - 7x_3 + 5x_4 = 0\\ 2x_2 + x_3 + x_4 = -8\\ x_2 + x_3 + 3x_4 = -2\\ x_1 + x_3 - x_4 = 1\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+4x2−7x3+5x4=02x2+x3+x4=−8x2+x3+3x4=−2x1+x3−x4=1 求此方程组的解
>> A = [1 4 -7 6;0 2 1 1;0 1 1 3;1 0 1 -1],B = [0;-8;-2;1],x=A\B A = 1 4 -7 6 0 2 1 1 0 1 1 3 1 0 1 -1 B = 0 -8 -2 1 x = 3.0000 -4.0000 -1.0000 1.0000 >> inv(A) * B %inv(A)*B等价于A/B 详见表2.1.11.1 ans = 3.0000 -4.0000 -1.0000 1.0000
-
求矩阵的秩
rank 函数 求矩阵的秩
>> A = [1 3 -9 3;0 1 -3 4;-2 -3 9 6], rb = rank(A) A = 1 3 -9 3 0 1 -3 4 -2 -3 9 6 rb = 2
-
求矩阵的特征值与特征向量
eig 函数
[ X X X, λ \lambda λ] = eig(A)
eigs 函数
[ X X X, λ \lambda λ] = eigs(A),此函数采用迭代法求解,在规模上最多只能给出6个特征值和特征向量
>> A = [1 -3 3;3 -5 3;6 -6 4],[x,lambda] = eig(A) A = 1 -3 3 3 -5 3 6 -6 4 x = -0.4082 -0.8103 0.1933 -0.4082 -0.3185 -0.5904 -0.8165 0.4918 -0.7836 lambda = 4.0000 0 0 0 -2.0000 0 0 0 -2.0000
-
矩阵的乘幂与开方
sqrtm 专门用于矩阵的开方函数
>> A = [1 -3 3;3 -5 3;6 -6 4]; >> A^3 ans = 28 -36 36 36 -44 36 72 -72 64 >> sqrtm(A) ans = 1.0000 + 0.7071i -1.0000 + 0.7071i 1.0000 - 0.7071i 1.0000 - 0.7071i -1.0000 + 2.1213i 1.0000 - 0.7071i 2.0000 - 1.4142i -2.0000 + 1.4142i 2.0000 - 0.0000i
❗️ 矩阵的乘法和开方运算都是以矩阵作为一个整体的运算,而不是针对矩阵中的每个元素施行
-
矩阵的指数与对数
expm 函数
矩阵指数运算,最为常用的一个。除此之外还有expm1 expm2 expm3
logm函数
矩阵对数运算
>> A = [1 -1 1;2 -4 1;1 -5 3]; >> Ae = expm(A) Ae = 1.3719 -3.7025 4.4810 0.3987 -2.3495 2.9241 -2.5254 -7.6138 9.5555 >> Ael = logm(Ae) Ael = 1.0000 -1.0000 1.0000 2.0000 -4.0000 1.0000 1.0000 -5.0000 3.0000
-
矩阵转置
transpose 非共轭转置
ctranspose 共轭转置
>> A = [1 2 3+2i; 4 5 6; 7 8 9] >> B = A' B = 1.0000 + 0.0000i 4.0000 + 0.0000i 7.0000 + 0.0000i 2.0000 + 0.0000i 5.0000 + 0.0000i 8.0000 + 0.0000i 3.0000 - 2.0000i 6.0000 + 0.0000i 9.0000 + 0.0000i >> C = A.' C = 1.0000 + 0.0000i 4.0000 + 0.0000i 7.0000 + 0.0000i 2.0000 + 0.0000i 5.0000 + 0.0000i 8.0000 + 0.0000i 3.0000 + 2.0000i 6.0000 + 0.0000i 9.0000 + 0.0000i >> D = transpose(A) D = 1.0000 + 0.0000i 4.0000 + 0.0000i 7.0000 + 0.0000i 2.0000 + 0.0000i 5.0000 + 0.0000i 8.0000 + 0.0000i 3.0000 + 2.0000i 6.0000 + 0.0000i 9.0000 + 0.0000i >> E = ctranspose(A) E = 1.0000 + 0.0000i 4.0000 + 0.0000i 7.0000 + 0.0000i 2.0000 + 0.0000i 5.0000 + 0.0000i 8.0000 + 0.0000i 3.0000 - 2
-
矩阵的提取与翻转
表2.3.4.3 矩阵翻转函数 函数及语法 说明 triu(A) 提取矩阵上三角元素,其余补0 tril(A) 提取矩阵下三角元素,其余补0 diag(A) 提取矩阵对角线元素 fliplr(A) 左右翻转矩阵A flipup(A) 上下翻转矩阵A flipdim(A,k) k指定的方向翻转矩阵
k=1相当于flipup,k=2相当于fliplrrot90(A,k) 把A逆时针旋转k*90度,k不指定时默认为1
2.4 字符串运算
2.4.1 字符串变量与一维字符数组
-
给字符串变量赋值
>> S1 = 'Hello World',S2 = '你好世界',S3 = 'Hello World 你好世界' S1 = 'Hello World' S2 = '你好世界' S3 = 'Hello World 你好世界'
-
一维字符数组的生成
>> Sa = ['I love my teacher' ',I love more' ' profounfly'] Sa = 'I love my teacher,I love more profounfly' >> Sb = char('a':2:'r') Sb = 'acegikmoq' >> Sc = char(linspace('e','t',10)) Sc = 'efhjkmoprt'
2.4.2 对字符串的多项操作
-
求字符串的长度
length函数 与 size 函数
❗️ length()只能从各维中挑出最大维的数值大小,而size()则以一个向量的形式给出各维的数值大小,length() = max(size()),但对于一维字符数组来说,其结果相同
>> Sa = ['I love my teacher' ',I love truths more' ' profounfly']; >> length(Sa) ans = 47 >> size(Sa) ans = 1 47
-
字符串与一维数值数组的相互转换
abs double char setstr
>> S1 = 'I am nobody'; >> As1 = abs(S1) As1 = 73 32 97 109 32 110 111 98 111 100 121 >> As2 = double(S1) As2 = 73 32 97 109 32 110 111 98 111 100 121 >> char(As1) ans = 'I am nobody' >> char(As2) ans = 'I am nobody' >> setstr(As2) ans = 'I am nobody'
-
比较字符串
strcmp函数
语法:strcmp(S1, S2)
当S1与S2完全相同时,返回1;否则返回0
>> S1 = 'I am nobody'; >> S2 = 'I am nobody.'; >> strcmp(S1,S2) ans = logical 0
-
查找字符串
findstr 函数
语法:findstr(string, substring)
从长字符串string中查找子字符串substring,返回的结果值为子串在长串中的起始位置
>> S1 = 'Do you wanna build a snowman?'; >> S2 = 'snowman'; >> S3 = 'nothing'; >> findstr(S1,S2) ans = 22 >>findstr(S1,S3) %找不到时,返回空数组 ans = []
-
显示字符串
display 函数 类似于python中的print,c语言中的printf
>> display('Hello World') Hello World >>display 'Hello World' Hello World
2.4.3 二维字符数组
>> S1 = '路修远以多艰兮,';
>> S2 = '腾众车使径侍。';
>> S3 = '路不周以左转兮,';
>> S4 = '指西海以为期!';
>> S = [S1;S2,' ';S3;S4,' '] %此方法要求字符数相同,不够要补空格
S =
4×8 char 数组
'路修远以多艰兮,'
'腾众车使径侍。 '
'路不周以左转兮,'
'指西海以为期! '
>> S = [S1;S2;S3;S4] %字符数不同,报错
错误使用 vertcat
串联的矩阵的维度不一致。
可将字符串连接成二位数组的函数有多个,主要有 char() strvcat() str2mat() 这三个函数
>> S1a = 'I''m nobody,'; S1b = ' who are you?'; % 注意句中引号的处理
>> S2 = 'Are you nobody too?';
>> S3 = 'Then there''s a pair of us.';
>> SS1 = char([S1a,S1b],S2,S3)
SS1 =
3×26 char 数组
'I'm nobody, who are you? '
'Are you nobody too? '
'Then there's a pair of us.'
>> SS2 = strvcat(strcat(S1a,S1b),S2,S3)
S2 =
3×26 char 数组
'I'm nobody, who are you? '
'Are you nobody too? '
'Then there's a pair of us.'
>> SS3 = str2mat(strcat(S1a,S1b),S2,S3)
SS3 =
3×26 char 数组
'I'm nobody, who are you? '
'Are you nobody too? '
'Then there's a pair of us.'
❗️ strcat()
是将字符串沿横向连接成更长的字符串,strvcat()
是将字符串沿纵向连接成二维字符数组