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

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