ismembertol

Члены набора в допуске

Синтаксис

LIA = ismembertol(A,B,tol)
LIA = ismembertol(A,B)
[LIA,LocB] = ismembertol(___)
[___] = ismembertol(___,Name,Value)

Описание

пример

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 = 1x15 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

Создайте набор случайных 2D точек, и затем используйте 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 = 6x1 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

Входные параметры

свернуть все

Запросите массив, заданный как скаляр, вектор, матрица или многомерный массив. Вводы 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) — соответствующее значение. Имя должно появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: LIA = ismembertol (A, B, 'ByRows', верный)

Выведите индексный тип, заданный как пара, разделенная запятой, состоящая из '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', верный)

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

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

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

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

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

Пример: LIA = ismembertol (A, B, tol, 'ByRows', верный)

Шкала данных, заданных как пара, разделенная запятой, состоящая из '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', верный, '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

Была ли эта тема полезной?