uniquetol
許容誤差内の一意の値
構文
説明
は、C = uniquetol(A,tol,occurrence)occurrence が 'highest' である場合、複数の値が互いに許容誤差内にあると、最大値が一意であるとして選択されることを指定します。occurrence の既定値は 'lowest' であり、最小値を一意であるとして選択します。
[___] = uniquetol(___, は、前述の構文にある任意の入力引数または出力引数を組み合わせて、1 つ以上の名前と値のペアの引数で指定される追加のオプションを使用します。たとえば、Name,Value)uniquetol(A,'ByRows',true) は A 内で一意の行を判別します。
例
ベクトル x を作成します。x の変換と復元を実行して、2 番目のベクトル 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
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);
x と y を単一のベクトル 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 と == を同時に使用したり、完全な等価性を評価する isequal や unique などの関数を使用したりできます。
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
occurrence オプションを使用して、uniquetol がどの要素を一意であるとして選択するか制御します。
ベクトルを作成し、どの要素が 1e-1 の許容誤差内で一意であるか検索します。
a = [1 1.1 1.11 1.12 1.13 2]; c = uniquetol(a,1e-1)
c = 1×2
1 2
A にある最初の 5 つの要素はすべて 1e-1 の許容誤差に関して類似した値であるため、その中の最小値のみが一意であるとして選択されます。これは uniquetol が a にある最小値から開始して、ベクトルの最後にある 2 に到達するまで、許容誤差の範囲外となる要素を新たに検出しないためです。
'highest' オプションを使用して、uniquetol が a にある最大値から開始するように指定します。すると、uniquetol が最大値から小さい方へ動作するため、1.13 要素が一意であるとして選択されます。
d = uniquetol(a,1e-1,'highest')d = 1×2
1.1300 2.0000
2 次元サンプル点の点群を作成し、点 を中心とする半径 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)

乱数のベクトルを作成し、許容誤差を使用して一意の要素を判定します。OutputAllIndices を true に指定して、一意の値の許容誤差内にある要素のインデックスをすべて返します。
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
既定の設定では、uniquetol は abs(u-v) <= tol*DS の形式の許容誤差テストを使用します。ここで、DS は入力データの大きさに基づいて自動的に "スケーリング" を行います。DS に異なる値を指定して、DataScale オプションと共に使用できます。ただし、(DS がスカラーである場合の) 絶対許容誤差は、入力データの大きさに基づいてスケーリングされません。
まず、距離が eps だけ離れている 2 つの小さい値を比較します。tol と DS を指定して、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の行に含まれるため、ByRowsをtrueに指定します。OutputAllIndicesをtrueに指定して、互いに許容誤差内にある 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 はこれらの要素を等価とみなします。
u と v の 2 つの値は、abs(u-v) <= tol*max(abs(A)) である場合に許容誤差内にあります。
絶対許容誤差を指定するには、tol および名前と値のペア 'DataScale' の両方を指定します。
例: tol = 0.05
例: tol = 1e-8
例: tol = eps
データ型: single | double
一意の値の出現。次の表のオプションのいずれかとして指定します。occurrence の値は、uniquetol がどの要素を一意であるとして選択するか決定します。
| オプション | 説明 |
|---|---|
'lowest' |
|
'highest' |
|
例: C = uniquetol(A,tol,'highest')
例: C = uniquetol([1 2 3],2,'highest') は、uniquetol が入力の最大値から開始し、ほかのすべての値が許容誤差内にあるため、3 を返します。
データ型: char | string
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。
例: C = uniquetol(A,'ByRows',true)
出力インデックス タイプ。'OutputAllIndices' と、false (既定)、true、0 または 1 のいずれかで構成されるコンマ区切りのペアとして指定します。uniquetol は、数値の 0 を false、1 を true と解釈します。
OutputAllIndices が true である場合、関数 uniquetol は 2 番目の出力 IA を cell 配列として返します。cell 配列には、C の値から許容誤差内にある A の "すべての" 要素のインデックスが含まれます。つまり、IA の各セルが C の値に対応し、各セル内の値は A での位置に対応します。
例: [C,IA] = uniquetol(A,tol,'OutputAllIndices',true)
行比較の切り替え。'ByRows' と、false (既定)、true、0 または 1 のいずれかで構成されるコンマ区切りのペアとして指定します。uniquetol は数値の 0 を false、数値の 1 を true と解釈します。このオプションを使用して、許容誤差内で一意である行を A 内で検索します。
ByRows が true である場合、次のようになります。
Aは 2 次元配列でなければなりません。uniquetolは、Aの行を各列ごとに個別に比較します。2 つの行が互いに許容誤差内にあるとみなされるには、各列が許容誤差内になければなりません。Aの各行が、Cのいずれかの行の許容誤差内にあります。しかし、C内には、互いに許容誤差内にある行は 2 つ存在しません。
u と v の 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 である場合、uniquetol は A の対応する列を無視します。
例: 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 内で互いに許容誤差内にある要素は 2 つありません。
ByRows オプションが true の場合、C は A の一意の行を含む行列となります。この場合、C の行は、最初の列を基準とする昇順に並んでいます。A の各行は C のいずれかの要素の許容誤差内にありますが、C 内で互いに許容誤差内にある行は 2 つありません。
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,:)です。
アルゴリズム
uniquetol は入力を辞書順に並べ替えたうえで、最も低い値または最も高い値から開始して許容誤差内にある一意な値を検出します。そのため、入力の並べ替え順序を変更すると、出力が変化する可能性があります。たとえば、uniquetol(-A) で返される結果が -uniquetol(A) の結果とは異なる場合があります。
"C 内には互いに許容誤差内にある要素が 2 つあってはならない" という条件を満たす有効な出力 C が複数存在する場合もあります。関数 uniquetol は、occurrence の値が 'highest' または 'lowest' であるか、および PreserveRange オプションが指定されているかに応じて、複数の有効な出力を返すことができます。
拡張機能
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
uniquetol 関数は GPU 配列入力をサポートしますが、次の使用上の注意および制限があります。
一意の値の出現に対して
occurrence引数はサポートされていません。'ByRows'、'OutputAllIndices'および'PreserveRange'のオプションはサポートされません。64 ビット整数はサポートされません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2015a で導入occurrence 引数は、入力データの最も大きい要素と最も小さい要素のどちらからアルゴリズムを開始するかを制御します。名前と値の引数 'PreserveRange' は、出力データの範囲を入力データと同じにするかどうかを指定します。
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.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の 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)