exponenta event banner

uniquetol

Уникальные значения в пределах допуска

Описание

пример

C = uniquetol(A,tol) возвращает уникальные элементы в A использование допуска tol. Два значения, u и v, находятся в пределах допуска, если

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

То есть uniquetol масштабирует tol ввод на основе величины данных.

uniquetol аналогичен unique. Принимая во внимание, что unique выполняет точные сравнения, uniquetol выполняет сравнение с использованием допуска.

пример

C = uniquetol(A) использует допуск по умолчанию 1e-6 для входов с одинарной точностью и 1e-12 для вводов с двойной точностью.

пример

[C,IA,IC] = uniquetol(___) возвращает векторы индекса IA и IC, такой, что C = A(IA) и A~C(IC) (или A(:)~C(IC) если A является матрицей), где ~ означает, что значения находятся в пределах допуска друг к другу. Можно использовать любой из входных аргументов в предыдущих синтаксисах.

пример

[___] = 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

Создание облака из 2-D точек-образцов с зависимостью нахождения внутри круга радиуса 0.5 по центру в точке (12,12).

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)

Figure contains an axes. The axes contains 2 objects of type line.

Создайте вектор случайных чисел и определите уникальные элементы с помощью допуска. Определить 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-координация при игнорировании 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

Figure contains an axes. The axes contains 20 objects of type line.

Входные аргументы

свернуть все

Массив запросов, заданный как скаляр, вектор, матрица или многомерный массив. A должно быть заполнено.

Типы данных: single | double

Допуск сравнения, заданный как положительный, действительный скаляр. uniquetol масштабирует tol ввод с использованием максимального абсолютного значения во входном массиве A. Тогда uniquetol использует результирующий масштабируемый допуск сравнения для определения элементов в A уникальны. Если два элемента в A находятся в пределах допуска друг к другу, то uniquetol считает их равными.

Два значения, u и v, находятся в пределах допуска, если abs(u-v) <= tol*max(abs(A)).

Чтобы задать абсолютный допуск, укажите оба tol и 'DataScale' Пара Наименование (Name) - Значение (Value).

Пример: 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. 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. 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 как числовой скаляр, 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

Выходные аргументы

свернуть все

Уникальные элементы в A (в пределах допуска), возвращается в виде вектора или матрицы. Если A является вектором строки, то C также является вектором строки. В противном случае C является вектором-столбцом. Элементы в C сортируются в порядке возрастания. Каждый элемент в A находится в пределах допуска элемента в C, но никаких двух элементов в C находятся в пределах допуска друг к другу.

Если ByRows опция - true, то C является матрицей, содержащей уникальные строки в A. В этом случае строки в C сортируются в порядке возрастания по первому столбцу. Каждая строка в A находится в пределах допуска строки в C, но не две строки в C находятся в пределах допуска друг к другу.

Индекс в A, возвращается в виде вектора-столбца индексов к первому появлению повторяющихся элементов или в виде массива ячеек. IA в целом удовлетворяет C = A(IA), за следующими исключениями:

  • Если ByRows опция - true, то C = A(IA,:).

  • Если OutputAllIndices опция - true, то IA является массивом ячеек и C(i)~A(IA{i}) где ~ означает, что значения находятся в пределах допуска друг к другу.

Индекс в C, возвращается в виде вектора столбцов индексов. IC удовлетворяет следующим свойствам, где ~ означает, что значения находятся в пределах допуска друг к другу.

  • Если A является вектором, то A~C(IC).

  • Если A является матрицей, то A(:)~C(IC).

  • Если ByRows опция - true, то A~C(IC,:).

Совет

  • Может быть несколько допустимых C выходы, удовлетворяющие условию, не два элемента в C находятся в пределах допуска друг к другу. uniquetol функция возвращает только один из допустимых выходов.

    uniquetol сортирует входные данные лексикографически, а затем начинает с самого низкого значения, чтобы найти уникальные значения в пределах допуска. В результате изменение сортировки входных данных может изменить выходные данные. Например, uniquetol(-A) может не дать тех же результатов, что и -uniquetol(A).

Расширенные возможности

Представлен в R2015a