16.1 查找元素和检查条件

函数 anyall 可用于判断矩阵中的某些元素或所有元素是否满足特定条件。 find 函数也可用于确定矩阵中哪些元素满足特定条件。

 
tf = any (x)
tf = any (x, dim)
tf = any (x, vecdim)
tf = any (x, "all")

如果有任何元素非零或为真,则返回 true(逻辑 1)。

如果 x 是向量,则 any (x) 在向量的任何元素非零时返回 true(逻辑 1)。

如果 x 是矩阵,则 any (x) 返回一个由逻辑 1 和 0 组成的行向量,其中每个元素指示矩阵对应列中是否有任何元素非零。

如果 x 是数组,则 any(x) 沿着 x 的第一个非单例维度进行操作, 并返回一个逻辑数组,其大小与 x 相同,只是操作维度变为 1。

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

通过输入 vecdim(一个无重复维度的向量)指定多个维度,将沿着 vecdim 定义的数组切片进行操作。 如果 vecdim 索引了 x 的所有维度,则相当于选项 "all"vecdim 中大于 ndims (x) 的任何维度将被忽略。 vecdim 指定的维度的大小在返回的逻辑数组中变为 1。

将维度指定为 "all" 将导致 anyx 的所有元素进行操作, 等价于 any (x(:))

另请参阅: all

 
tf = all (x)
tf = all (x, dim)
tf = all (x, vecdim)
tf = all (x, "all")

如果所有元素都非零或为真,则返回 true(逻辑 1)。

如果 x 是向量,则 all (x) 在向量的所有元素都非零时返回 true(逻辑 1)。

如果 x 是矩阵,则 all (x) 返回一个由逻辑 1 和 0 组成的行向量,其中每个元素指示矩阵对应列中的所有元素是否都非零。

如果 x 是数组,则 all(x) 沿着 x 的第一个非单例维度进行操作, 并返回一个逻辑数组,其大小与 x 相同,只是操作维度变为 1。

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

通过输入 vecdim(一个无重复维度的向量)指定多个维度,将沿着 vecdim 定义的数组切片进行操作。 如果 vecdim 索引了 x 的所有维度,则相当于选项 "all"vecdim 中大于 ndims (x) 的任何维度将被忽略。 vecdim 指定的维度的大小在返回的逻辑数组中变为 1。

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

另请参阅: any

由于比较运算符(参见 比较运算符)返回由 1 和 0 组成的矩阵, 因此可以轻松测试矩阵的多种属性,而不仅仅是元素是否非零。例如,

all (all (rand (5) < 0.9))
     ⇒  0

测试一个 5×5 的随机矩阵,检查其所有元素是否都小于 0.9。

请注意,在条件上下文中(例如 ifwhile 语句的测试子句), Octave 将测试视为您输入了 all (all (condition))

 
z = xor (x, y)
z = xor (x1, x2, …)

返回 xy异或结果。

对于布尔表达式 xyxor (x, y) 在且仅当 xy 其中之一为真时为真。 否则,如果 xy 同时为真或同时为假,xor 返回假。

异或运算的真值表如下:

xyz
---
000
101
011
110

如果给定两个以上的参数,则异或运算从左到右累积应用:

(...((x1 XOR x2) XOR x3) XOR ...)

另请参阅: andornot

 
y = diff (x)
y = diff (x, k)
y = diff (x, k, dim)

如果 x 是长度为 n 的向量,则 diff (x) 是一阶差分向量 x(2) - x(1), …, x(n) - x(n-1)。

如果 x 是矩阵,则 diff (x) 是沿着第一个非单例维度的列差分矩阵。

第二个参数是可选的。如果提供了,diff (xk)(其中 k 是非负整数) 返回 k 阶差分。k 可能大于矩阵的第一个非单例维度。 在这种情况下,diff 会继续沿着下一个非单例维度进行差分。

进行差分的维度可以通过可选变量 dim 显式指定。在这种情况下,将沿着此维度计算 k 阶差分。 如果 k 超过了 size (xdim),则返回空矩阵。

另请参阅: sortmerge

 
tf = isinf (x)

返回一个逻辑数组,其中 x 的元素为无穷大时对应位置为真,否则为假。

例如:

isinf ([13, Inf, NA, NaN])
      ⇒  [ 0, 1, 0, 0 ]

另请参阅: isfiniteisnanisna

 
tf = isnan (x)

返回一个逻辑数组,其中 x 的元素为 NaN 值时对应位置为真,否则为假。

NA 值也被视为 NaN 值。例如:

isnan ([13, Inf, NA, NaN])
      ⇒  [ 0, 0, 1, 1 ]

另请参阅: isnaisinfisfinite

 
tf = isfinite (x)

返回一个逻辑数组,其中 x 的元素为有限值时对应位置为真,否则为假。

例如:

isfinite ([13, Inf, NA, NaN])
     ⇒  [ 1, 0, 0, 0 ]

另请参阅: isinfisnanisna

 
[err, yi, …] = common_size (xi, …)

确定所有输入参数是否为标量或具有相同的大小。

如果为真,则 err 为零,且 yi 是一个具有相同大小的矩阵, 其中所有条目等于 xi(如果 xi 是标量)或等于 xi 本身。 如果无法将输入统一为相同大小,则 err 为 1,且 yixi。例如:

[err, a, b] = common_size ([1 2; 3 4], 5)
     ⇒  err = 0
     ⇒  a = [ 1, 2; 3, 4 ]
     ⇒  b = [ 5, 5; 5, 5 ]

这对于实现参数可以是标量或具有相同大小的函数非常有用。

另请参阅: sizesize_equalnumelndims

 
idx = find (x)
idx = find (x, n)
idx = find (x, n, direction)
[i, j] = find (…)
[i, j, v] = find (…)

返回矩阵中非零元素的索引向量。如果 x 是行向量则返回行向量,否则返回列向量。

为了获得每个矩阵元素的单一索引,Octave 将矩阵的列视为一个长向量(类似于 Fortran 数组的存储方式)。例如:

find (eye (2))
  ⇒  [ 1; 4 ]

如果提供两个输入,n 表示要从矩阵或向量的开头查找的最大元素数量。

如果提供三个输入,direction 应取 "first""last" 之一, 分别表示只查找前 n 个或后 n 个索引。但返回的索引始终按升序排列。

如果请求两个输出,find 返回矩阵中非零元素的行索引和列索引。例如:

[i, j] = find (2 * eye (2))
    ⇒  i = [ 1; 2 ]
    ⇒  j = [ 1; 2 ]

如果请求三个输出,find 还会返回包含非零值的向量。例如:

[i, j, v] = find (3 * eye (2))
       ⇒  i = [ 1; 2 ]
       ⇒  j = [ 1; 2 ]
       ⇒  v = [ 3; 3 ]

如果 x 是大小为 m×n×p×… 的多维数组,则 j 包含列位置,就好像 x 被展平为大小为 m×(n+p+…) 的二维矩阵一样。

请注意,此函数对于稀疏矩阵特别有用,因为它将非零元素提取为向量,然后可以用这些向量创建原始矩阵。例如:

sz = size (a);
[i, j, v] = find (a);
b = sparse (i, j, v, sz(1), sz(2));

另请参阅: nonzeros

 
idx = lookup (table, y)
idx = lookup (table, y, opt)

已排序的表中查找值。

此函数通常用作插值的前奏。

如果表是递增的,长度为 N,且 idx = lookup (table, y),则对于表内的所有 y(i), 有 table(idx(i)) <= y(i) < table(idx(i+1))。 如果 y(i) < table(1),则 idx(i) 为 0。 如果 y(i) >= table(end)isnan (y(i)),则 idx(i) 为 N。

如果表是递减的,则测试条件相反。对于非严格单调的表,空区间总是被跳过。 如果 table 不是单调的,或者 table 包含 NaN,则结果未定义。

查找的复杂度为 O(M*log(N)),其中 M 是 y 的大小。 在特殊情况当 y 也是已排序时,复杂度为 O(min (M*log(N), M+N))。

tabley 也可以是字符串的元胞数组(或者 y 可以是单个字符串)。 在这种情况下,使用字典序比较进行字符串查找。

如果指定了 opts,则它必须是一个由字母组成的字符串,表示附加选项。

m

匹配(Match)。如果 y(i) 出现在表中,则 table(idx(i)) == y(i); 否则 idx(i) 为零。

b

布尔(Boolean)。idx(i) 是逻辑值 1 或 0,指示 y(i) 是否包含在表中。

l

向左(Left)。对于数值查找,最左侧子区间应扩展到负无穷大(即所有索引至少为 1)。

r

向右(Right)。对于数值查找,最右侧子区间应扩展到正无穷大(即所有索引至多为 N-1)。

注意:如果 table 未排序,则 lookup 的结果将是不可预测的。

如果您希望检查变量是否存在(而不是其元素可能具有的属性),请参见 变量的状态


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4