ismembertol
查找容差范围内数据的集合成员
语法
说明
[___] = ismembertol(___,
使用一个或多个名称-值对组指定的其他选项,这些选项使用上述语法中的任意输入或输出参量组合。例如,Name,Value
)ismembertol(A,B,'ByRows',true)
比较 A
和 B
的行并返回逻辑列向量。
示例
创建向量 x
。通过变换和取消变换 x
来获取第二个向量 y
。此变换会向 y
中引入舍入误差。
x = (1:6)'*pi; y = 10.^log10(x);
通过取差值来验证 x
和 y
不同。
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 = 6×1 logical array
0
1
1
1
1
0
使用 ismembertol
执行使用较小容差的比较。ismembertol
将容差范围内的元素视为相等元素并确定 x
中的所有元素都为 y
的成员。
LIA = ismembertol(x,y)
LIA = 6×1 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 = 5×1 logical array
0
0
0
0
1
使用 ismembertol
执行使用较小容差的比较。ismembertol
将容差范围内的元素视为相等元素并确定 A
中的所有行都为 B
的成员。
LIA = ismembertol(A,B,'ByRows',true)
LIA = 5×1 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 = 1×15 logical array
1 0 1 0 1 1 1 1 1 1 0 1 1 1 0
LocAllB=1×15 cell array
{2×1 double} {[0]} {2×1 double} {[0]} {3×1 double} {2×1 double} {[4]} {3×1 double} {3×1 double} {2×1 double} {[0]} {2×1 double} {4×1 double} {2×1 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
的两个较小值。指定 tol
和 DS
以确立容差方程 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)
。即使两个较大值彼此相距 eps
,eps(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 = 1×2 logical array
1 1
创建一个随机二维点集,然后使用 ismembertol
将其中与一小组查询点 B
具有相似 x 坐标值(即在一定容差范围之内)的点归入几个垂直波段中。将以下选项与 ismembertol
配合使用:
将
ByRows
指定为true
,因为这些点坐标在A
和B
的行中。将
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 = 6×1 logical array
1
1
1
1
1
1
LocAllB=6×1 cell array
{ 94×1 double}
{223×1 double}
{195×1 double}
{212×1 double}
{187×1 double}
{ 89×1 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
输入参数
查询数组,指定为标量、向量、矩阵或多维数组。输入 A
和 B
必须为满矩阵。
如果指定 ByRows
选项,则 A
和 B
的列数必须相同。
数据类型: single
| double
查询数组,指定为标量、向量、矩阵或多维数组。输入 A
和 B
必须为满矩阵。
如果指定 ByRows
选项,则 A
和 B
的列数必须相同。
数据类型: single
| double
比较容差,指定为正实数标量。ismembertol
使用输入数组 A
和 B
中的最大绝对值缩放 tol
输入。ismembertol
使用生成的缩放比较容差确定 A
中的哪些元素同时也是 B
的成员。如果两个元素处于彼此容差范围之内,则 ismembertol
将它们视为相等。
如果 abs(u-v) <= tol*max(abs([A(:);B(:)]))
,则 u
和 v
这两个值在容差范围内。
要指定绝对容差,请同时指定 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
(默认值)、true
、0
或 1
的逗号分隔对组。ismembertol
将数值 0
解释为 false
,将数值 1
解释为 true
。
当 OutputAllIndices
为 true
时,ismembertol
函数会以元胞数组形式返回第二个输出 LocB
。该元胞数组包含 B
中位于 A
中对应值容差范围内的所有元素的索引。即,LocB
中的每个元胞对应于 A
中的一个值,每个元胞中的值对应于 B
中的位置。
示例: [LIA,LocAllB] = ismembertol(A,B,tol,'OutputAllIndices',true)
行比较切换,指定为包含 'ByRows'
以及 false
(默认值)、true
、0
或 1
的逗号分隔对组。ismembertol
将数值 0
解释为 false
,将数值 1
解释为 true
。使用此选项查找 A
和 B
中位于容差范围内的行。
当 ByRows
为 true
时:
ismembertol
通过分别考虑各列来比较A
和B
的行。因此,A
和B
必须是列数相同的二维数组。如果
A
中的对应行位于B
中行的容差范围内,则LIA
包含逻辑值1
(true
)。否则,它包含逻辑值0
(false
)。
如果 all(abs(u-v) <= tol*max(abs([A;B])))
,则 u
和 v
这两行在容差范围内。
示例: 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
。
默认情况下,LocB
中的每个元素均为 B
中第一个元素的索引,该索引在 A
中对应元素的容差范围内。将 OutputAllIndices
指定为 true
改为以元胞数组形式返回 LocB
,该元胞数组包含 B
中位于 A
中对应值容差范围内的所有元素的索引。也就是说,LocB
中的每个元胞对应于 A
中的一个值,并且每个元胞中的值是 B
中容差范围内的元素的索引。
除非您指定 ByRows
选项,否则 LocB
的大小与 A
相同。在这种情况下,LocB
是一个列向量,其行数与 A
的行数相同。
扩展功能
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
ismembertol
函数支持 GPU 数组输入,但有以下用法说明和限制:
不支持
'ByRows'
和'OutputAllIndices'
参量。不支持 64 位整数。
有关详细信息,请参阅在 GPU 上运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2015a 中推出
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)