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]. 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 с центром в точке (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-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

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' Пара "имя-значение".

Пример: 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