Уникальные значения в пределах допуска
возвращает уникальные элементы в 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]. The 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. The 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
Создайте облако 2-D точек выборки с ограничениями, чтобы находиться внутри окружности радиуса 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
Создайте набор случайных 2-D точек, затем используйте uniquetol чтобы сгруппировать точки в вертикальные полосы, которые имеют сходную (в пределах допуска) x-координату. Используйте эти опции с uniquetol:
Задайте ByRows как true поскольку координаты точек указаны в строках A.
Задайте OutputAllIndices как true чтобы вернуть индексы для всех точек, которые имеют x-координату в пределах допуска друг к другу.
Задайте DataScale как [1 Inf] использовать абсолютную погрешность для x-cordinate во время игнорирования 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 - имя аргумента и 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 должен быть массивом 2-D.
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).
Указания и ограничения по применению:
The 'ByRows' и 'OutputAllIndices' опции не поддерживаются.
64-битные целые числа не поддерживаются.
Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
eps | ismember | ismembertol | unique
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.