16.1查找元素和检查条件

函数anyall对于确定矩阵的任何元素或所有元素是否满足某些条件是有用的。这里的find函数在确定矩阵的哪些元素满足特定条件时也很有用。

 
: tf = any (x)
: tf = any (x, dim)

对于向量参数,如果向量的任何元素为非零,则返回true(逻辑1)。

对于矩阵自变量,返回一个逻辑1和0的行向量,每个元素指示矩阵相应列的任何元素是否为非零。例如

any (eye (2, 4))
 ⇒ [ 1, 1, 0, 0 ]

如果可选参数dim已提供,则按dim尺寸起作用,例如

any (eye (2, 4), 2)
 ⇒ [ 1; 1 ]

详见: all.

广告
 
: tf = all (x)
: tf = all (x, dim)

对于向量参数,如果向量的所有元素都非零,则返回true(逻辑1)。

对于矩阵自变量,返回逻辑1和0的行向量,每个元素指示矩阵相应列的所有元素是否为非零。例如

all ([2, 3; 1, 0])
    ⇒ [ 1, 0 ]

如果可选参数dim已提供,则按dim尺寸起作用.

详见: any.

广告

因为比较运算符(详见比较运算符)返回1和0的矩阵,很容易测试矩阵的许多方面,而不仅仅是元素是否为非零。例如

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

测试一个随机的5乘5矩阵,看看它的所有元素是否都小于0.9。

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

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

返回xy异或.

对于布尔表达式xy,xor (x, y)为真,当且仅当xy为真。否则,如果xy都为真或都是假的,xor返回false。

xor操作的真值表为

x y z
- - -
0 0 0
1 0 1
0 1 1
1 1 0

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

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

详见: and, or, not.

广告
 
: 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) 则返回一个空矩阵。

详见: sort, merge.

广告
 
: tf = isinf (x)

返回一个逻辑数组,当x的元素为无穷时,返回true,否则返回false。

例如

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

详见: isfinite, isnan, isna.

广告
 
: tf = isnan (x)

返回一个逻辑数组,当x的元素为NaN时,返回true,否则返回false。

NA值也被认为是NaN值。例如

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

详见: isna, isinf, isfinite.

广告
 
: tf = isfinite (x)

返回一个逻辑数组,当x的元素是有限数时,返回true,否则返回false。

例如

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

详见: isinf, isnan, isna.

广告
 
: [err, yi, …] = common_size (xi, …)

确定所有输入参数是标量或者能统一为相同尺寸。

如果可以,那么err为0,并且yi是统一为相同尺寸的矩阵,尺寸等于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 ]

这对于实现参数可以是标量或能统一为相同尺寸的函数非常有用。

详见: size, size_equal, numel, ndims.

广告
 
: 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指数。但是,索引总是按顺序返回。

如果指定两个输出,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 x n x p x …的多维数组,j包含列位置,就好像x被展平为大小为m x (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

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

广告
b

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

广告
l

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

广告
r

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

广告

注意如果table未对结果进行排序,那么lookup的结果不可预测。

广告

如果您希望检查变量是否存在,而不是其元素可能具有的属性,详见Status of Variables.


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

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