uniquetol
容差内的唯一值
语法
说明
(其中 C
= uniquetol(A
,tol
,occurrence
)occurrence
为 'highest'
)指定当几个值在彼此的容差范围内时,应选取最高值作为唯一元素。occurrence
的默认值为 'lowest'
,它会选取最小值作为唯一元素。
[___] = uniquetol(___,
使用一个或多个名称-值对组指定的其他选项,这些选项使用上述语法中的任意输入或输出参数组合。例如,Name,Value
)uniquetol(A,'ByRows',true)
确定 A
中的唯一行。
示例
存在数值错误的情况下的唯一元素
创建向量 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
使用 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
来获取第二个矩阵 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
来获取第二个向量 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
中的前五个元素都具有关于 1e-1
的容差的相似值,因此只有其中的最小值被选取为唯一元素。这是因为 uniquetol
从 a
中的最小值开始,直到到达向量末尾的 2
才找到不在容差范围内的新元素。
使用 'highest'
选项指定 uniquetol
应从 a
中的最高值开始。1.13
元素被选作唯一元素,因为 uniquetol
从最高值向下查找。
d = uniquetol(a,1e-1,'highest')
d = 1×2
1.1300 2.0000
使用大容差对数据分割子集
创建一个由二维样本点组成的云,这些样本点限定在一个以点 为圆心,以 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
的两个较小值。指定 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)
。即使两个较大值彼此相距 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
按列指定 DataScale
创建一个随机二维点集,然后使用 uniquetol
将这些点分组到具有相似 x 坐标(容差范围之内)的垂直条带中。将以下选项与 uniquetol
配合使用:
将
ByRows
指定为true
,因为点坐标在A
的行中。将
OutputAllIndices
指定为true
,以返回那些 x 坐标在彼此容差范围内的所有点的索引。将
DataScale
指定为[1 Inf]
,以将绝对容差用于x
坐标,同时忽略y
坐标。
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
— 查询数组
标量 | 向量 | 矩阵 | 多维数组
查询数组,指定为标量、向量、矩阵或多维数组。A
必须为满矩阵。
数据类型: single
| double
tol
— 比较容差
正实数标量
比较容差,指定为正实数标量。uniquetol
使用输入数组 A
中的最大绝对值缩放 tol
输入。uniquetol
使用生成的缩放比较容差确定 A
中的哪些元素是唯一的。如果 A
中的两个元素处于彼此容差范围之内,则 uniquetol
将它们视为相等。
如果 abs(u-v) <= tol*max(abs(A))
,则 u
和 v
这两个值在容差范围内。
要指定绝对容差,请同时指定 tol
和 'DataScale'
名称-值对组。
示例: tol = 0.05
示例: tol = 1e-8
示例: tol = eps
数据类型: single
| double
occurrence
— 唯一值的选取方式
'lowest'
(默认) | 'highest'
唯一值的选取方式,指定为下表中的选项之一。occurrence
的值确定 uniquetol
选取哪些元素作为唯一元素。
选项 | 描述 |
---|---|
'lowest' |
|
'highest' |
|
示例: C = uniquetol(A,tol,'highest')
示例: C = uniquetol([1 2 3],2,'highest')
返回 3
,因为 uniquetol
从输入中的最高值开始,所有其他值都在容差范围内。
数据类型: char
| string
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: C = uniquetol(A,'ByRows',true)
OutputAllIndices
— 输出索引类型
false
(默认) | true
| 0
| 1
输出索引类型,指定为包含 'OutputAllIndices'
以及 false
(默认值)、true
、0
或 1
的逗号分隔对组。uniquetol
将数值 0
解释为 false
,将数值 1
解释为 true
。
当 OutputAllIndices
为 true
时,uniquetol
函数会以元胞数组形式返回第二个输出 IA
。该元胞数组包含 A
中处于 C
中值的容差范围内的所有元素的索引。即,IA
中的每个元胞对应于 C
中的一个值,每个元胞中的值对应于 A
中的位置。
示例: [C,IA] = uniquetol(A,tol,'OutputAllIndices',true)
ByRows
— 行比较切换
false
(默认) | true
| 0
| 1
行比较切换,指定为包含 'ByRows'
以及 false
(默认值)、true
、0
或 1
的逗号分隔对组。uniquetol
将数值 0
解释为 false
,将数值 1
解释为 true
。使用此选项可查找 A
中处于容差范围内的行。
当 ByRows
为 true
时:
A
必须为二维数组。uniquetol
通过分别考虑每一列来比较A
的行。要使两行处于彼此的容差范围内,则每一列都必须处于容差范围内。A
中的每行都处于C
中的行的容差范围内。但是,C
中的任意两行都不在彼此的容差范围内。
如果 all(abs(u-v) <= tol*max(abs(A),[],1))
,则 u
和 v
这两行在容差范围内。
示例: C = uniquetol(A,tol,'ByRows',true)
DataScale
— 数据缩放
标量 | 向量
数据缩放,指定为包含 'DataScale'
以及标量或向量的逗号分隔对组。将 DataScale
指定为数值标量 DS
,以将容差检验更改为 abs(u-v) <= tol*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
输出参数
C
— A
中的唯一元素
向量 | 矩阵
A
中的唯一元素(处于容差范围内),以向量或矩阵的形式返回。如果 A
是行向量,则 C
也是行向量。否则,C
为列向量。C
中的元素以升序排序。A
中的每个元素都处于 C
中的元素的容差范围内,但 C
中的任意两个元素都不在彼此的容差范围内。
如果 ByRows
选项为 true
,则 C
为一个矩阵,其中包含 A
中的唯一行。在这种情况下,C
中的行将按第一列的升序排序。A
中的每行都处于 C
中的行的容差范围内,但 C
中的任意两行都不在彼此的容差范围内。
IA
— A
的索引
列向量 | 元胞数组
A
的索引,以重复元素首次出现处的索引的列向量形式或元胞数组形式返回。IA
通常满足 C = A(IA)
,以下情况例外:
如果
ByRows
选项为true
,则C = A(IA,:)
。如果
OutputAllIndices
选项为true
,则IA
为元胞数组且C(i)~A(IA{i})
,其中~
意味着各个值均处于彼此的容差范围内。
IC
— C
的索引
列向量
C
的索引,以索引的列向量形式返回。IC
满足下列属性,其中 ~
意味着各个值处于彼此的容差范围内。
如果
A
是向量,则A~C(IC)
。如果
A
是矩阵,则A(:)~C(IC)
。如果
ByRows
选项为true
,则A~C(IC,:)
。
算法
uniquetol
以字典的编纂方式对输入进行排序,然后从最低值或最高值开始寻找容差范围内的唯一值。因此,更改输入的排序会更改输出。例如,uniquetol(-A)
给出的结果可能与 -uniquetol(A)
所给出的结果不同。
这些可以是满足该条件的多个有效 C
输出,C
中的任意两个元素都不在彼此的容差范围内。uniquetol
函数可以返回多个有效输出,具体取决于 occurrence
的值是 'highest'
还是 'lowest'
以及是否指定 PreserveRange
选项。
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
不支持选取唯一值实例的
occurrence
参数。不支持
'ByRows'
、'OutputAllIndices'
和'PreserveRange'
选项。不支持 64 位整数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2015a 中推出R2021b: 控制元素选择和保留数据范围的选项
occurrence
参数控制算法是从输入数据中的最高还是最低元素开始。'PreserveRange'
名称-值参数指定输出数据的范围是否应与输入数据相同。
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)