Matlab中ismembertol函数使用

目录

语法

二.说明

示例

存在数值误差的集合成员

按行确定集合成员

计算向量中类似值的平均值

指定绝对容差

按列指定 DataScale


        容差范围内的集合成员。

语法

LIA = ismembertol(A,B,tol)

LIA = ismembertol(A,B)

[LIA,LocB] = ismembertol(___)

[___] = ismembertol(___,Name,Value)

二.说明

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

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) 比较 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
  Columns 1 through 5

    {2x1 double}    {[0]}    {2x1 double}    {[0]}    {3x1 double}

  Columns 6 through 10

    {2x1 double}    {[4]}    {3x1 double}    {3x1 double}    {2x1 double}

  Columns 11 through 15

    {[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)。即使两个较大值彼此相距 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

按列指定 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 中每个查询点容差范围内的点。

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])
hold on 
plot(B(:,1),B(:,2),'x')
for k = 1:length(LocAllB)
    plot(A(LocAllB{k},1), A(LocAllB{k},2),'.')
end

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值