Main Content

ismembertol

容差范围内的集合成员

说明

示例

LIA = ismembertol(A,B,tol) 返回一个包含逻辑值 1 (true) 的数组,其中 A 的元素处于 B 中元素的容差范围内。否则,该数组包含逻辑值 0 (false)。满足以下条件时,uv 这两个值位于容差范围内

abs(u-v) <= tol*max(abs([A(:);B(:)]))

即,ismembertol 基于数据量级调整 tol 输入。

ismembertol 类似于 ismember。而 ismember 执行精确比较,ismembertol 使用容差执行比较。

示例

LIA = ismembertol(A,B) 对单精度输入使用默认容差 1e-6,对双精度输入使用默认容差 1e-12

示例

[LIA,LocB] = ismembertol(___) 还返回数组 LocB,其中包含 A 中作为 B 成员的每个元素在 B 中的索引位置。您可以使用上述语法中的任何输入参量。

示例

[___] = ismembertol(___,Name,Value) 使用一个或多个名称-值对组指定的其他选项,这些选项使用上述语法中的任意输入或输出参量组合。例如,ismembertol(A,B,'ByRows',true) 比较 AB 的行并返回逻辑列向量。

示例

全部折叠

创建向量 x。通过变换和取消变换 x 来获取第二个向量 y。此变换会向 y 中引入舍入误差。

x = (1:6)'*pi;
y = 10.^log10(x);

通过取差值来验证 xy 不同。

x-y
ans = 6×1
10-14 ×

    0.0444
         0
         0
         0
         0
   -0.3553

使用 ismember 以查找 x 内位于 y 中的元素。ismember 函数执行精确比较并确定 x 中的某些矩阵元素不是 y 的成员。

lia = ismember(x,y)
lia = 6x1 logical array

   0
   1
   1
   1
   1
   0

使用 ismembertol 执行使用较小容差的比较。ismembertol 将容差范围内的元素视为相等元素并确定 x 中的所有元素都为 y 的成员。

LIA = ismembertol(x,y)
LIA = 6x1 logical array

   1
   1
   1
   1
   1
   1

默认情况下,ismembertol 会查找位于容差范围内的元素,但还可以查找位于容差范围内的矩阵

创建一个数值矩阵 A。通过变换和取消变换 A 来获取第二个矩阵 B。此变换会向 B 引入舍入差异。

A = [0.05 0.11 0.18; 0.18 0.21 0.29; 0.34 0.36 0.41; ...
    0.46 0.52 0.76; 0.82 0.91 1.00];
B = log10(10.^A);

使用 ismember 查找 A 内位于 B 中的行。ismember 执行精确比较并因此确定 A 中的大多数行都不是 B 的成员,即使其中某些行相差的量很小。

lia = ismember(A,B,'rows')
lia = 5x1 logical array

   0
   0
   0
   0
   1

使用 ismembertol 执行使用较小容差的比较。ismembertol 将容差范围内的元素视为相等元素并确定 A 中的所有行都为 B 的成员。

LIA = ismembertol(A,B,'ByRows',true)
LIA = 5x1 logical array

   1
   1
   1
   1
   1

创建两个随机数向量,并使用容差确定 A 中的那些值同时也是 B 的成员。将 OutputAllIndices 指定为 true 以返回 B 中位于 A 中对应元素容差范围内的元素的所有索引。

rng(5)
A = rand(1,15);
B = rand(1,5);
[LIA,LocAllB] = ismembertol(A,B,0.2,'OutputAllIndices',true)
LIA = 1x15 logical array

   1   0   1   0   1   1   1   1   1   1   0   1   1   1   0

LocAllB=1×15 cell array
    {2x1 double}    {[0]}    {2x1 double}    {[0]}    {3x1 double}    {2x1 double}    {[4]}    {3x1 double}    {3x1 double}    {2x1 double}    {[0]}    {2x1 double}    {4x1 double}    {2x1 double}    {[0]}

计算 B 中位于值 A(13) 的容差范围内的元素的平均值。元胞 LocAllB{13} 包含 B 中位于 A(13) 容差范围内的元素的所有索引。

A(13)
ans = 0.4413
allB = B(LocAllB{13})
allB = 1×4

    0.2741    0.4142    0.2961    0.5798

aveB = mean(allB)
aveB = 0.3911

默认情况下,ismembertol 使用 abs(u-v) <= tol*DS 形式的容差测试,其中 DS 会根据输入数据的量级自动缩放。您可以另外指定 DS 值以用于 DataScale 选项。但是,绝对容差(其中 DS 为标量)不会根据输入数据的量级缩放。

首先,比较相距 eps 的两个较小值。指定 tolDS 以确立容差方程 abs(u-v) <= 10^-6

x = 0.1;
ismembertol(x, exp(log(x)), 10^-6, 'DataScale', 1)
ans = logical
   1

接下来,增大这些值的量级。exp(log(x)) 计算中的舍入误差与这些值的量级成正比,具体来说,是 eps(x)。即使两个较大值彼此相距 epseps(x) 现在也更大。因此,10^-6 不再是适合的容差。

x = 10^10;
ismembertol(x, exp(log(x)), 10^-6, 'DataScale', 1)
ans = logical
   0

使用 DS 的默认(缩放)值可更正此问题。

Y = [0.1 10^10];
ismembertol(Y, exp(log(Y)))
ans = 1x2 logical array

   1   1

创建一个随机二维点集,然后使用 ismembertol 将其中与一小组查询点 B 具有相似 x 坐标值(即在一定容差范围之内)的点归入几个垂直波段中。将以下选项与 ismembertol 配合使用:

  • ByRows 指定为 true,因为这些点坐标在 AB 的行中。

  • OutputAllIndices 指定为 true 以返回 A 中 x 坐标处于 B 中查询点容差范围内的所有点。

  • 将 DataScale 指定为 [1 Inf] 以使用 x 坐标的绝对容差,同时忽略 y 坐标。

A = rand(1000,2);
B = [(0:.2:1)',0.5*ones(6,1)];
[LIA,LocAllB] = ismembertol(B, A, 0.1, 'ByRows', true, ...
    'OutputAllIndices', true, 'DataScale', [1,Inf])
LIA = 6x1 logical array

   1
   1
   1
   1
   1
   1

LocAllB=6×1 cell array
    { 94x1 double}
    {223x1 double}
    {195x1 double}
    {212x1 double}
    {187x1 double}
    { 89x1 double}

绘制 A 中位于 B 中每个查询点容差范围内的点。

hold on 
plot(B(:,1),B(:,2),'x')
for k = 1:length(LocAllB)
    plot(A(LocAllB{k},1), A(LocAllB{k},2),'.')
end

输入参数

全部折叠

查询数组,指定为标量、向量、矩阵或多维数组。输入 AB 必须为满矩阵。

如果指定 ByRows 选项,则 AB 的列数必须相同。

数据类型: single | double

查询数组,指定为标量、向量、矩阵或多维数组。输入 AB 必须为满矩阵。

如果指定 ByRows 选项,则 AB 的列数必须相同。

数据类型: single | double

比较容差,指定为正实数标量。ismembertol 使用输入数组 AB 中的最大绝对值缩放 tol 输入。ismembertol 使用生成的缩放比较容差确定 A 中的哪些元素同时也是 B 的成员。如果两个元素处于彼此容差范围之内,则 ismembertol 将它们视为相等。

如果 abs(u-v) <= tol*max(abs([A(:);B(:)])),则 uv 这两个值在容差范围内。

要指定绝对容差,请同时指定 tol'DataScale' 名称-值对组。

示例: tol = 0.05

示例: tol = 1e-8

示例: tol = eps

数据类型: single | double

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: LIA = ismembertol(A,B,'ByRows',true)

输出索引类型,指定为包含 'OutputAllIndices' 以及 false(默认值)、true01 的逗号分隔对组。ismembertol 将数值 0 解释为 false,将数值 1 解释为 true

OutputAllIndicestrue 时,ismembertol 函数会以元胞数组形式返回第二个输出 LocB。该元胞数组包含 B 中位于 A 中对应值容差范围内的所有元素的索引。即,LocB 中的每个元胞对应于 A 中的一个值,每个元胞中的值对应于 B 中的位置。

示例: [LIA,LocAllB] = ismembertol(A,B,tol,'OutputAllIndices',true)

行比较切换,指定为包含 'ByRows' 以及 false(默认值)、true01 的逗号分隔对组。ismembertol 将数值 0 解释为 false,将数值 1 解释为 true。使用此选项查找 AB 中位于容差范围内的行。

ByRowstrue 时:

  • ismembertol 通过分别考虑各列来比较 AB 的行。因此,AB 必须是列数相同的二维数组。

  • 如果 A 中的对应行位于 B 中行的容差范围内,则 LIA 包含逻辑值 1 (true)。否则,它包含逻辑值 0 (false)。

如果 all(abs(u-v) <= tol*max(abs([A;B]))),则 uv 这两行在容差范围内。

示例: LIA = ismembertol(A,B,tol,'ByRows',true)

数据缩放,指定为包含 'DataScale' 以及标量或向量的逗号分隔对组。将 DataScale 指定为数值标量 DS,以将容差检验更改为 abs(u-v) <= tol*DS

ByRows 选项一起使用时,DataScale 值还可以是向量。在本例中,该向量的每个元素指定 A 中对应列的 DS。如果 DataScale 向量中的某个值为 Inf,则 ismembertol 将忽略 A 中的对应列。

示例: LIA = ismembertol(A,B,'DataScale',1)

示例: [LIA,LocB] = ismembertol(A,B,'ByRows',true,'DataScale',[eps(1) eps(10) eps(100)])

数据类型: single | double

输出参量

全部折叠

A 的逻辑索引,以向量或矩阵形式返回。当 A 中的元素(或行)为 B 中(在容差范围之内)的成员,则其中相应位置的值为逻辑值 1 (true)。而 LIA 中其他位置的值为逻辑值 0 (false)。

除非您指定 ByRows 选项,否则 LIA 的大小与 A 相同。在这种情况下,LIA 是一个列向量,其行数与 A 的行数相同。

B 中的位置,以向量、矩阵或元胞数组形式返回。如果 B 中元素(或行)为 A 中(在容差范围之内)的成员,则 LocB 中相应位置的值为该元素(或行)的索引,如果 A 中元素不为 B 的成员,则 LocB 中相应位置的值为 0

如果 OutputAllIndicestrue,则 ismembertol 以元胞数组形式返回 LocB。该元胞数组包含 B 中位于 A 中对应值容差范围内的所有元素的索引。即,LocB 中的每个元胞对应于 A 中的一个值,每个元胞中的值对应于 B 中的位置。

除非您指定 ByRows 选项,否则 LocB 的大小与 A 相同。在这种情况下,LocB 是一个列向量,其行数与 A 的行数相同。

扩展功能

版本历史记录

在 R2015a 中推出