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 = 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
的两个较小值。指定 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 = 1x2 logical array
1 1
按列指定 DataScale
创建一个随机二维点集,然后使用 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 = 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
输入参数
A
— 查询数组
标量 | 向量 | 矩阵 | 多维数组
查询数组,指定为标量、向量、矩阵或多维数组。输入 A
和 B
必须为满矩阵。
如果指定 ByRows
选项,则 A
和 B
的列数必须相同。
数据类型: single
| double
B
— 查询数组
标量 | 向量 | 矩阵 | 多维数组
查询数组,指定为标量、向量、矩阵或多维数组。输入 A
和 B
必须为满矩阵。
如果指定 ByRows
选项,则 A
和 B
的列数必须相同。
数据类型: single
| double
tol
— 比较容差
正实数标量
比较容差,指定为正实数标量。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
输出索引类型,指定为包含 '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
行比较切换,指定为包含 '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'
以及标量或向量的逗号分隔对组。将 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
输出参量
LIA
— A
的逻辑索引
向量 | 矩阵
A
的逻辑索引,以向量或矩阵形式返回。当 A
中的元素(或行)为 B
中(在容差范围之内)的成员,则其中相应位置的值为逻辑值 1
(true
)。而 LIA
中其他位置的值为逻辑值 0
(false
)。
除非您指定 ByRows
选项,否则 LIA
的大小与 A
相同。在这种情况下,LIA
是一个列向量,其行数与 A
的行数相同。
LocB
— B
中的位置
向量 | 矩阵 | 元胞数组
B
中的位置,以向量、矩阵或元胞数组形式返回。如果 B
中元素(或行)为 A
中(在容差范围之内)的成员,则 LocB
中相应位置的值为该元素(或行)的索引,如果 A
中元素不为 B
的成员,则 LocB
中相应位置的值为 0
。
如果 OutputAllIndices
为 true
,则 ismembertol
以元胞数组形式返回 LocB
。该元胞数组包含 B
中位于 A
中对应值容差范围内的所有元素的索引。即,LocB
中的每个元胞对应于 A
中的一个值,每个元胞中的值对应于 B
中的位置。
除非您指定 ByRows
选项,否则 LocB
的大小与 A
相同。在这种情况下,LocB
是一个列向量,其行数与 A
的行数相同。
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
不支持
'ByRows'
和'OutputAllIndices'
参量。不支持 64 位整数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2015a 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)