17.5 工具函数

 
y = ceil (x)

返回不小于 x 的最小整数。

这相当于向正无穷方向取整。

如果 x 是复数,则返回 ceil (real (x)) + ceil (imag (x)) * I

ceil ([-2.7, 2.7])
    ⇒  -2    3

另请参阅: floorroundfix

 
y = fix (x)

截断 x 的小数部分并返回整数部分。

这相当于向零方向取整。如果 x 是复数,则返回 fix (real (x)) + fix (imag (x)) * I

fix ([-2.7, 2.7])
   ⇒  -2    2

另请参阅: ceilfloorround

 
y = floor (x)

返回不大于 x 的最大整数。

这相当于向负无穷方向取整。如果 x 是复数,则返回 floor (real (x)) + floor (imag (x)) * I

floor ([-2.7, 2.7])
     ⇒  -3    2

另请参阅: ceilroundfix

 
y = round (x)

返回最接近 x 的整数。

如果 x 是复数,则返回 round (real (x)) + round (imag (x)) * I。如果存在两个最接近的整数,则返回离零更远的那一个。

round ([-2.7, 2.7])
     ⇒  -3    3

另请参阅: ceilfloorfixroundb

 
y = roundb (x)

返回最接近 x 的整数。如果存在两个最接近的整数,则返回偶数的那一个(银行家舍入)。

如果 x 是复数,则返回 roundb (real (x)) + roundb (imag (x)) * I

另请参阅: round

 
m = max (x)
m = max (x, [], dim)
m = max (x, [], vecdim)
m = max (x, [], "all")
m = max (x, [], nanflag)
[m, im] = max (…)
[m, im] = max (…, "linear")
m = max (x, y)
m = max (x, y, nanflag)
… = max (…, "ComparisonMethod", method)

查找数组 x 中的最大值。

如果 x 是向量,则 max (x) 返回 x 中元素的最大值。

如果 x 是矩阵,则 max (x) 返回一个行向量,其中的每个元素包含 x 中对应列的最大值。

如果 x 是多维数组,则 max (x) 沿 x 的第一个非单一维度计算最大值。

可选输入 dim 指定要操作的维度,必须是正整数。指定 x 的任何单一维度(包括超过 ndims (x) 的任何维度)将返回 x 本身。

使用输入 vecdim(一个不重复维度的向量)指定多个维度,将沿 vecdim 定义的数组切片进行操作。如果 vecdim 索引了 x 的所有维度,则相当于选项 "all"。任何大于 ndims (x) 的维度都将被忽略。

将维度指定为 "all" 将使 maxx 的所有元素进行操作,等价于 max (x(:))

如果使用两个输出参数调用,max 还会返回 x 中最大值的第一索引。第二个输出参数仅在 max 对单个输入数组进行操作时有效。设置 "linear" 标志将返回 x 中相应最小值的线性索引。

如果使用两个输入数组(xy)调用,max 根据广播规则返回逐元素的最大值。

可选变量 nanflag 指定是否在计算中包含或排除 NaN 值,可与任何先前指定的输入参数组合使用。nanflag 的默认值为 "omitnan",表示忽略计算中的 NaN 值。要包含 NaN 值,请将 nanflag 设置为 "includenan",在这种情况下,如果操作维度上的任何元素是 NaN,则 max 将返回 NaN

可选的 "ComparisonMethod" 配对参数指定数值输入的比较方法,适用于单个输入和两个输入数组。method 可以取以下任何值:

'auto'

这是默认方法,当 x 为实数时按 real (x) 比较,当 x 为复数时按 abs (x) 比较。

'real'

x 为实数或复数时按 real (x) 比较元素。对于实部相等的元素,再按 imag (x) 进行第二次比较。

'abs'

x 为实数或复数时按 abs (x) 比较元素。对于幅度相等的元素,再按 angle (x)-\pi\pi 的区间内进行第二次比较。

另请参阅: mincummaxcummin

 
m = min (x)
m = min (x, [], dim)
m = min (x, [], vecdim)
m = min (x, [], "all")
m = min (x, [], nanflag)
[m, im] = min (…)
[m, im] = min (…, "linear")
m = min (x, y)
m = min (x, y, nanflag)
… = min (…, "ComparisonMethod", method)

查找数组 x 中的最小值。

如果 x 是向量,则 min (x) 返回 x 中元素的最小值。

如果 x 是矩阵,则 min (x) 返回一个行向量,其中的每个元素包含 x 中对应列的最小值。

如果 x 是多维数组,则 min (x) 沿 x 的第一个非单一维度计算最小值。

可选输入 dim 指定要操作的维度,必须是正整数。指定 x 的任何单一维度(包括超过 ndims (x) 的任何维度)将返回 x 本身。

使用输入 vecdim(一个不重复维度的向量)指定多个维度,将沿 vecdim 定义的数组切片进行操作。如果 vecdim 索引了 x 的所有维度,则相当于选项 "all"。任何大于 ndims (x) 的维度都将被忽略。

将维度指定为 "all" 将使 minx 的所有元素进行操作,等价于 min (x(:))

如果使用两个输出参数调用,min 还会返回 x 中最小值的第一索引。第二个输出参数仅在 min 对单个输入数组进行操作时有效。设置 "linear" 标志将返回 x 中相应最小值的线性索引。

如果使用两个输入数组(xy)调用,min 根据广播规则返回逐元素的最小值。

可选变量 nanflag 指定是否在计算中包含或排除 NaN 值,可与任何先前指定的输入参数组合使用。nanflag 的默认值为 "omitnan",表示忽略计算中的 NaN 值。要包含 NaN 值,请将 nanflag 设置为 "includenan",在这种情况下,如果操作维度上的任何元素是 NaN,则 min 将返回 NaN

可选的 "ComparisonMethod" 配对参数指定数值输入的比较方法,适用于单个输入和两个输入数组。method 可以取以下任何值:

'auto'

这是默认方法,当 x 为实数时按 real (x) 比较,当 x 为复数时按 abs (x) 比较。

'real'

x 为实数或复数时按 real (x) 比较元素。对于实部相等的元素,再按 imag (x) 进行第二次比较。

'abs'

x 为实数或复数时按 abs (x) 比较元素。对于幅度相等的元素,再按 angle (x)-\pi\pi 的区间内进行第二次比较。

另请参阅: maxcummincummax

 
M = cummax (x)
m = cummax (x, dim)
m = cummax (x, vecdim)
m = cummax (x, "all")
m = cummax (…, direction)
m = cummax (x, nanflag)
[m, im] = cummax (…)
[m, im] = cummax (…, "linear")
… = cummax (…, "ComparisonMethod", method)

从数组 x 返回累积最大值。

如果 x 是向量,则 cummax (x) 返回一个与 x 大小相同的向量,包含 x 的累积最大值。

如果 x 是矩阵,则 cummax (x) 返回一个大小相同的矩阵,包含沿 x 每列的累积最大值。

如果 x 是多维数组,则 cummax(x) 返回一个大小相同的数组,沿 x 的第一个非单一维度计算累积最大值。

输出 y 的类型与输入 x 的类型相同,除非 x 是逻辑型,在这种情况下 y 为 double 类型。

可选输入 dim 指定要操作的维度,必须是正整数。指定 x 的任何单一维度(包括超过 ndims (x) 的任何维度)将返回 x 本身。

使用输入 vecdim(一个不重复维度的向量)指定多个维度,将沿 vecdim 定义的数组切片进行操作。如果 vecdim 索引了 x 的所有维度,则相当于选项 "all"。任何大于 ndims (x) 的维度都将被忽略。

将维度指定为 "all" 将使 cummaxx 的所有元素进行操作,等价于 cummax (x(:))

可选输入 direction 指定操作维度的遍历方式,可以取以下值:

"forward"(默认)

累积最大值从操作维度的开始(索引 1)到结束进行计算。

"reverse"

累积最大值从操作维度的结束到开始进行计算。

可选变量 nanflag 指定是否在计算中包含或排除 NaN 值,可与任何先前指定的输入参数组合使用。nanflag 的默认值为 "omitnan",表示忽略计算中的 NaN 值。要包含 NaN 值,请将 nanflag 设置为 "includenan",在这种情况下,如果操作维度上的任何元素是 NaN,则 max 将返回 NaN

如果使用两个输出参数调用,cummax 还会返回 x 中最大值的第一索引。设置 "linear" 标志将返回 x 中相应最小值的线性索引。

可选的 "ComparisonMethod" 配对参数指定数值输入的比较方法,适用于单个输入和两个输入数组。method 可以取以下任何值:

'auto'(默认)

x 为实数时按 real (x) 比较元素,当 x 为复数时按 abs (x) 比较。

'real'

x 为实数或复数时按 real (x) 比较元素。对于实部相等的元素,再按 imag (x) 进行第二次比较。

'abs'

x 为实数或复数时按 abs (x) 比较元素。对于幅度相等的元素,再按 angle (x)-\pi\pi 的区间内进行第二次比较。

另请参阅: cumminmaxmin

 
M = cummin (x)
m = cummin (x, dim)
m = cummin (x, vecdim)
m = cummin (x, "all")
m = cummin (…, direction)
m = cummin (x, nanflag)
[m, im] = cummin (…)
[m, im] = cummin (…, "linear")
… = cummin (…, "ComparisonMethod", method)

从数组 x 返回累积最小值。

如果 x 是向量,则 cummin (x) 返回一个与 x 大小相同的向量,包含 x 的累积最小值。

如果 x 是矩阵,则 cummin (x) 返回一个大小相同的矩阵,包含沿 x 每列的累积最小值。

如果 x 是多维数组,则 cummin(x) 返回一个大小相同的数组,沿 x 的第一个非单一维度计算累积最小值。

输出 y 的类型与输入 x 的类型相同,除非 x 是逻辑型,在这种情况下 y 为 double 类型。

可选输入 dim 指定要操作的维度,必须是正整数。指定 x 的任何单一维度(包括超过 ndims (x) 的任何维度)将返回 x 本身。

使用输入 vecdim(一个不重复维度的向量)指定多个维度,将沿 vecdim 定义的数组切片进行操作。如果 vecdim 索引了 x 的所有维度,则相当于选项 "all"。任何大于 ndims (x) 的维度都将被忽略。

将维度指定为 "all" 将使 cumminx 的所有元素进行操作,等价于 cummin (x(:))

可选输入 direction 指定操作维度的遍历方式,可以取以下值:

"forward"(默认)

累积最小值从操作维度的开始(索引 1)到结束进行计算。

"reverse"

累积最小值从操作维度的结束到开始进行计算。

可选变量 nanflag 指定是否在计算中包含或排除 NaN 值,可与任何先前指定的输入参数组合使用。nanflag 的默认值为 "omitnan",表示忽略计算中的 NaN 值。要包含 NaN 值,请将 nanflag 设置为 "includenan",在这种情况下,如果操作维度上的任何元素是 NaN,则 max 将返回 NaN

如果使用两个输出参数调用,cummin 还会返回 x 中最小值的第一索引。设置 "linear" 标志将返回 x 中相应最小值的线性索引。

可选的 "ComparisonMethod" 配对参数指定数值输入的比较方法,适用于单个输入和两个输入数组。method 可以取以下任何值:

'auto'(默认)

x 为实数时按 real (x) 比较元素,当 x 为复数时按 abs (x) 比较。

'real'

x 为实数或复数时按 real (x) 比较元素。对于实部相等的元素,再按 imag (x) 进行第二次比较。

'abs'

x 为实数或复数时按 abs (x) 比较元素。对于幅度相等的元素,再按 angle (x)-\pi\pi 的区间内进行第二次比较。

另请参阅: cummaxminmax

 
h = hypot (x, y)
h = hypot (x, y, z, …)

逐元素计算 xy 平方和的平方根。

这等价于 sqrt (x.^2 + y.^2),但计算方法避免了 xy 为大值时可能发生的溢出。

hypot 也可以使用超过 2 个参数调用;在这种情况下,参数从左到右累积:

hypot (hypot (x, y), z)
hypot (hypot (hypot (x, y), z), w), etc.
 
dx = gradient (m)
[dx, dy, dz, …] = gradient (m)
[…] = gradient (m, s)
[…] = gradient (m, sx, sy, sz, …)
[…] = gradient (f, x0)
[…] = gradient (f, x0, s)
[…] = gradient (f, x0, sx, sy, …)

计算采样数据或函数的梯度。

                  d                d                 d
grad F(x,y,z)  =  -- F(x,y,z) i  + -- F(x,y,z) j  +  -- F(x,y,z) k
                   dx               dy                dz

如果 m 是向量,则计算 m 的一维数值梯度。如果 m 是矩阵,则对每个维度计算梯度。返回参数是每个维度在指定采样点处的估计偏导数。

数据点之间的默认间距为 1。可以使用 s 参数指定恒定点间距。如果 s 是标量,则该单一间距值用于所有维度。否则,可以通过 sx、… 参数提供单独的间距值。标量值表示等距间距。sx、… 参数的向量值表示该维度的坐标。其长度必须与 m 的相应维度匹配。

如果第一个参数 f 是函数句柄,则计算函数在 x0 中各点的梯度。与采样数据一样,可以通过 sdxdy、… 参数设置用于估计梯度的点之间的间距值。默认使用间距 1,但这通常过大,除非函数变化非常缓慢,通常需要指定更小的采样间距。

示例:cos 的数值梯度(解析梯度为 -sin

gradient (@cos, pi/2, .1)
⇒  -0.9983
-sin (pi/2)
⇒  -1

编程说明: 内部数据点的值使用中心差分近似计算。

y'(i) = 1/2 * (y(i+1) - y(i-1)).

在边界点应用线性外推。

y'(1) = y(2) - y(1).

另请参阅: diffdel2

 
z = dot (x, y)
z = dot (x, y, dim)

计算两个向量的点积。

如果 xy 是矩阵,则沿第一个非单一维度计算点积。

如果给出了可选参数 dim,则沿该维度计算点积。

实现说明:这等价于 sum (conj (X) .* Y, dim),但避免了创建临时数组,速度更快。当 XY 是列向量时,结果等价于 X' * Y。虽然 dot 对整数数组也有定义,但由于整数对象的有限范围,输出可能与预期结果不同。

另请参阅: crossdivergencetensorprod

 
z = cross (x, y)
z = cross (x, y, dim)

计算两个三维向量 xy 的向量叉积。

如果 xy 是数组,则沿第一个具有三个元素的维度应用叉积。

可选参数 dim 强制沿指定维度计算叉积。如果指定维度的尺寸不是三个元素,将产生错误。

在复数输出的情况下,输出相对于输入的正交性也得到满足,且满足条件

dot (conj (z), x) ≡ dot (conj (z), y) = 0

dot (z, x) = 0dot (z, y) = 0 不成立。另请注意,使用内积代替 dot 函数:

z(:).' * x(:) ≡ z(:).' * y(:) = 0

将满足向量输入的正交条件。

示例代码:

cross ([1, 1, 0], [0, 1, 1])
  ⇒ 
       1  -1   1
cross (magic (3), eye (3), 2)
  ⇒ 
       0   6  -1
      -7   0   3
       9  -4   0

另请参阅: dotcurldivergenceconj

 
div = divergence (x, y, z, fx, fy, fz)
div = divergence (fx, fy, fz)
div = divergence (x, y, fx, fy)
div = divergence (fx, fy)

计算由数组 fxfyfz(或 fxfy)给出的向量场的散度。

                  d               d               d
div F(x,y,z)  =   -- F(x,y,z)  +  -- F(x,y,z)  +  -- F(x,y,z)
                   dx              dy              dz

向量场的坐标可以通过参数 xyzxy 分别给出。

另请参阅: curlgradientdel2dot

 
[cx, cy, cz, v] = curl (x, y, z, fx, fy, fz)
[cz, v] = curl (x, y, fx, fy)
[…] = curl (fx, fy, fz)
[…] = curl (fx, fy)
v = curl (…)

计算由数组 fxfyfz(或 fxfy)给出的向量场的旋度。

                  / d         d       d         d       d         d     \
curl F(x,y,z)  =  | -- Fz  -  -- Fy,  -- Fx  -  -- Fz,  -- Fy  -  -- Fx |
                   \ dy        dz      dz        dx      dx        dy    /

向量场的坐标可以通过参数 xyzxy 分别给出。v 计算二维输入时沿 z 轴方向的角速度向量的标量分量。对于三维输入,在每个网格点处沿该点向量场方向计算标量旋转量。

另请参阅: divergencegradientdel2cross

 
L = del2 (M)
L = del2 (M, h)
L = del2 (M, dx, dy, …)

计算离散拉普拉斯算子。

对于二维矩阵 M(x, y),定义为

      1    / d^2            d^2         \
L  = --- * | ---  M(x,y) +  ---  M(x,y) |
      4    \ dx^2           dy^2        /

对于 N 维数组,括号中的和将扩展以包括额外更高维度上的二阶导数。

评估点之间的间距可以由 h 定义,它是一个标量,定义所有维度上的等距间距。或者,每个维度的间距可以分别由 dxdy 等定义。标量间距参数定义等距间距,而向量参数可用于指定可变间距。间距向量的长度必须与 M 的相应维度匹配。默认间距值为 1。

少于 3 个数据点的维度将被跳过。边界点通过内部点的线性外推计算。

示例:2*x^3 的二阶导数

f = @(x) 2*x.^3;
dd = @(x) 12*x;
x = 1:6;
L = 4*del2 (f(x));
assert (L, dd (x));

另请参阅: gradientdiff

 
f = factorial (n)

返回 n 的阶乘,其中 n 是非负实数整数。

如果 n 是标量,则等价于 prod (1:n)。对于向量或矩阵参数,返回数组中每个元素的阶乘。

对于非整数,请使用广义阶乘函数 gamma。请注意,阶乘函数增长非常快,即使使用双精度值,如果 n > 171 也会发生溢出。对于这种情况,请考虑使用 gammaln

另请参阅: prodgammagammaln

 
pf = factor (q)
[pf, n] = factor (q)

返回 q 的质因数分解。

质因数分解定义为 prod (pf) == q,其中 pf 的每个元素都是质数。如果 q == 1,则返回 1。输出 pf 与输入具有相同的数值类型。

使用两个输出参数时,返回唯一的质因数 pf 及其重数。即 prod (pf .^ n) == q

实现说明:如果输入 qsingledouble 类型,则它不能超过相应的 flintmax。对于更大的输入,如果它们小于 2^64,则将其转换为 uint64

factor (uint64 (18446744073709011493))
   ⇒      571111    761213  42431951

对于更大的输入,如果您已安装并加载了 Symbolic 包,请使用 sym

factor (sym ('9444733049654361449941'))
   ⇒  (sym)
              1           1
  1099511627689 ⋅8589934669

另请参阅: gcdlcmisprimeprimes

 
g = gcd (a1, a2, …)
[g, v1, …] = gcd (a1, a2, …)

计算 a1a2... 的最大公约数。

所有参数必须具有相同的大小或为标量。对于数组,逐元素计算最大公约数。所有元素必须是普通整数或高斯(复数)整数。请注意,对于高斯整数,gcd 仅在一个相位因子(乘以 1、-1、i 或 -i)下是唯一的,因此在四种可能的 gcd 中返回任意一个。

可选返回参数 v1、… 包含整数向量,使得

g = v1 .* a1 + v2 .* a2 + ...

示例代码:

gcd ([15, 9], [20, 18])
   ⇒   5  9

编程提示:要查找单个数组中所有元素的 GCD,请使用 num2cell 而不是嵌套调用或循环:

x = [30 42 70 105];    # 输入向量或数组
gcd (num2cell (x) {:})
   ⇒      1

另请参阅: lcmfactorisprime

 
l = lcm (x, y)
l = lcm (x, y, …)

计算 xy 或所有参数列表的最小公倍数。

所有输入必须具有相同的大小或为标量。所有元素必须是实数整数或高斯(复数)整数。对于复数输入,结果仅在相位因子(乘以 +1、+i、-1 或 -i)下是唯一的,并且任意返回四个结果之一。

示例代码:

lcm (5:8, 9:12)
   ⇒   45  30  77  24

编程提示:要查找单个数组中所有元素的 LCM,请使用 num2cell 而不是嵌套调用或循环:

x = 1:10;    # 输入向量或数组
lcm (num2cell (x) {:})
   ⇒      2520

另请参阅: factorgcdisprime

 
r = rem (x, y)

返回除法 x / y 的余数。

使用表达式计算余数:

x - y .* fix (x ./ y)

如果参数的维度不一致,或任一参数为复数,则会打印错误消息。

编程说明:在使用浮点数(double、single)计算时,为了与 MATLAB 兼容,距离整数在几个 eps 范围内的值将在计算前四舍五入为该整数。任何大于 flintmax(double 为 2^53)的浮点整数将无法正确计算。对于更大的整数值,请在调用此函数之前将输入转换为 uint64

按照惯例:

rem (x, 0) = NaN  如果 x 是浮点变量
rem (x, 0) = 0    如果 x 是整数变量
rem (x, y)  返回具有 x 符号位的结果

相反的约定请参见 mod 函数。通常,在计算两个 数相除的余数时,rem 是最佳选择。对于负数或周期性的值,mod 是更好的选择。

另请参阅: mod

 
m = mod (x, y)

计算 xy 的模数。

从概念上讲,这由以下公式给出:

x - y .* floor (x ./ y)

并且写成这样以使得为整数类型返回正确的模数。此函数正确处理负值。即 mod (-1, 3) 是 2,而不是 rem (-1, 3) 返回的 -1。

如果参数的维度不一致,或任一参数为复数,则会产生错误结果。

编程说明:在使用浮点数(double、single)计算时,为了与 MATLAB 兼容,距离整数在几个 eps 范围内的值将在计算前四舍五入为该整数。任何大于 flintmax(double 为 2^53)的浮点整数将无法正确计算。对于更大的整数值,请在调用此函数之前将输入转换为 uint64

按照惯例:

mod (x, 0) = x
mod (x, y)      返回具有 y 符号位的结果

相反的约定请参见 rem 函数。通常,当任何输入是负数或值具有周期性时,mod 是比 rem 更好的选择。

另请参阅: rem

 
p = primes (n)

返回所有小于或等于 n 的素数。

输出的数据类型(double、single、uint32 等)与 n 的输入类型相同。使用的算法是埃拉托色尼筛法。

注意:要获取特定数量 n 的素数,请调用 list_primes (n)。或者,调用 primes (n*log (k*n))(1:n),其中 k 大约为 5 或 6。这是因为从一个素数到下一个素数的距离平均与素数的对数成正比。积分后,大约有 n 个素数小于 n * log (5*n)

另请参阅: list_primesisprime

 
p = list_primes ()
p = list_primes (n)

列出前 n 个素数。

如果未指定 n,则列出前 25 个素数。

另请参阅: primesisprime

 
y = sign (x)

计算 signum(符号)函数。

定义为:

           -1, x < 0;
sign (x) =  0, x = 0;
             1, x > 0.

对于复数参数,sign 返回 x ./ abs (x)

请注意 sign (-0.0) 为 0。尽管 IEEE 754 浮点标准允许零带符号,但 0.0 和 -0.0 比较相等。如果您必须测试零是否带符号,请使用 signbit 函数。

另请参阅: signbit

 
y = signbit (x)

如果 x 的值设置了符号位,则返回逻辑真,否则返回假。

此行为与其他逻辑函数一致。请参阅 逻辑值。该行为与 C 语言函数不同,C 语言函数在设置了符号位时返回非零值。

这与 x < 0.0 不同,因为 IEEE 754 浮点标准允许零带符号。比较 -0.0 < 0.0 为假,但 signbit (-0.0) 将返回非零值。

另请参阅: sign