exponenta event banner

ismembertol

Элементы набора в пределах допуска

Описание

пример

LIA = ismembertol(A,B,tol) возвращает массив, содержащий логический 1 (true), где элементы A находятся в пределах допуска элементов в B. В противном случае массив содержит логический 0 (false). Два значения, u и v, находятся в пределах допуска, если

abs(u-v) <= tol*max(abs([A(:);B(:)]))

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

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

пример

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

пример

[LIA,LocB] = ismembertol(___) также возвращает массив, LocB, который содержит расположение индекса в B для каждого элемента в A который является членом B. Можно использовать любой из входных аргументов в предыдущих синтаксисах.

пример

[___] = ismembertol(___,Name,Value) использует дополнительные параметры, заданные одним или несколькими аргументами пары Имя-Значение, используя любую из комбинаций входных или выходных аргументов в предыдущих синтаксисах. Например, ismembertol(A,B,'ByRows',true) сравнивает строки A и B и возвращает вектор логического столбца.

Примеры

свернуть все

Создание вектора 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

Использовать ismember для поиска элементов x которые находятся в y. ismember функция выполняет точные сравнения и определяет, что некоторые элементы матрицы в x не являются членами y.

lia = ismember(x,y)
lia = 6x1 logical array

   0
   1
   1
   1
   1
   0

Использовать ismembertol для выполнения сравнения с использованием небольшого допуска. ismembertol обрабатывает элементы, находящиеся в пределах допуска, как равные и определяет, что все элементы в x являются членами y.

LIA = ismembertol(x,y)
LIA = 6x1 logical array

   1
   1
   1
   1
   1
   1

По умолчанию ismembertol ищет элементы, которые находятся в пределах допуска, но он также может найти строки матрицы, которые находятся в пределах допуска.

Создайте числовую матрицу, 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; 0.82 0.91 1.00];
B = log10(10.^A);

Использовать ismember чтобы найти строки A которые находятся в B. ismember выполняет точные сравнения и, таким образом, определяет, что большинство строк в A не являются членами B, даже если некоторые строки отличаются лишь на небольшую величину.

lia = ismember(A,B,'rows')
lia = 5x1 logical array

   0
   0
   0
   0
   1

Использовать ismembertol для выполнения сравнения строк с использованием небольшого допуска. ismembertol обрабатывает строки, которые находятся в пределах допуска, как равные и, таким образом, определяет, что все строки в A являются членами B.

LIA = ismembertol(A,B,'ByRows',true)
LIA = 5x1 logical array

   1
   1
   1
   1
   1

Создайте два вектора случайных чисел и определите, какие значения в A также являются членами B, используя допуск. Определить OutputAllIndices как true для возврата всех индексов для элементов в B которые находятся в пределах допуска соответствующих элементов в A.

rng(5)
A = rand(1,15);
B = rand(1,5);
[LIA,LocAllB] = ismembertol(A,B,0.2,'OutputAllIndices',true)
LIA = 1x15 logical array

   1   0   1   0   1   1   1   1   1   1   0   1   1   1   0

LocAllB=1×15 cell array
  Columns 1 through 5

    {2x1 double}    {[0]}    {2x1 double}    {[0]}    {3x1 double}

  Columns 6 through 10

    {2x1 double}    {[4]}    {3x1 double}    {3x1 double}    {2x1 double}

  Columns 11 through 15

    {[0]}    {2x1 double}    {4x1 double}    {2x1 double}    {[0]}

Найти среднее значение элементов в B которые находятся в пределах допуска значения A(13). Клетка LocAllB{13} содержит все индексы для элементов в B которые находятся в пределах допуска A(13).

A(13)
ans = 0.4413
allB = B(LocAllB{13})
allB = 1×4

    0.2741    0.4142    0.2961    0.5798

aveB = mean(allB)
aveB = 0.3911

По умолчанию ismembertol использует проверку формы на допуск abs(u-v) <= tol*DS, где DS автоматически масштабируется на основе величины входных данных. Можно указать другое DS значение для использования с DataScale вариант. Однако абсолютные допуски (где DS является скаляром) не масштабировать на основе величины входных данных.

Сначала сравните два небольших значения, которые являются расстоянием eps особняком. Определить tol и DS для создания уравнения допуска в пределах abs(u-v) <= 10^-6.

x = 0.1;
ismembertol(x, exp(log(x)), 10^-6, 'DataScale', 1)
ans = logical
   1

Затем увеличьте величину значений. Ошибка округления в расчете exp(log(x)) пропорционально величине значений, в частности eps(x). Несмотря на то, что два больших значения являются расстоянием eps друг от друга, eps(x) теперь намного больше. Поэтому 10^-6 больше не является подходящим допуском.

x = 10^10;
ismembertol(x, exp(log(x)), 10^-6, 'DataScale', 1)
ans = logical
   0

Исправьте эту проблему, используя значение по умолчанию (масштабированное), равное DS.

Y = [0.1 10^10];
ismembertol(Y, exp(log(Y)))
ans = 1x2 logical array

   1   1

Создание набора случайных точек 2-D, а затем использование ismembertol для группирования точек по вертикальным полосам, имеющим координату x (в пределах допуска), аналогичную малому набору точек запроса, B. Используйте эти опции с ismembertol:

  • Определить ByRows как true, поскольку координаты точек находятся в строках A и B.

  • Определить OutputAllIndices как true для возврата индексов для всех точек в A которые имеют координату x в пределах допуска точек запроса в B.

  • Укажите DataScale как [1 Inf] использование абсолютного допуска для координаты X при игнорировании координаты Y.

A = rand(1000,2);
B = [(0:.2:1)',0.5*ones(6,1)];
[LIA,LocAllB] = ismembertol(B, A, 0.1, 'ByRows', true, ...
    'OutputAllIndices', true, 'DataScale', [1,Inf])
LIA = 6x1 logical array

   1
   1
   1
   1
   1
   1

LocAllB=6×1 cell array
    { 94x1 double}
    {223x1 double}
    {195x1 double}
    {212x1 double}
    {187x1 double}
    { 89x1 double}

Постройте график точек в A которые находятся в пределах допуска каждой точки запроса в B.

hold on 
plot(B(:,1),B(:,2),'x')
for k = 1:length(LocAllB)
    plot(A(LocAllB{k},1), A(LocAllB{k},2),'.')
end

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

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

свернуть все

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

При указании ByRows вариант, затем A и B должно иметь одинаковое количество столбцов.

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

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

При указании ByRows вариант, затем A и B должно иметь одинаковое количество столбцов.

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

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

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

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

Пример: tol = 0.05

Пример: tol = 1e-8

Пример: tol = eps

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

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: LIA = ismembertol(A,B,'ByRows',true)

Тип выходного индекса, указанный как разделенная запятыми пара, состоящая из 'OutputAllIndices' и либо false (по умолчанию), true, 0, или 1. ismembertol интерпретирует числовые 0 как false и числовые 1 как true.

Когда OutputAllIndices является true, ismembertol функция возвращает второй вывод, LocB, как массив ячеек. Массив ячеек содержит индексы для всех элементов в B которые находятся в пределах допуска соответствующего значения в A. То есть каждая ячейка в LocB соответствует значению в Aи значения в каждой ячейке соответствуют местоположениям в B.

Пример: [LIA,LocAllB] = ismembertol(A,B,tol,'OutputAllIndices',true)

Переключатель сравнения строк, заданный как разделенная запятыми пара, состоящая из 'ByRows' и либо false (по умолчанию), true, 0, или 1. ismembertol интерпретирует числовые 0 как false и числовые 1 как true. Используйте этот параметр для поиска строк в A и B которые находятся в пределах допуска.

Когда ByRows является true:

  • ismembertol сравнивает строки A и B рассматривая каждый столбец отдельно. Таким образом, A и B должны быть 2-D массивы с одинаковым количеством столбцов.

  • Если соответствующая строка в A находится в пределах допуска строки в B, то LIA содержит логические 1 (true). В противном случае он содержит логические 0 (false).

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

Пример: LIA = ismembertol(A,B,tol,'ByRows',true)

Масштаб данных, указанный как разделенная запятыми пара, состоящая из 'DataScale' и скаляр или вектор. Определить DataScale как числовой скаляр, DS, чтобы изменить критерий допуска на, abs(u-v) <= tol*DS.

При использовании вместе с ByRows опция, DataScale значение также может быть вектором. В этом случае каждый элемент вектора определяет DS для соответствующего столбца в A. Если значение в DataScale вектор - Inf, то ismembertol игнорирует соответствующий столбец в A.

Пример: LIA = ismembertol(A,B,'DataScale',1)

Пример: [LIA,LocB] = ismembertol(A,B,'ByRows',true,'DataScale',[eps(1) eps(10) eps(100)])

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

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

свернуть все

Логический индекс для A, возвращается в виде вектора или матрицы, содержащей логические 1 (true) везде, где элементы (или строки) в A являются членами B (в пределах допуска). В другом месте, LIA содержит логические 0 (false).

LIA имеет тот же размер, что и A, если не указано значение ByRows вариант. В этом случае LIA - вектор столбца с тем же количеством строк, что и A.

Расположения в B, возвращается в виде вектора, матрицы или массива ячеек. LocB содержит индексы к элементам (или строкам) в B которые находятся в A (в пределах допуска). LocB содержит 0 где элемент в A не является членом B.

Если OutputAllIndices является true, то ismembertol прибыль LocB в виде массива ячеек. Массив ячеек содержит индексы для всех элементов в B которые находятся в пределах допуска соответствующего значения в A. То есть каждая ячейка в LocB соответствует значению в Aи значения в каждой ячейке соответствуют местоположениям в B.

LocB имеет тот же размер, что и A, если не указано значение ByRows вариант. В этом случае LocB - вектор столбца с тем же количеством строк, что и A.

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

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