命令 | 随机生成的 x | 计算结果 |
x = randi(5,3,4)
exp(x)
% 计算自然常数 e 的指数 | 2 3 2 2
5 4 2 5
5 3 3 1 | 7.3891 20.0855 7.3891 7.3891
148.4132 54.5982 7.3891 148.4132
148.4132 20.0855 20.0855 2.7183 |
x = rand(4, 3)
round(x, 2)
% 四舍五入保留两位小数 | 0.2259 0.3111 0.9049 0.1707 0.9234 0.9797
0.2277 0.4302 0.4389
0.4357 0.1848 0.1111 | 0.2300 0.3100 0.9000 0.1700 0.9200 0.9800 0.2300 0.4300 0.4400 0.4400 0.1800 0.1100 |
x = randi(10,3)
mod(x, 3) % 计算 x 中各 元素除以 3 的余数 | 9 10 3
10 7 6
2 1 10 | 0 1 0
1 1 0
2 1 1 |
除了这些最基础的数学运算函数外, 这一小节我们还要学习下表这些使用频率较高的函数, 大家需要熟练掌握它们的用法:
函数名 | 函数的作用 |
sum | 求和函数 |
prod | 求乘积函数(product) |
cumsum | 计算累积和(cumulative sum) |
diff | 计算差分(difference) |
mean | 计算平均值 |
median | 计算中位数 |
mode | 计算众数 |
var | 计算方差(variance) |
std | 计算标准差(standard deviation) |
min | 求最小值(minimum value) |
max | 求最大值(maximum value) |
sum :求和函数
(1)如果 A 是一个向量,则 sum(A)可以计算 A 中所有元素的和。
A = 1:100;
sum(A) | 5050 |
(2)如果 A 是一个矩阵,则 sum(A,dim)可以计算 A 矩阵沿维度 dim 中所有元素的和。
- dim = 1 表示沿着行方向进行计算,即计算矩阵每一列的和,返回一个行向量;
- dim = 2 表示沿着列方向进行计算,即计算矩阵每一行的和,返回一个列向量。
当 dim = 1 时, sum(A,1)可以简写成 sum(A). (sum 函数的帮助文档上有一个示意图)
A = randi(10,3,4) | 4 6 6 8
7 4 3 3
8 2 1 5 |
% 计算每一列的和
sum(A) % 或者写成 sum(A, 1) | 19 12 10 16 |
% 计算每一行的和
sum(A,2) | 24
17
16 |
(3)计算一个矩阵中所有元素的总和。
可以先用一次 sum 函数计算矩阵 A 每一列的和,返回一个行向量;然后再用一次 sum 函 数计算这个行向量的和;也可以先使用 A(:)语句把 A 中的所有元素按照线性索引的顺序拼接 成一个向量,然后直接计算这个向量的和。
A = randi(5,2,3) | 1 2 4
3 4 1 |
sum(sum(A)) | 15 |
sum(A(:)) % 更推荐这种写法 | 15 |
补充: 从 MATLAB2018b 版本开始,可以使用 sum(A, 'all')来计算所有元素的和。 | ㅤ |
(4)指定如何处理 NaN 值
NaN 指不定值或缺失值(Not a Number)。默认情况下, 求和时有一个元素为 NaN 值,那么最终的和也为NaN;我们可以在最后加一个输入参数: 'omitnan', 这样计算时会忽略NaN 值。
A = [1 5 NaN 10]; % 向量中存在 NaN sum(A) | NaN |
sum(A, 'omitnan') % 忽略 NaN 值 | 16 |
A = [5 3 -8 4
1 5 NaN 10;
3 6 18 9]; % 矩阵中存在 NaN sum(A) % 计算每一列的和 |
9 14 NaN 23 |
sum(A, 'omitnan') % 忽略 NaN 值 | 9 14 10 23 |
sum(A, 2) % 计算每一行的和 | 4
NaN
36 |
% 忽略 NaN 值
sum(A, 2, 'omitnan') | 4
16
36 |
prod :求乘积函数(product)
prod 函数的用法和 sum 函数的用法相同,它是用来计算乘积的,我们直接来看例子。
v = [2,4,5,1,10]; % 向量
prod(v) % 直接向量中所有元素的乘积 | 400 |
v = 1:10;
prod(v) % 计算 10 的阶乘
% 熟练的话可以直接写成 prod(1:10) |
3628800 |
% 下面看矩阵的例子
A = randi(10,3,4) | 1 1 5 5
3 10 6 10
9 8 3 6 |
prod(A) % 计算每列的乘积
% 也可以写成 prod(A, 1) | 27 80 90 300 |
prod(A,2) % 计算每行的乘积 | 25
1800
1296 |
v = [2,4,NaN,1,10]; % 有 NaN 值 prod(v) | NaN |
% 如果计算时忽略 NaN 值,可以在最后面 加上'omitnan'参数
prod(v, 'omitnan') |
80 |
A = [5 3 -8 4
1 5 NaN 10;
3 6 18 9]; % 矩阵中存在 NaN 值 prod(A) % 计算每一列的乘积 |
15 90 NaN 360 |
prod(A, 'omitnan') % 忽略 NaN 值 | 15 90 - 144 360 |
% 忽略 NaN 值计算每一行的乘积
prod(A, 2, 'omitnan') | -480
50
2916 |
cumsum :计算累积和(cumulative sum)
(1)如果 A 是一个向量,则 cumsum(A)可以计算向量 A 的累积和(累加值)。
A = [1 5 3 4 -5 0 8];
cumsum(A) % 计算 A 的累积和 | 1 6 9 13 8 8 16 |
(2)如果 A 是一个矩阵,则 cumsum(A,dim)可以计算 A 沿维度 dim 中所有元素的累积和,具体的使用方法和 sum 函数类似。
A = randi(10,3,4) | 4 6 6 8
7 4 3 3
8 2 1 5 |
% 计算每一列的累积和
cumsum(A) % 或者写成 cumsum(A,1) | 4 6 6 8
11 10 9 11
19 12 10 16 |
% 计算每一行的累积和cumsum(A,2) | 4 10 16 24
7 11 14 17
8 10 11 16 |
(3)也可以在最后加一个输入参数: 'omitnan', 这样计算时会忽略 NaN 值。
A = [5 3 -8 4
1 5 NaN 10;
3 6 18 9];
cumsum(A) % 计算每一列的累积和 |
5 3 -8 4
6 8 NaN 14
9 14 NaN 23 |
% 忽略 NaN 值计算每一列的累积和
cumsum(A,'omitnan') | 5 3 -8 4
6 8 -8 14
9 14 10 23 |
cumsum(A, 2) % 计算每一行的累积和 | 5 8 0 4
1 6 NaN NaN
3 9 27 36 |
% 忽略 NaN 值计算每一行的累积和
cumsum(A, 2, 'omitnan') | 5 8 0 4
1 6 6 16
3 9 27 36 |
diff :计算差分(difference)
差分运算在和时间相关的数据中用的比较多。在原始序列中用下一个数值减去上一个数值 可以得到一个新的序列, 这个过程就是一阶差分; 在一阶差分结果的基础上再进行一次一阶差 分, 就是二阶差分, 举个例子, 下表是清风老师 8 年来的体重变化, 我们可以计算一阶差分和 二阶差分的结果:
年份 | 体重 | 一阶差分 | 二阶差分 |
2015 | 60 | \ | \ |
2016 | 65 | 5 | \ |
2017 | 66 | 1 | -4 |
2018 | 70 | 4 | 3 |
2019 | 68 | -2 | -6 |
2020 | 72 | 4 | 6 |
2021 | 64 | -8 | -12 |
2022 | 70 | 6 | 14 |
MATLAB 中计算差分的函数是 diff,我们可以使用 diff(A,n)命令计算向量 A 的 n 阶差分, 当 n 等于 1 时,可以直接写成 diff(A).
w = [60 65 66 70 68 72 64 70];
diff(w) % 1 阶差分, diff(w,1) | 5 1 4 -2 4 -8 6 |
diff(w,2) % 2 阶差分 | -4 3 -6 6 -12 14 |
diff(w,3) % 3 阶差分 | 7 -9 12 -18 26 |
diff 函数也可以用在矩阵上面: diff(A,n,dim)表示沿矩阵 A 的维度 dim 方向上计算差分, 当 dim=1 时沿着行方向计算,即得到每列的 n 阶差分;当 dim=2 时沿着列方向计算,即得到 每行的 n 阶差分。类似的, dim=1 时, diff(A,n,1)也可以简写成 diff(A,n).
A = randi(10,3,4) | 4 8 7 6
6 3 9 2
3 6 10 2 |
% 计算每列的 1 阶差分
diff(A) % 也可写成 diff(A,1)或 diff(A,1,1) | 2 -5 2 -4
-3 3 1 0 |
% 计算每列的 2 阶差分
diff(A,2) % 也可写成 diff(A,2,1) | -5 8 - 1 4 |
% 计算每行的 1 阶差分
diff(A,1,2) | 4 -1 -1
-3 6 -7
3 4 -8 |
% 计算每行的 2 阶差分
diff(A,2,2) | -5 0
9 - 13
1 - 12 |
注意, diff 函数不支持使用'omitnan'参数来忽略向量或者矩阵中的 NaN 值。
w = [60 65 NaN 70 68 72 64 70];
diff(w) | 5 NaN NaN -2 4 -8 6 |
% 尝试使用'omitnan'参数
diff(w, 'omitnan') | 错误使用 diff
差分阶数 N 必须为正整数标量。 |
% 加上差分阶数
diff(w, 1, 'omitnan') | 错误使用 diff
维度参数必须是处于索引范围内的正整数标量。 |
% 加上维度
diff(w, 1, 2,'omitnan') | 错误使用 diff
输入参数太多。 |
mean : 计算平均值(mean/average value)
假设向量,即向量y中有n个元素,那么它的平均值等于 ——在 MATLAB 中, mean 函数可以用来计算平均值,它的使用方法和 sum 函数类似。
(1)如果 A 是一个向量,则 mean(A)可以计算向量 A 的平均值。
y = [1 3 5 7 9];
mean(y) % 计算 y 的平均值 | 5
% (1+3+5+7+9) / 5 = 5 |
(2)如果 A 是一个矩阵,则 mean(A,dim)可以计算 A 沿维度 dim 中所有元素的平均值。
- 当 dim=1 时沿着行方向进行计算,即得到每列的平均值;
- 当 dim=2 时沿着列方向进行计算,即得到每行的平均值。
类似的, dim=1 时, mean(A,1)也可以简写成 mean(A).
A = randi(10,3,4) | 7 1 2 10
8 3 9 1
5 10 6 5 |
% 求每列的平均值
mean(A) % 或者写成 mean(A,1) | 6.6667 4.6667 5.6667 5.3333 |
mean(A,2) % 求每行的平均值 | 5.0000
5.2500
6.5000 |
(3)也可以在最后加一个输入参数: 'omitnan', 这样计算时会忽略 NaN 值。
A = [5 3 -8 4
1 5 NaN 10;
3 6 18 9];
mean(A) % 计算每一列的平均值 |
3.0000 4.6667 NaN 7.6667 |
% 忽略 NaN 值计算每一列的平均值
mean(A,'omitnan')
% 也可以写成 mean(A,1,'omitnan') | 3.0000 4.6667 5.0000 7.6667
% 第三列平均数为 5,由(-8+18)/2 得到,分母为 2 |
mean(A, 2) % 计算每一行的平均值 | 1
NaN
9 |
% 忽略 NaN 值计算每一行的平均值
mean(A, 2, 'omitnan') | 1.0000
5.3333
9.0000 |
median :计算中位数
中位数又称中值, 我们将数据按从小到大的顺序排列, 在排列后的数据中居于中间位置的 数就是中位数。
假设有一个向量 , 向量y中有n个元素, 我们先将向量y按照从小到
大的顺序排序, 得到新的向量 , 那么当n为奇数时, 中位数为 ;
当n为偶数时,中位数为
下面是手算中位数的步骤:
y | n | 中位数 | |
[6 80 1 5 100 20 1000] | [1 5 6 20 80 100 1000] | 7 | 20 |
[3 6 80 1 5 10 20 100] | [1 3 5 6 10 20 80 100] | 8 | (6+10)/2=8 |
在 MATLAB 中, median 函数可以用来计算中位数,它的使用方法和 mean 函数类似。
y = [6 80 1 5 100 20 1000];
median(y) % 计算 y 的中位数 | 20 |
A = [5 3 -8 4
1 5 NaN 10;
3 6 18 9];
median(A) % 计算每一列的中位数 |
3 5 NaN 9 |
% 忽略 NaN 值计算每一列的中位数
median(A,'omitnan')
% 也可以写成 median(A,1,'omitnan') | 3 5 5 9
% 第三列忽略 NaN 值后, 只剩下-8 和 18,中位数为 5 |
% 忽略 NaN 值计算每一行的中位数
median(A, 2, 'omitnan') | 3.5000
5.0000
7.5000
% 第二行忽略 NaN 值后, 剩下 1 、5 和 10,中位数为 5 |
mode :计算众数
众数是指一组数据中出现次数最多的数。一组数据可以有多个众数,例如向量[1 3 -1 2 1 3] 中, 1 和 3 都出现了两次,它们都是这组数据中的众数。
MATLAB 中可以使用 mode 函数计算数据的众数,调用方法也和 mean 函数类似,但是 mode 函数可以有多个返回值。
以计算向量 A 的众数为例,直接调用 mode(A)会返回 A 中出现次数最多的值。如果有多 个值以相同的次数出现, mode 函数将返回其中最小的值。
A = [1 3 - 1 2 1 3];
mode(A) % 计算 A 的众数 | 1 |
如果 A 是一个矩阵, 则 mode(A,1)或者 mode(A)可以沿着行方向进行计算, 得到每一列的
众数; mode(A,2)可以沿着列方向进行计算, 得到每一行的众数, 这里的 1 和 2 表示维度 dim。
A = randi(10,3,4) | 4 6 6 8
7 2 3 3
8 2 6 5 |
% 计算每一列的众数
mode(A) % 或者写成 mode(A,1) | 4 2 6 3 |
% 计算每一行的众数
mode(A, 2) | 6
3
2 |
注意:使用 mode 函数计算众数时会自动忽略 NaN 值,我们不能额外添加'omitnan'参数, 否则会报错。
A = [2 3 - 1 NaN 1 NaN NaN 3];
mode(A) | 3 |
mode(A, 'omitnan') | 低版本 MATLAB:DIM 参数必须为用于指定 X 的维度的标量。 高版本 MATLAB:维度参数必须为正整数标量、由唯一正 整数组成的向量或'all'。 不同版本的 MATLAB 报错信息可能有区别,这是因为 高版本 MATLAB 中的 mode 函数支持更多种用法。大家可 以使用 doc mode 命令来查看你的版本对应的帮助文档。 |
mode(A, 2, 'omitnan') | 错误使用 mode
输入参数太多。 |
现在我们来看 mode 函数有两个返回值的例子, 如果 A 是一个向量, [M,F] = mode(A)得到 的 M 表示向量 A 的众数, F 表示众数 M 在向量 A 中出现的次数。
A = [- 1 2 0 8 - 1 0 2 1 8 0 8];
[M, F] =mode(A) | M = 0 F = 3 |
上面这个例子中, 有两个众数, 分别是 0 和 8,它们出现的次数都是 3 次, 此时 MATLAB 会返回最小的那个数作为众数。有同学会想, MATLAB 能不能把这些众数都输出呢?
当然可以,我们需要用到 mode 函数的第三个返回值: [M,F,C] = mode(A), 这里的 C 是一 个元胞数组,元胞数组里面有一个列向量,列向量中的每个元素都是向量 A 的众数。 (注意, 元胞数组(cell array)是使用大括号{}括起来的, 元胞数组里面的元素可以包含不同的数据类型, 例如标量、向量、矩阵、字符串等,后面章节中我们会专门讲解元胞数组的用法)
A = [-1 2 0 8 -1 0 2 1 8 0 8];
[M, F, C] =mode(A) | M = 0 F = 3
C = 1×1
cell 数组 {2×1 double} |
变量 C 就是元胞数组, 它的大小为 1×1,即一行一列, 因此里面只有一个元素, 这个元素 是一个 2 行 1 列的列向量。我们可以使用大括号索引的方式来提取元胞数组中的元素:
C{1} | 0
8 |
命令 C{1}可以提取出元胞数组 C 中的第一个元素:列向量[0; 8]。这个列向量中的元素 0 和 8 都是向量 A 的众数。
以上是 A 为向量时的情况, 如果 A 是一个矩阵,mode 函数也可以有两个返回值或三个返 回值,后两个返回值代表的含义与 A 为向量时类似。我们直接看下面的例子:
A = [3 3 1 4;
0 0 1 1;
0 1 6 4;
1 5 6 8];
[M, F, C] = mode(A) % 计算每一列的众数 | M =
0 0 1 4
F =
2 1 2 2
C = 1×4 cell 数组
{[0]} {4×1 double} {2×1 double} {[4]} |
M 是一个包含四个元素的行向量,里面第 k 个元素表示第 k 列的众数,例如第 1 列的众 数为 0;如果有多个众数,那么会返回最小的那个值,因此第 2 列返回的众数为 0。
F 也是一个包含四个元素的行向量,它表示 M 中的各个众数在其所在列中出现的次数, 例如第 1 列的众数 0 在第 1 列出现了 2 次。
C 是一个大小为 1×4 的元胞数组, 里面的第 k 个元素表示第 k 列的所有众数。从元胞数组 C 的结果来看,第一个和第四个元素分别为 0 和 4,这说明第 1 列和第 4 列都只有一个众数, 分别是 0 和 4;C 中第二个元素是一个 4 行 1 列的列向量,这说明第 2 列有四个众数; C 中第 三个元素是一个 2 行 1 列的列向量,这说明第 3 列有两个众数。
我们可以使用大括号索引提取 C 中的每个元素:
C{1} | 0 |
C{2} | 0
1
3
5
% 会自动对所有的众数按照从小到大的顺序排序 |
C{3} | 1
6 |
C{4} | 4 |
类似的,我们也可以计算 A 矩阵每一行的所有众数,结果如下:
[M, F, C] = mode(A, 2) %计算 A 矩阵每一行的众数 | ㅤ | ㅤ |
M =
3
0
0
1
% 每一行的众数 | F =
2
2
1
1
% 每一行众数出现的次数 | C =
4×1 cell 数组
[ 3]
[2×1 double]
[4×1 double]
[4×1 double] |
C{1} |
C{2} |
C{3} |
C{4} |
3 |
0
1 | 0
1
4
6 | 1
5
6
8 |
下面对 mode 函数做一个总结:
(1) mode 函数可用来计算一个向量或者矩阵中的众数。如果 mode 函数只有一个返回 值,那么它的用法和 mean 函数、 median 函数类似。
(2) 如果 A 是一个向量, 那么 M =mode(A)可以计算向量 A 的众数, 若存在多个众数, 则只会返回其中的最小值。
(3) 如果 A 是一个矩阵,那么 M = mode(A, dim)可以计算矩阵 A 沿着维度 dim 中所有 元素的众数。当 dim=1 时沿着行方向进行计算,即得到每列的众数;当 dim=2 时 沿着列方向进行计算, 即得到每行的众数。另外, mode(A,1)可以简写成 mode(A)。
(4) mode 函数不能使用'omitnan'参数, MATLAB 在计算众数时会自动忽略向量或者矩 阵中的 NaN 值。
(5) mode 函数最多能有三个返回值: [M,F,C] = mode(A). 如果 A 是向量,那么 M 表示 向量 A 的众数, F 表示众数 M 在向量 A 中出现的次数,如果 A 中存在多个众数, MATLAB 会返回最小的那个数作为 M,第三个返回值 C 则是一个元胞数组, 里面 包含了 A 的所有众数。如果 A 是矩阵,那么 M 、F 和 C 分别代表每一列的众数、 每一列众数在所在列中出现的次数以及每一列的所有众数构成的元胞数组。
另外, 本小节用到了元胞数组的知识, 元胞数组中的元素用大括号{}括起来, 各元素可以 是不同的数据类型, 要提取元胞数组中的元素可以使用大括号进行索引, 例如, 要提取元胞数 组 C 中的第一个元素,可以使用 C{1}。未来章节我们会系统学习元胞数组的用法,感兴趣的同学可以提前在 MATLAB 官网搜索关键词进行学习。
var :计算方差(variance)
方差是概率论与数理统计里面的知识点,我们先简单回顾一下相关的内容。
先来看个例子: 第一组数据是 6 、8 、10 、12 、14;第二组数据是-10 、0 、10 、20 、30。显 然两组数据的均值都是 10,但第二组数据的离散程度更大一些。
方差就是用来描述这种离散程度的一个统计量, 当两组数据的平均值相同时, 方差较大的 一组数据的离散程度更大。有一个常举的例子: 一个射击队要从两名运动员中选拔一名参加比 赛,选拔赛上两人各打了 10 发子弹, 在得分均值相差不大的情况下, 应选择方差更小的队员。
在现实生活中,我们收集到的数据可分为下面两类:
- 总体数据:所要考察对象的全部个体叫做总体;
- 样本数据:从总体中所抽取的一部分个体叫做总体的一个样本。
根据收集的数据类型的不同,我们计算方差的公式也有所区别。
从上方的计算公式可以看出, 总体方差和样本方差在计算时的区别在于分母上是否要减 1。
MATLAB 中使用 var 函数计算方差:
(1)如果 A 是一个向量,那么 var(A, w)可以计算 A 的方差,当 w=0 时,表示计算样本 方差, w=1 时表示计算总体方差,另外, var(A, 0)也可以直接简写为 var(A)。
(2)如果 A 是一个矩阵,则 var(A, w, dim)可以计算矩阵 A 沿维度 dim 上的方差。
- dim = 1 时表示沿着行方向进行计算,即得到每一列的方差;
- dim = 2 时表示沿着列方向进行计算,即得到每一行的方差。
当 dim 为 1 时, var(A, w, 1)可以简写为 var(A,w);若 w 为 0,则可以进一步简写为 var(A),即默认情况下 MATLAB 会沿行方向计算得到每一列的样本方差。
(3) 如果数据中存在 NaN 值,可以在 var 函数的最后加上'omitnan'参数来忽略 NaN.
v = [6 8 10 12 14];
var(v) % 样本方差,等价于 var(v,0) | 10 |
var(v,1) % 总体方差 | 8 |
% 下面看矩阵的例子
A = randi(10,4,5) | 9 7 10 10 5
10 1 10 5 10
2 3 2 9 8
10 6 10 2 10 |
var(A) % 每一列的样本方差
% 也可以写成 var(A,0)或者 var(A,0,1) | 14.9167 7.5833 16.0000 13.6667 5.5833 |
var(A,0,2) % 每一行的样本方差 | 4.7000
16.7000
11.7000
12.8000 |
A = [9 7 10 10 NaN;
10 NaN 10 5 10;
2 3 2 9 8;
10 6 10 2 10];
% 矩阵中存在 NaN 值
var(A, 0, 2) % 计算每一行的样本方差 |
NaN
NaN
11.7000
12.8000 |
% 忽略 NaN 值计算每一行的样本方差
var(A, 0, 2, 'omitnan') | 2.0000
6.2500
11.7000
12.8000 |
std :计算标准差( standard deviation)
标准差是方差的算术平方根, 它也是用来反应数据离散程度的一个统计量。那么问题来了, 既然有了方差为什么还需要标准差呢?这是因为方差和数据原本的量纲(即单位)是不一致的, 对方差的计算公式进行量纲分析容易看出, 方差的量纲是原始数据量纲的平方, 因此对方差开 根号,得到的标准差的量纲和原始数据的量纲一致。
在 MATLAB 中,我们可以使用std 函数计算样本标准差和总体标准差, 它和 var 函数的使 用方法完全相同。
v = [6 8 10 12 14];
std(v) % 样本标准差,等价于 std(v,0) | 3.1623 |
std(v,1) % 总体标准差 | 2.8284 |
% 下面看矩阵的例子
A = randi(10,4,5) | 9 7 10 10 5
10 1 10 5 10
2 3 2 9 8
10 6 10 2 10 |
std(A) % 每一列的样本标准差
% 也可以写成 std(A,0)或者 std(A,0,1) | 3.8622 2.7538 4.0000 3.6968 2.3629 |
std(A,0,2) % 每一行的样本标准差 | 2.1679
4.0866
3.4205
3.5777 |
A = [9 7 10 10 NaN;
10 NaN 10 5 10;
2 3 2 9 8;
10 6 10 2 10];
% 矩阵中存在 NaN 值
std(A, 0, 2) % 计算每一行的样本标准差 |
NaN
NaN
3.4205
3.5777 |
% 忽略 NaN 值计算每一行的样本标准差
std(A, 0, 2, 'omitnan') | 1.4142
2.5000
3.4205
3.5777 |
min : 求最小值(minimum value)
min 函数主要有两种用法:
用法一:求两个矩阵对应位置元素的最小值: min(A,B)。
A = [ 2 6 10
6 7 5
5 3 7
2 6 5]; | B = [ 1 1 6
3 6 9
9 4 9
4 8 2]; | % min(A,B)的结果: 1 1 6
3 6 5
5 3 7
2 6 2 |
矩阵 A 和矩阵 B 的大小可以不一样,只要保证矩阵 A 和矩阵 B 具有兼容的大小就能够计 算, MATLAB 矩阵运算中支持的兼容模式会在“3.1.2 算术运算”这一小节中详细介绍。
下面再举两个例子:表中第三列是运行 min(A, B)后返回的结果。
用法二:求向量或者矩阵中的最小值,可以指定沿什么维度计算并返回索引。
具体用法有以下三种:
(1)如果 A 是向量, 则 min(A)返回 A 中的最小值。如果 A 中有复数,则比较的是复数 的模长。
A = [5 6 7 3 5 3 10];
min(A) | 3 |
B = [4.5 3+4i 6];
min(B) | 4.5000 |
(2)如果 A 是矩阵,则 min(A, [ ], 1)沿着 A 的行方向求每一列的最小值,也可以简写为 min(A);min(A, [ ], 2)沿着 A 的列方向求每一行的最小值。这里的 1 和 2 表示矩阵的维度(dim)。
有同学可能会问: 为什么中间要加一个空向量[ ]? 如果不加的话, 就是将 A 中每个元素和 1 或者 2 比较大小,并返回较小值。
(3)在求向量或矩阵的最小值时, min 函数可以有两个返回值: [m, ind] = min(A). 第一 个返回值m 是我们要求的最小值,ind 是最小值在所在维度上的索引。如果最小元素出现多次, 则 ind 是最小值第一次出现位置的索引。
上面我们介绍了 min 函数的两种用法,如果向量或者矩阵中存在 NaN 值, min 函数会自 动忽略,大家不需要单独对 NaN 值进行处理。
max :求最大值(maximum value)
max 函数和 min 函数的用法完全相同,它是用来求最大值的函数,下面我们举几个例子。