Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

uniquetol

許容誤差内の一意の値

説明

C = uniquetol(A,tol) は、A で許容誤差 tol の範囲内にある一意の要素を返します。uv の 2 つの値は、次が満たされる場合に許容誤差内にあります。

abs(u-v) <= tol*max(abs(A(:)))

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

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

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

[C,IA,IC] = uniquetol(___) は、インデックス ベクトル IA および IC を返します。ここで、C = A(IA) かつ A~C(IC) (または A が行列の場合は A(:)~C(IC)) であり、~ は値が互いの許容誤差内にあることを示します。前述の構文の入力引数のいずれかを使用できます。

[___] = uniquetol(___,Name,Value) は、前述の構文にある任意の入力引数または出力引数を組み合わせて、1 つ以上の名前と値のペアの引数で指定される追加のオプションを使用します。たとえば、uniquetol(A,'ByRows',true)A 内で一意の行を判別します。

すべて折りたたむ

ベクトル 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

unique を使用して、連結ベクトル [x;y] 内の一意の要素を検出します。関数 unique は厳密な比較を実行し、x の一部の値が y の値と厳密には等しくないと判定します。これらは、x-y の差が非ゼロである、同じ要素です。したがって、c には重複しているように "見える" 値が含まれています。

c = unique([x;y])
c = 8×1

    3.1416
    3.1416
    6.2832
    9.4248
   12.5664
   15.7080
   18.8496
   18.8496

uniquetol を使用して、わずかな誤差が許容される比較を実行します。uniquetol は許容誤差内にある要素を等価として扱います。

C = uniquetol([x;y])
C = 6×1

    3.1416
    6.2832
    9.4248
   12.5664
   15.7080
   18.8496

既定では、uniquetol は許容誤差内にある一意の "要素" を検出しますが、行列で許容誤差内にある "行" を検出することもできます。

数値行列 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];
B = log10(10.^A);

unique を使用して、A および B 内で一意の行を検出します。関数 unique は厳密な比較を実行し、行の相違がたとえごくわずかであっても、連結行列 [A;B] 内のすべての行が一意であると判定します。

unique([A;B],'rows')
ans = 8×3

    0.0500    0.1100    0.1800
    0.0500    0.1100    0.1800
    0.1800    0.2100    0.2900
    0.1800    0.2100    0.2900
    0.3400    0.3600    0.4100
    0.3400    0.3600    0.4100
    0.4600    0.5200    0.7600
    0.4600    0.5200    0.7600

uniquetol を使用して一意の行を検出します。uniquetol は、許容誤差内にある行を等価として扱います。

uniquetol([A;B],'ByRows',true)
ans = 4×3

    0.0500    0.1100    0.1800
    0.1800    0.2100    0.2900
    0.3400    0.3600    0.4100
    0.4600    0.5200    0.7600

ベクトル x を作成します。x の変換と復元を実行して、2 番目のベクトル y を取得します。この変換により、y の一部の要素に丸め誤差が生じます。

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

xy を単一のベクトル A に組み合わせます。uniquetol を使用して A を再作成します。その際、許容誤差内にある値を等価として扱います。

A = [x;y]
A = 10×1

    3.1416
    6.2832
    9.4248
   12.5664
   15.7080
    3.1416
    6.2832
    9.4248
   12.5664
   15.7080

[C,IA,IC] = uniquetol(A);
newA = C(IC)
newA = 10×1

    3.1416
    6.2832
    9.4248
   12.5664
   15.7080
    3.1416
    6.2832
    9.4248
   12.5664
   15.7080

この後のコードでは、newA== を同時に使用したり、完全な等価性を評価する isequalunique などの関数を使用したりできます。

D1 = unique(A)
D1 = 6×1

    3.1416
    3.1416
    6.2832
    9.4248
   12.5664
   15.7080

D2 = unique(newA)
D2 = 5×1

    3.1416
    6.2832
    9.4248
   12.5664
   15.7080

2 次元サンプル点の点群を作成し、点 (12,12) を中心とする半径 0.5 の円内に制限します。

x = rand(10000,2); 
insideCircle = sqrt((x(:,1)-.5).^2+(x(:,2)-.5).^2)<0.5;
y = x(insideCircle,:);

元のデータセットの各点が、特定の点の許容誤差内になるよう、点の数を絞り込みます。

tol = 0.05;
C = uniquetol(y,tol,'ByRows',true);

絞り込んだ後の点を、元のデータセットの上に赤でプロットします。赤い点はすべて元のデータセットのメンバーです。すべての赤い点の間には少なくとも tol の距離があります。

plot(y(:,1),y(:,2),'.')
hold on
axis equal
plot(C(:,1), C(:,2), '.r', 'MarkerSize', 10)

乱数のベクトルを作成し、許容誤差を使用して一意の要素を判定します。OutputAllIndicestrue に指定して、一意の値の許容誤差内にある要素のインデックスをすべて返します。

A = rand(100,1);
[C,IA] = uniquetol(A,1e-2,'OutputAllIndices',true);

C(2) の許容誤差内にある要素の平均値を求めます。

C(2)
ans = 0.0318
allA = A(IA{2})
allA = 3×1

    0.0357
    0.0318
    0.0344

aveA = mean(allA)
aveA = 0.0340

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

まず、距離が eps だけ離れている 2 つの小さい値を比較します。tolDS を指定して、abs(u-v) <= 10^-6 という許容誤差内の式を作成します。

x = 0.1;
uniquetol([x, exp(log(x))], 10^-6, 'DataScale', 1)
ans = 0.1000

次に、値を大きくします。exp(log(x)) の計算の丸め誤差は値の大きさ、つまり eps(x) に比例します。2 つの大きい値間の距離が eps であっても、eps(x) はこれを大きく上回る値になります。したがって、10^-6 は許容誤差として適切でなくなります。

x = 10^10;
uniquetol([x, exp(log(x))], 10^-6, 'DataScale', 1)
ans = 1×2
1010 ×

    1.0000    1.0000

この問題を修正するには、DS の既定値 (スケーリングされる) を使用します。

format long
Y = [0.1 10^10];
uniquetol([Y, exp(log(Y))])
ans = 1×2
1010 ×

   0.000000000010000   1.000000000000000

2 次元の乱数点のセットを作成します。次に uniquetol を使用して、これらの点を類似した (許容誤差内の) x 座標をもつ縦の複数の帯域にグループ化します。uniquetol には次のオプションを指定します。

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

  • OutputAllIndicestrue に指定して、互いの許容誤差内にある x 座標をもつすべての点のインデックスを返すようにします。

  • x 座標に絶対許容誤差を使用して、y 座標は無視するために、DataScale[1 Inf] に指定します。

A = rand(1000,2);
DS = [1 Inf];
[C,IA] = uniquetol(A, 0.1, 'ByRows', true, ...
    'OutputAllIndices', true, 'DataScale', DS);

各帯域の点と平均値をプロットします。

hold on
for k = 1:length(IA)
    plot(A(IA{k},1), A(IA{k},2), '.')
    meanAi = mean(A(IA{k},:));
    plot(meanAi(1), meanAi(2), 'xr')
end

入力引数

すべて折りたたむ

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

データ型: single | double

比較許容誤差。正の実数のスカラーとして指定します。uniquetol は、入力配列 A の最大絶対値を使用して tol の入力をスケーリングします。続いて、uniquetol はスケールされた結果の比較許容誤差を使用して、A のどの要素が一意であるかを判別します。A の 2 つの要素が互いの許容誤差内にある場合、uniquetol はこれらの要素を等価とみなします。

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

絶対許容誤差を指定するには、tol および名前と値のペア 'DataScale' の両方を指定します。

例: tol = 0.05

例: tol = 1e-8

例: tol = eps

データ型: single | double

名前と値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: C = uniquetol(A,'ByRows',true)

出力インデックス タイプ。'OutputAllIndices' と、false (既定)、true0 または 1 のいずれかで構成されるコンマ区切りのペアとして指定します。uniquetol は、数値の 0false1true と解釈します。

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

例: [C,IA] = uniquetol(A,tol,'OutputAllIndices',true)

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

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

  • A は 2 次元配列でなければなりません。

  • uniquetol は、A の行を各列ごとに個別に比較します。2 つの行が互いに許容誤差内にあるとみなされるには、各列が許容誤差内になければなりません。

  • A の各行が、C のいずれかの行の許容誤差内にあります。しかし、C 内には、互いの許容誤差内にある行のペアが存在しません。

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

例: C = uniquetol(A,tol,'ByRows',true)

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

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

例: C = uniquetol(A,'DataScale',1)

例: [C,IA,IC] = uniquetol(A,'ByRows',true,'DataScale',[eps(1) eps(10) eps(100)])

データ型: single | double

出力引数

すべて折りたたむ

A 内の (許容誤差内で) 一意の要素。ベクトルまたは行列として返されます。A が行ベクトルの場合、C も行ベクトルになります。それ以外の場合は、C は列ベクトルになります。C の要素は昇順に並んでいます。A の各要素は C のいずれかの要素の許容誤差内にありますが、C 内では互いの許容誤差内にある要素のペアがありません。

ByRows オプションが true の場合、CA の一意の行を含む行列となります。この場合、C の行は、最初の列を基準とする昇順に並んでいます。A の各行は C のいずれかの要素の許容誤差内にありますが、C 内では互いの許容誤差内にある行のペアがありません。

A のインデックス。反復される要素の最初の出現に対するインデックスの列ベクトル、あるいは cell 配列として返されます。IA は、次の例外を除いて通常は C = A(IA) を満たします。

  • ByRows オプションが true の場合、C = A(IA,:) です。

  • OutputAllIndices オプションが true の場合、IA は cell 配列となり、C(i)~A(IA{i}) になります。ここで ~ は、値が互いの許容誤差内にあることを示します。

C のインデックス。インデックスの列ベクトルとして返されます。IC は次のプロパティを満たします。ここで ~ は、値が互いの許容誤差内にあることを示します。

  • A がベクトルの場合、A~C(IC) です。

  • A が行列の場合、A(:)~C(IC) です。

  • ByRows オプションが true の場合、A~C(IC,:) です。

ヒント

  • "C 内には互いの許容誤差内にある要素のペアがあってはならない" という条件を満たす有効な出力 C が複数存在する場合もあります。関数 uniquetol は、有効な出力のうち 1 つだけを返します。

    uniquetol は入力を辞書順に並べ替えたうえで、最も低い値から開始して許容誤差内にある一意な値を検出します。そのため、入力の並べ替え順序を変更すると、出力が変化する可能性があります。たとえば、uniquetol(-A) で返される結果が -uniquetol(A) の結果とは異なる場合があります。

拡張機能

R2015a で導入