집합 연산

집합 연산 (Set Operations)

Octave는 몇 가지 기본 집합 연산을 지원해요. 두 집합의 합집합(union), 교집합(intersection), 차집합(difference)을 계산할 수 있고, 배타적 논리합(XOR) 집합 연산도 지원합니다.

출처: Set Operations

본문

집합 연산 함수들은 모두 같은 방식으로 동작해요. 두 입력 집합을 받아 세 번째 집합을 돌려줍니다. 예를 들어 ab가 두 집합을 담고 있다면

union (a, b)

처럼 호출해 두 집합의 합집합을 계산해요.

마지막으로 어떤 요소가 집합에 속하는지 판별하는 것은 ismember 함수로 할 수 있어요. 집합은 정렬되어 있기 때문에 이 연산은 매우 효율적이라 O(log2(n))의 복잡도를 가지며, O(n)인 find 함수보다 선호됩니다.

  • c = intersect (a, b)c = intersect (a, b, "rows")c = intersect (…, "sorted")c = intersect (…, "stable")c = intersect (…, "legacy")[c, ia, ib] = intersect (…) ¶** — ab에 공통으로 있는 고유 요소를 돌려줍니다.

ab가 모두 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 ab의 공통 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.

선택 인자 "sorted"/"stable"은 출력에 고유 값이 나타나는 순서를 조절해요. 기본값은 "sorted"로 출력 값이 오름차순으로 배치되고, 대안인 "stable"은 입력에서 발견된 순서를 유지합니다. 요청하면 c = a(ia)c = b(ib)를 만족하는 열 인덱스 벡터 iaib를 돌려줘요.

프로그래밍 노트: 입력 플래그 "legacy"는 R2012b 이전 MATLAB 릴리스와 호환되도록 알고리즘을 바꿉니다.

참고: unique, union, setdiff, setxor, ismember.

  • c = union (a, b)c = union (a, b, "rows")c = union (…, "sorted")c = union (…, "stable")c = union (…, "legacy")[c, ia, ib] = union (…) ¶** — a 또는 b에 있는 고유 요소를 돌려줍니다.

ab가 모두 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 a 또는 b에 있는 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.

선택 인자 "sorted"/"stable"은 출력 순서를 조절하고, 기본값은 "sorted"(오름차순)이며 "stable"은 입력 순서를 유지합니다. 선택 출력 iaiba(ia)b(ib)가 서로소 집합이면서 그 합집합이 c가 되게 하는 열 인덱스 벡터예요.

프로그래밍 노트: 입력 플래그 "legacy"는 R2012b 이전 MATLAB 릴리스와 호환되도록 알고리즘을 바꿉니다.

참고: unique, intersect, setdiff, setxor, ismember.

  • c = setdiff (a, b)c = setdiff (a, b, "rows")c = setdiff (…, "sorted")c = setdiff (…, "stable")c = setdiff (…, "legacy")[c, ia] = setdiff (…) ¶** — a에는 있지만 b에는 없는 고유 요소를 돌려줍니다.

a가 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 a에는 있지만 b에는 없는 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.

선택 인자 "sorted"/"stable"은 출력 순서를 조절하고, 기본값은 "sorted"이며 "stable"은 입력 순서를 유지합니다. 요청하면 c = a(ia)를 만족하는 인덱스 벡터 ia를 돌려줘요.

프로그래밍 노트: 입력 플래그 "legacy"는 R2012b 이전 MATLAB 릴리스와 호환되도록 알고리즘을 바꿉니다.

참고: unique, union, intersect, setxor, ismember.

  • c = setxor (a, b)c = setxor (a, b, "rows")c = setxor (…, "sorted")c = setxor (…, "stable")c = setxor (…, "legacy")[c, ia, ib] = setxor (…) ¶** — 집합 a 또는 b에만 있는 고유 요소를 돌려줍니다.

ab가 모두 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 집합 ab에만 있는 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.

선택 인자 "sorted"/"stable"은 출력 순서를 조절하고, 기본값은 "sorted"이며 "stable"은 입력 순서를 유지합니다. 선택 출력 iaiba(ia)b(ib)가 서로소 집합이면서 그 합집합이 c가 되게 하는 열 인덱스 벡터예요.

프로그래밍 노트: 입력 플래그 "legacy"는 R2012b 이전 MATLAB 릴리스와 호환되도록 알고리즘을 바꿉니다.

참고: unique, union, intersect, setdiff, ismember.

  • tf = ismember (a, s)tf = ismember (a, s, "rows")[tf, s_idx] = ismember (…) ¶** — a와 같은 모양의 논리 행렬 tf를 돌려줍니다. a의 요소가 s에서 발견되면 true(1), 아니면 false(0)이에요.

두 번째 출력 인자를 요청하면 각 매칭 요소의 s 인덱스도 돌려줍니다.

a = [3, 10, 1];
s = [0:9];
[tf, s_idx] = ismember (a, s)
     ⇒  tf = [1, 0, 1]
     ⇒  s_idx = [4, 0, 2]

입력 as는 셀 배열일 수도 있어요.

a = {"abc"};
s = {"abc", "def"};
[tf, s_idx] = ismember (a, s)
     ⇒  tf = 1
     ⇒  s_idx = 1

선택 세 번째 인자 "rows"를 주면 a의 행을 s의 행과 비교해요. 이 옵션을 쓰려면 입력이 열 수가 같은 2차원 행렬이어야 합니다.

a = [1:3; 5:7; 4:6];
s = [0:2; 1:3; 2:4; 3:5; 4:6];
[tf, s_idx] = ismember (a, s, "rows")
     ⇒  tf = logical ([1; 0; 1])
     ⇒  s_idx = [2; 0; 5];

참고: lookup, unique, union, intersect, setdiff, setxor, ismembertol.

  • tf = ismembertol (a, s)tf = ismembertol (a, s, tol)tf = ismembertol (a, s, name, value)[tf, s_idx] = ismembertol (…) ¶** — 값들이 허용 오차(tolerance) 안에서 집합의 요소인지 검사합니다.

이 함수는 a와 같은 모양의 논리 행렬 tf를 돌려줘요. a의 요소가 허용 오차 tol 안에서 s에 가까우면 true(1), 아니면 false(0)입니다. tol을 지정하지 않으면 기본값 1e-6이 사용됩니다. 두 번째 출력 인자를 요청하면 각 매칭 요소의 s 인덱스도 돌려줘요. 입력 as는 숫자 값이어야 해요.

a = [3, 10, 1];
s = [0:9];
[tf, s_idx] = ismembertol (a, s)
     ⇒  tf = [1, 0, 1]
     ⇒  s_idx = [4, 0, 2]

선택 속성/값 쌍으로 함수 동작을 바꿀 수 있어요. 속성은 다음 문자열 중 하나입니다.

  • "ByRows"false(기본값)로 설정하면 as의 모든 요소를 개별적으로 취급해요. true로 설정하면 주어진 허용 오차 안에서 s의 행과 매칭되는 a의 각 행에 대해 tftrue가 됩니다. 두 행 uvall (abs (u-v) ≤ tol*max (abs (u), abs (v))) 조건을 만족하면 허용 오차 안에 있어요.
  • "OutputAllIndices"false(기본값)로 설정하면 s_idx에 매칭 중 하나의 인덱스만 담겨요. true로 설정하면 s_idxa의 대응 값과 허용 오차 안에 있는 s의 모든 요소 인덱스를 담은 셀 배열입니다.
  • "DataScale" — 제공된 값 DS로 허용 오차 검사에서 스케일 계수를 abs (u-v) ≤ tol*max (abs (u), abs (v))*DS로 바꿔요.

예:

s = [1:6].' * pi;
a = 10.^log10 (x);
[tf, s_idx] = ismembertol (a, s);

참고: ismember, lookup, unique, union, intersect, setdiff, setxor.

  • p = powerset (a)p = powerset (a, "rows") ¶ — 집합 a의 멱집합(모든 부분집합)을 계산합니다.

집합 a는 숫자 행렬 또는 문자열 셀 배열이어야 해요. 출력은 항상 벡터 또는 문자열들의 셀 배열입니다. 선택 인자 "rows"를 주면 집합 a의 각 행을 집합의 한 요소로 간주해요. 이 인자를 쓰려면 입력이 2차원 숫자 행렬이어야 해요.

참고: unique, union, intersect, setdiff, setxor, ismember.

더 알아보기

집합 개념을 확장해 보려면 정렬(sort), 유일값(unique), 그리고 검색(lookup) 함수를 함께 보면 도움이 돼요.