집합 연산
집합 연산 (Set Operations)
Octave는 몇 가지 기본 집합 연산을 지원해요. 두 집합의 합집합(union), 교집합(intersection), 차집합(difference)을 계산할 수 있고, 배타적 논리합(XOR) 집합 연산도 지원합니다.
출처: Set Operations
본문
집합 연산 함수들은 모두 같은 방식으로 동작해요. 두 입력 집합을 받아 세 번째 집합을 돌려줍니다. 예를 들어 a와 b가 두 집합을 담고 있다면
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(…)¶** —a와b에 공통으로 있는 고유 요소를 돌려줍니다.
a와 b가 모두 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 a와 b의 공통 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.
선택 인자 "sorted"/"stable"은 출력에 고유 값이 나타나는 순서를 조절해요. 기본값은 "sorted"로 출력 값이 오름차순으로 배치되고, 대안인 "stable"은 입력에서 발견된 순서를 유지합니다. 요청하면 c = a(ia)와 c = b(ib)를 만족하는 열 인덱스 벡터 ia와 ib를 돌려줘요.
프로그래밍 노트: 입력 플래그 "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에 있는 고유 요소를 돌려줍니다.
a와 b가 모두 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 a 또는 b에 있는 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.
선택 인자 "sorted"/"stable"은 출력 순서를 조절하고, 기본값은 "sorted"(오름차순)이며 "stable"은 입력 순서를 유지합니다. 선택 출력 ia와 ib는 a(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에만 있는 고유 요소를 돌려줍니다.
a와 b가 모두 행 벡터이면 행 벡터를, 그 외에는 열 벡터를 돌려줘요. 입력은 문자열 셀 배열일 수도 있습니다. 선택 입력 "rows"를 주면 집합 a와 b에만 있는 행을 돌려줍니다. 이 옵션을 쓰려면 입력이 2차원 숫자 행렬이어야 해요.
선택 인자 "sorted"/"stable"은 출력 순서를 조절하고, 기본값은 "sorted"이며 "stable"은 입력 순서를 유지합니다. 선택 출력 ia와 ib는 a(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]
입력 a와 s는 셀 배열일 수도 있어요.
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 인덱스도 돌려줘요. 입력 a와 s는 숫자 값이어야 해요.
a = [3, 10, 1];
s = [0:9];
[tf, s_idx] = ismembertol (a, s)
⇒ tf = [1, 0, 1]
⇒ s_idx = [4, 0, 2]
선택 속성/값 쌍으로 함수 동작을 바꿀 수 있어요. 속성은 다음 문자열 중 하나입니다.
"ByRows"—false(기본값)로 설정하면a와s의 모든 요소를 개별적으로 취급해요.true로 설정하면 주어진 허용 오차 안에서s의 행과 매칭되는a의 각 행에 대해tf가true가 됩니다. 두 행u와v는all (abs (u-v) ≤ tol*max (abs (u), abs (v)))조건을 만족하면 허용 오차 안에 있어요."OutputAllIndices"—false(기본값)로 설정하면s_idx에 매칭 중 하나의 인덱스만 담겨요.true로 설정하면s_idx는a의 대응 값과 허용 오차 안에 있는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) 함수를 함께 보면 도움이 돼요.