MATLAB 界面
打开 MATLAB 后,出现下面界面,这就是咱们的开发环境。当然,不同的版本可能略有差别,但我们不用管。我们这里主要用的是 命令行窗口(Command Window),其他用到再说。
输入命令
MATLAB 的命令行窗口和 Python 的命令模式很类似,你可以把 MATLAB 当作一个计算器,直接输入加减乘除,按回车后,就会出现运算结果。如:
输入
1+1
输出
ans =
2
如果你不想看到输出结果,你可以在命令后面加分号,这样就不会显示结果。
输入
1+1;
输出
无输出,直接准备下一条输入
>>
如果你想一次运行多条命令,你可以把命令放在同一行里,用 ,
隔开。也可以采用另一个做法:输入完一条命令后,按 Shift + Enter
切换到下一行,接着输入,最后按回车就可以显示所有结果。
输入
>> 1+1 %按shift+enter
2+2
输出
ans =
2
ans =
4
基本数据类型
MATLAB 是用于科学计算的,所以会有很多高精度的数据类型,以及一些数学上的数据类型。主要分为 数值类型、字符串、结构、单位数组和函数句柄等。下面一一介绍。
数值类型
数据格式 | 示例 | 说明 |
---|---|---|
int8, int16 int32, int64 uint8…… |
输入int16(2^15) 得到 ans=32767 |
分为有符号和无符号。占用内存比浮点少 |
single | single(0.1) | 单精度浮点类型 |
double | 5.32 | 双精度浮点类型,默认数值类型 |
在此我们不纠结各种数值所能表示的范围,这个一搜就有。我们只注意几点:
- MATLAB 默认使用双精度浮点类型,这就会造成一定的问题,比如计算
1-0.2-0.2-0.2-0.2-0.2
,显示的结果是 5.5511e-17,这点要注意。 - 整数只能与同类的整数或双精度标量值组合使用
- 双精度浮点数与其他类型计算,结果由其他类型决定,这点与 Python 截然相反
MATLAB 还有数学上的数值类似:复数,用 i
或 j
作为虚部标志。
输入
(1+1j)*(1-1j)
输出
ans =
2
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
complex(a,b) | 构造复数 a+jb | i, j | 虚部标识 |
real(z) | 返回实部 | imag(z) | 返回虚部 |
abs(z) | 返回模 | angle(z) | 返回辐角 |
conj(z) | 返回共轭复数 |
MATLAB 还定义了两个特殊的值:无穷量 Inf
和 非数值量 NaN
。无穷一般表示运算溢出,非数值量则是由 0/0,Inf/Inf 等非正常运算产生。
输入
1/0
输出
ans =
Inf
输入
0/0
输出
ans =
NaN
字符串
MATLAB 的字符和 Python 差不多,都是可以用 "
"
或 '
'
,根据字符的种类来选择编码类型 ASCII 或 UTF8,我们可以用 abs()
来查看 ASCII 码(不做演示)。
结构体
MATLAB 也有和 c 类似的结构体,创建方法如下:
输入
patient.name='John Doe';
patient.billing=127;
patient
输出
patient =
包含以下字段的 struct:
name: 'John Doe'
billing: 127
或者用 struct()
函数创建:
输入
patient=struct('name', 'jogn Doe', 'billing', 127)
输出
同上
要访问结构直接输入变量名即可,比如 patient.name
。
要组合结构,可以直接用如下方法:
输入
patient1=struct('name', 'jogn Doe', 'billing', 127);
patient2=struct('name', 'Tim Burg', 'billing', 37);
patient=[patient1, patient2]
输出
patient =
包含以下字段的 1×2 struct 数组:
name
billing
数组、字典
以后再说,现在说也没啥用。
运算
算数运算
运算符 | 运算 | 运算符 | 运算 |
---|---|---|---|
A+B | A 加 B | ||
A-B | A 减 B | ||
A*B | A 乘 B | A.*B | A、B 对应元素相乘 |
A/B | A 除 B | A./B | A、B 对应元素相除 |
A^B | A 的 B 次幂 | A.^B | A 每个元素的 B 次幂 |
输入
A = 2*eye(2), B=ones(2), C=A*B, D=A.^2, E=C.^A
输出
(对结果进行了整理,以缩短文章长度)
A = B = C = D = E =
2 0 1 1 2 2 4 0 4 1
0 2 1 1 2 2 0 4 1 4
关系运算
关系运算符 | 关系说明 | 关系运算符 | 关系说明 |
---|---|---|---|
< | 小于 | <= | 小于等于 |
> | 大于 | >= | 大于等于 |
== | 等于 | ~= | 不等于 |
返回 1 为真,返回 0 为假。关系运算除了可以是两个数之间,也可以是两个矩阵之间。
输入
A=1:5, B=6-A
A==B
输出
A =
1 2 3 4 5
B =
5 4 3 2 1
ans =
1×5 logical 数组
0 0 1 0 0
逻辑运算
逻辑运算符 | 说明 |
---|---|
& | 与 |
| | 或 |
~ | 非 |
xor(x, y) |
异或 |
any(x) |
有任何非 0 元素返回 1 |
all(x) |
所以元素非 0 返回 1 |
运算也可以是两个矩阵之间。
输入
A=1:5, B=6-A
(A>3) | (B>3)
输出
A =
1 2 3 4 5
B =
5 4 3 2 1
ans =
1×5 logical 数组
1 1 0 1 1
运算优先级
优先级 | 运算 | 优先级 | 运算 |
---|---|---|---|
1 | () | 6 | 关系运算 |
2 | 转置和乘幂 | 7 | & |
3 | +, -, ~ | 8 | | |
4 | _, /, .*, ./ | 9 | && |
5 | : | 10 | || |
矩阵
矩阵是 MATLAB 最重要的数据类型,甚至是 MATLAB 名字的一部分(Matrix)
创建矩阵
矩阵的创建有两种方式,一种为逐个列出元素,另一种则是借助特殊构造函数。
- 创建一般矩阵:用方括号
[]
括起元素,同行元素用逗号,
或空格隔开,行与行之间用分号隔开;
输入
A = [1 2 3;4,5,6]
输出
A =
1 2 3
4 5 6
- 创建特殊矩阵
函数名 | 功能 |
---|---|
ones(n) |
n×n 的 1 矩阵 |
ones(m,n,…,p) |
m×n×…×p 的 1 矩阵 |
ones(size(A)) |
和 A 同样形状的 1 矩阵 |
zeros() |
全 0 矩阵,类比 ones() |
eye() |
单位矩阵,类比 ones() |
diag(x) |
对角矩阵,对角线值为 x |
rand(n) |
随机 0~1 分布的 n×n 矩阵 |
randn(n) |
均值 0,方差 1 的正态分布的 n×n 矩阵 |
magic(n) |
n×n 的矩阵,每一行每一列的元素之和相等 |
输入
eye(2,3)
输出
ans =
1 0 0
0 1 0
矩阵索引
有两种索引方法,一种是常见的双索引,就和 Python 一样;一种是单索引,就是把所有元素按列排成一个数组,然后选取顺数第几个。注意,MATLAB 的索引是从 1
开始的。
输入
M=magic(3), A=M(2,3), B=M(8)
输出
M =
8 1 6
3 5 7
4 9 2
A =
7
B =
7
还可以索引多个元素:
索引表达式 | 说明 |
---|---|
A(:, j) |
第 j 列列向量 |
A(i, :) |
第 i 行行向量 |
A(:, j:k) |
第 j 到 k 列构成的子阵 |
A(i:k, :) |
第 i 到 k 行构成的子阵 |
A(:) |
将 A 每列合并成一个合并成一个列向量 |
A(j:k) |
选取第 j 到 k 个元素组成行向量 |
A(i:j:k) |
选取 i, i+j, i+2j…组成行向量 |
A([j1, j2…]) |
选取第 j1, j2…个元素组成行向量 |
A([i1, i2, …], [j1, j2…]) |
返回第 i1, i2…行和第 j1, j2…列的元素 |
输入
M=magic(5), A=M(2:3, 3:4), B=M([7:8 16:18])
输出
M =
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 =
7 14
13 20
B =
5 6 8 14 20
更多关于矩阵的内容可以查看相关章节。