Main Content

ismembertol

許容誤差内にある集合内のメンバー

説明

LIA = ismembertol(A,B,tol) は、A の要素が B の要素の許容誤差内にある場合、logical 1 (true) を含む配列を返します。それ以外の場合、配列は logical 0 (false) を含みます。uv の 2 つの値は、次が満たされる場合に許容誤差内にあります。

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

つまり、ismembertol はデータの大きさに基づいて tol 入力をスケーリングします。

ismembertolismember と似ています。ismember は厳密な比較を実行しますが、ismembertol は許容誤差を使用して比較を行います。

LIA = ismembertol(A,B) は既定の許容誤差として、単精度の入力に対しては 1e-6 を、倍精度の入力に対しては 1e-12 を使用します。

[LIA,LocB] = ismembertol(___) は、B のメンバーである A の各要素についてその B におけるインデックスの場所を含む配列 LocB も返します。前述の構文の入力引数のいずれかを使用できます。

[___] = ismembertol(___,Name,Value) は、前述の構文にある任意の入力引数または出力引数を組み合わせて、1 つ以上の名前と値のペアの引数で指定される追加のオプションを使用します。たとえば、ismembertol(A,B,'ByRows',true)AB の行を比較して論理列ベクトルを返します。

すべて折りたたむ

ベクトル x を作成します。x の変換と復元を実行して、2 番目のベクトル 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 を使用して、y に含まれる x の要素を検索します。関数 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 の変換と復元を実行して、2 番目の行列 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 を使用して、B にある A の行を検索します。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

乱数のベクトルを 2 つ作成し、許容誤差を使用して B にも含まれる A の値を判別します。A 内で対応する要素の許容誤差内にある B の要素の全インデックスを返すには、OutputAllIndicestrue に指定します。

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]}

A(13) の許容誤差内にある B の要素の平均値を求めます。セル LocAllB{13} に、A(13) の許容誤差内にある B の要素の全インデックスが含まれます。

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

既定の設定では、ismembertolabs(u-v) <= tol*DS の形式の許容誤差テストを使用します。ここで、DS は入力データの大きさに基づいて自動的にスケーリングを行います。DS に異なる値を指定して、DataScale オプションと共に使用できます。ただし、(DS がスカラーである場合の) 絶対許容誤差は、入力データの大きさに基づいてスケーリングされません。

まず、距離が eps だけ離れている 2 つの小さい値を比較します。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) に比例します。2 つの大きい値間の距離が 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

まず 2 次元の乱数点の集合を作成します。次に ismembertol を使用して、これらの点を、クエリ点の少数集合 B に対して類似した (許容誤差内の) x 座標をもつ縦の帯域に分類します。ismembertol には次のオプションを指定します。

  • 点の座標は AB の行に含まれるため、ByRowstrue に指定します。

  • OutputAllIndicestrue に指定して、x 座標が B のクエリ点の許容誤差内にある、A のすべての点に対してインデックスを返すようにします。

  • 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}

B の各クエリ点の許容誤差内にある A の点をプロットします。

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

Figure contains an axes object. The axes object contains 7 objects of type line. One or more of the lines displays its values using only markers

入力引数

すべて折りたたむ

クエリ配列。スカラー、ベクトル、行列または多次元配列として指定します。入力 A および B は非スパースでなければなりません。

ByRows オプションを指定する場合、AB の列数は同じでなければなりません。

データ型: single | double

クエリ配列。スカラー、ベクトル、行列または多次元配列として指定します。入力 A および B は非スパースでなければなりません。

ByRows オプションを指定する場合、AB の列数は同じでなければなりません。

データ型: single | double

比較許容誤差。正の実数のスカラーとして指定します。ismembertol は、入力配列 A および B の最大絶対値を使用して tol の入力をスケーリングします。その後、ismembertol は、スケーリングした結果の比較許容誤差を使用して、B のメンバーでもある A の要素を判別します。2 つの要素が互いに許容誤差内にある場合、ismembertol はこれらの要素を等価とみなします。

uv の 2 つの値は、abs(u-v) <= tol*max(abs([A(:);B(:)])) である場合に許容誤差内にあります。

絶対許容誤差を指定するには、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 (既定)、true0 または 1 のいずれかで構成されるコンマ区切りのペアとして指定します。ismembertol は、数値の 0false1true と解釈します。

OutputAllIndicestrue である場合、関数 ismembertol は 2 番目の出力 LocB を cell 配列として返します。cell 配列には A の対応する値の許容誤差内にある、B"すべての" 要素のインデックスが含まれます。つまり、LocB の各セルが A の値に対応し、各セル内の値は B での位置に対応します。

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

行比較の切り替え。'ByRows' と、false (既定)、true0 または 1 のいずれかで構成されるコンマ区切りのペアとして指定します。ismembertol は数値の 0false、数値の 1true と解釈します。このオプションは AB で許容誤差内にある行を検索するために使用します。

ByRowstrue である場合、次のようになります。

  • ismembertol は、AB の行を個々の列ごとに比較します。したがって、AB は同じ列数の 2 次元配列でなければなりません。

  • A で対応する行が B の行から許容誤差内にある場合、LIA は logical 1 (true) を含みます。それ以外の場合、logical 0 (false) が含まれます。

uv の 2 つの行は、all(abs(u-v) <= tol*max(abs([A;B]))) の場合に許容誤差内にあります。

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

データのスケール。'DataScale' と、スカラーまたはベクトルで構成されるコンマ区切りのペアとして指定します。DataScale を数値スカラー DS として指定し、許容誤差テストを abs(u-v) <= tol*DS になるよう変更します。

ByRows オプションと共に使用する場合、DataScale の値をベクトルにすることもできます。この場合、ベクトルの各要素は A で対応する列の DS を指定します。DataScale ベクトルの値が Inf である場合、ismembertolA の対応する列を無視します。

例: 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 のメンバーである場合に logical 1 (true) を含むベクトルまたは行列として返されます。それ以外の場合、LIA は logical 0 (false) を含みます。

LIAA と同じサイズです。ただし、ByRows オプションを指定した場合を除きます。その場合は、LIAA と同じ行数をもつ列ベクトルになります。

B 内の場所。ベクトル、行列または cell 配列として返されます。LocB には、許容誤差内で A で見つかった B の要素または行へのインデックスが含まれます。A の要素が B のメンバーでない場合、LocB には 0 が含まれます。

OutputAllIndicestrue の場合、ismembertolLocB を cell 配列として返します。cell 配列には A の対応する値の許容誤差内にある、B"すべての" 要素のインデックスが含まれます。つまり、LocB の各セルが A の値に対応し、各セル内の値は B での位置に対応します。

LocBA と同じサイズです。ただし、ByRows オプションを指定した場合を除きます。その場合は、LocBA と同じ行数をもつ列ベクトルになります。

拡張機能

バージョン履歴

R2015a で導入