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

Создайте облако 2D точек выборки, ограниченных быть в кругу радиуса 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)

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

Типы данных: 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 должен быть 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 в виде числа, 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