Main Content

ismembertol

허용오차 내에서 집합의 구성원인지 확인

설명

예제

LIA = ismembertol(A,B,tol)A의 요소가 B의 요소의 허용오차 범위 내에 있는 경우 논리값 1(true)을 포함하는 배열을 반환합니다. 그렇지 않으면 이 배열은 논리값 0(false)을 포함합니다. 다음과 같은 경우 두 값 uv는 허용오차 범위 내에 있는 것입니다.

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

즉, ismembertol은 데이터의 크기를 기반으로 하여 tol 입력값을 스케일링합니다.

ismembertolismember와 유사합니다. ismember는 정확한 비교를 수행하는 반면 ismembertol은 허용오차를 사용하여 비교를 수행합니다.

예제

LIA = ismembertol(A,B)는 단정밀도 입력값에 대해 디폴트 허용오차 1e-6을 사용하고, 배정밀도 입력값에 대해서는 1e-12를 사용합니다.

예제

[LIA,LocB] = ismembertol(___)B의 구성원인, A의 각 요소에 대해 B에서의 인덱스 위치를 포함하는 배열 LocB를 반환합니다. 위에 열거된 구문 중 하나의 입력 인수를 사용할 수 있습니다.

예제

[___] = ismembertol(___,Name,Value)는 위에 열거된 구문에 나와 있는 입력 인수나 출력 인수 조합 중 하나를 사용하여 하나 이상의 이름-값 쌍의 인수로 지정된 추가적인 옵션을 사용합니다. 예를 들어, ismembertol(A,B,'ByRows',true)A의 행과 B의 행을 비교한 후 논리형 열 벡터를 반환합니다.

예제

모두 축소

벡터 x를 만듭니다. x를 변환한 후 이 변환된 값을 다시 역변환하여 두 번째 벡터 y를 얻습니다. 이 변환 과정에서 y에 반올림 차분이 발생합니다.

x = (1:6)'*pi;
y = 10.^log10(x);

차분을 가져와서 xy가 동일하지 않은지 확인합니다.

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를 만듭니다. A를 변환한 후 변환을 해제하여 두 번째 행렬 B를 얻습니다. 이 변환 과정에서 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의 구성원이기도 한 값을 확인합니다. OutputAllIndicestrue로 지정하여 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
    {2x1 double}    {[0]}    {2x1 double}    {[0]}    {3x1 double}    {2x1 double}    {[4]}    {3x1 double}    {3x1 double}    {2x1 double}    {[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

기본적으로 ismembertolabs(u-v) <= tol*DS 형식의 허용오차 테스트를 사용합니다. 여기서 DS는 입력 데이터의 크기를 기반으로 하여 자동으로 스케일링됩니다. DataScale 옵션과 함께 사용할 다른 DS 값을 지정할 수 있습니다. 그러나 절대 허용오차(여기서 DS는 스칼라임)는 입력 데이터의 크기를 기반으로 하여 스케일링되지 않습니다.

먼저, 거리가 eps만큼 떨어져 있는 두 개의 작은 값을 비교합니다. tolDS를 지정하여 허용오차 내 방정식 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차원 점 집합을 만든 다음, ismembertol을 사용하여 작은 쿼리 점 집합 B와 유사한(허용오차 범위 내) x 좌표를 갖는 점을 세로 띠로 그룹화합니다. 다음 옵션을 ismembertol에 사용할 수 있습니다.

  • 점 좌표가 A의 행과 B의 행에 있으므로 ByRowstrue로 지정합니다.

  • OutputAllIndicestrue로 지정하여 A의 점 중 B의 쿼리 점의 허용오차 범위 내에 있는 x 좌표를 갖는 모든 점에 대해 인덱스를 반환합니다.

  • 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 object. The axes object contains 7 objects of type line. One or more of the lines displays its values using only markers

입력 인수

모두 축소

쿼리 배열로, 스칼라, 벡터, 행렬, 다차원 배열 중 하나로 지정됩니다. 입력 인수 AB는 비희소(Full) 형식이어야 합니다.

ByRows 옵션을 지정할 경우 AB는 열 개수가 같아야 합니다.

데이터형: single | double

쿼리 배열로, 스칼라, 벡터, 행렬, 다차원 배열 중 하나로 지정됩니다. 입력 인수 AB는 비희소(Full) 형식이어야 합니다.

ByRows 옵션을 지정할 경우 AB는 열 개수가 같아야 합니다.

데이터형: single | double

비교 허용오차로, 양의 실수형 스칼라로 지정됩니다. ismembertol은 입력 배열 AB의 최대 절댓값을 사용하여 tol 입력값을 스케일링합니다. 그런 다음 ismembertol은 결과로 생성되는 스케일링된 비교 허용오차를 사용하여 A의 요소 중 B의 구성원이기도 한 요소를 확인합니다. 두 요소가 서로의 허용오차 범위 내에 있으면 ismembertol은 이 두 요소를 같은 것으로 간주합니다.

abs(u-v) <= tol*max(abs([A(:);B(:)]))인 경우 두 값 uv는 허용오차 범위 내에 있는 것입니다.

절대 허용오차를 지정하려면 tol'DataScale' 이름-값 쌍을 모두 지정하십시오.

예: tol = 0.05

예: tol = 1e-8

예: tol = eps

데이터형: single | double

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: LIA = ismembertol(A,B,'ByRows',true)

출력 인덱스 유형으로, 'OutputAllIndices'와 함께 false(디폴트 값), true, 0, 1 중 하나가 쉼표로 구분되어 지정됩니다. ismembertol은 숫자 0false로 해석하고 숫자 1true로 해석합니다.

OutputAllIndicestrue이면 ismembertol 함수는 두 번째 출력값 LocB를 셀형 배열로 반환합니다. 이 셀형 배열은 B의 요소 중 A의 대응값이 허용오차 범위 내에 있는 모든 요소에 대한 인덱스를 포함합니다. 즉, LocB의 각 셀은 A의 값에 대응하며, 각 셀의 값은 B에서의 위치에 대응합니다.

예: [LIA,LocAllB] = ismembertol(A,B,tol,'OutputAllIndices',true)

행 비교 여부로, 'ByRows'와 함께 false(디폴트 값), true, 0, 1 중 하나가 쉼표로 구분되어 지정됩니다. ismembertol은 숫자 0false로 해석하고 숫자 1true로 해석합니다. AB에서 허용오차 범위 내에 있는 행을 찾으려면 이 옵션을 사용하십시오.

ByRowstrue인 경우:

  • ismembertol은 각 열을 별도로 고려하여 AB의 행을 비교합니다. 따라서 AB는 열 개수가 동일한 2차원 배열이어야 합니다.

  • A의 대응하는 행이 B의 행의 허용오차 범위 내에 있는 경우, LIA는 논리값 1(true)을 포함합니다. 그렇지 않으면 논리값 0(false)을 포함합니다.

all(abs(u-v) <= tol*max(abs([A;B])))인 경우 두 개의 행 uv는 허용오차 범위 내에 있는 것입니다.

예: LIA = ismembertol(A,B,tol,'ByRows',true)

데이터 스케일링으로, 'DataScale'과 함께 스칼라 또는 벡터가 쉼표로 구분되어 지정됩니다. DataScale을 숫자형 스칼라 DS로 지정하여 허용오차 테스트를 abs(u-v) <= tol*DS로 변경합니다.

ByRows 옵션과 함께 사용할 경우 DataScale 값은 벡터가 될 수도 있습니다. 이 경우 벡터의 각 요소는 A의 대응하는 열에 대해 DS를 지정합니다. DataScale 벡터의 값이 Inf이면 ismembertolA의 대응하는 열을 무시합니다.

예: LIA = ismembertol(A,B,'DataScale',1)

예: [LIA,LocB] = ismembertol(A,B,'ByRows',true,'DataScale',[eps(1) eps(10) eps(100)])

데이터형: single | double

출력 인수

모두 축소

A에 대한 논리형 인덱스로, A의 요소(또는 행)가 B의 구성원(허용오차 범위 내)인 경우 항상 논리값 1 (true)을 포함하는 벡터 또는 행렬로 반환됩니다. 그렇지 않으면 LIA는 논리값 0(false)을 포함합니다.

ByRows 옵션을 지정하지 않는 한 LIAA와 크기가 같습니다. 이 옵션을 지정할 경우 LIAA와 행 개수가 동일한 열 벡터입니다.

B에서의 위치로, 벡터, 행렬, 셀형 배열 중 하나로 반환됩니다. LocBB의 요소(또는 행) 중 A에도(허용오차 범위 내) 있는 요소에 대한 인덱스를 포함합니다. LocBA의 요소가 B의 구성원이 아닌 경우 항상 0을 포함합니다.

OutputAllIndicestrue이면 ismembertolLocB를 셀형 배열로 반환합니다. 이 셀형 배열은 B의 요소 중 A의 대응값이 허용오차 범위 내에 있는 모든 요소에 대한 인덱스를 포함합니다. 즉, LocB의 각 셀은 A의 값에 대응하며, 각 셀의 값은 B에서의 위치에 대응합니다.

ByRows 옵션을 지정하지 않는 한 LocBA와 크기가 같습니다. 이 옵션을 지정할 경우 LocBA와 행 개수가 동일한 열 벡터입니다.

확장 기능

버전 내역

R2015a에 개발됨