Уникальные значения в допуске
C = uniquetol(A,tol)
C = uniquetol(A)
[C,IA,IC]
= uniquetol(___)
[___] = uniquetol(___,Name,Value)
возвращает уникальные элементы в C
= uniquetol(A
,tol
)A
с помощью допуска tol
. Два значения, u
и v
, в допуске если
abs(u-v) <= tol*max(abs(A(:)))
Таким образом, uniquetol
масштабирует вход tol
на основе значения данных.
uniquetol
подобен unique
. Принимая во внимание, что unique
выполняет точные сравнения, uniquetol
выполняет сравнения с помощью допуска.
[___] = uniquetol(___,
дополнительные опции использования, заданные одним или несколькими Аргументами пары "имя-значение" с помощью любой из комбинаций аргументов ввода или вывода в предыдущих синтаксисах. Например, Name,Value
)uniquetol(A,'ByRows',true)
определяет уникальные строки в A
.
Создайте векторный x
. Получите второй векторный y
путем преобразования и непреобразования x
. Это преобразование вводит различия в округлении в 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
. Получите вторую матрицу, B
, путем преобразования и непреобразования A
. Это преобразование вводит различия в округлении для 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
. Получите второй вектор, y
, путем преобразования и непреобразования x
. Это преобразование вводит различия в округлении для некоторых элементов в 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
Создайте облако 2D точек выборки, ограниченных быть в кругу радиуса 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
Создайте набор случайных 2D точек, затем используйте 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
масштабирует вход tol
с помощью максимального абсолютного значения во входном массиве A
. Затем uniquetol
использует получившийся масштабированный допуск сравнения, чтобы определить, какие элементы в A
уникальны. Если два элемента в A
в допуске друг друга, то uniquetol
полагает, что они равны.
Два значения, u
и v
, в допуске если abs(u-v) <= tol*max(abs(A))
.
Чтобы задать абсолютный допуск, задайте и tol
и Пару "имя-значение" 'DataScale'
.
Пример: tol = 0.05
Пример: tol = 1e-8
Пример: tol = eps
Типы данных: single | double
Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми.
Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение.
Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.
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
должен быть 2D массивом.
uniquetol
сравнивает строки A
путем рассмотрения каждого столбца отдельно. Для двух строк, чтобы быть в допуске друг друга, каждый столбец должен быть в допуске.
Каждая строка в A
в допуске строки в C
. Однако никакие две строки в C
не в допуске друг друга.
Две строки, u
и v
, в допуске если all(abs(u-v) <= tol*max(abs(A),[],1))
.
Пример: C = uniquetol(A,tol,'ByRows',true)
'DataScale'
Шкала данныхШкала данных, заданных как пара, разделенная запятой, состоящая из 'DataScale'
и или скаляр или вектор. Задайте DataScale
в виде числа, DS
, чтобы изменить тест допуска, чтобы быть abs(u-v) <= tol*DS
.
Когда используется вместе с опцией ByRows
, значение DataScale
также может быть вектором. В этом случае каждый элемент вектора задает DS
для соответствующего столбца в A
. Если значением в векторе 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,:)
.
Могут быть несколько допустимый C
выходные параметры, которые удовлетворяют условие, никакие два элемента в C
не в допуске друг друга. Функция uniquetol
только возвращает один из допустимых выходных параметров.
uniquetol
сортирует вход лексикографически, и затем начинает в самом низком значении находить уникальные значения в допуске. В результате изменение сортировки входа могло изменить вывод. Например, uniquetol(-A)
не может дать те же результаты как -uniquetol(A)
.
Указания и ограничения по применению:
'ByRows'
и опции 'OutputAllIndices'
не поддержаны.
64-битные целые числа не поддержаны.
Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox).
eps
| ismember
| ismembertol
| unique
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.