숫자 객체 판별 함수

숫자 객체 판별 함수 (Predicates for Numeric Objects)

프로그램이 실행되는 동안 변수의 타입이 바뀔 수 있으므로, 런타임에 타입 검사를 해야 할 때가 있어요. 이렇게 하면 입력의 타입에 따라 함수의 동작을 바꿀 수도 있죠. Octave 매뉴얼 4.8절의 변수 타입 판별 함수들을 정리해 볼게요.

출처: Predicates for Numeric Objects

본문

타입 검사가 유용한 예로, 이 naive 구현의 abs는 입력이 실수면 절댓값을, 복소수면 길이를 돌려줘요.

function a = abs (x)
  if (isreal (x))
    a = sign (x) .* x;
  elseif (iscomplex (x))
    a = sqrt (real(x).^2 + imag(x).^2);
  endif
endfunction

변수의 타입을 판별하는 데 사용할 수 있는 함수는 다음과 같아요.

isnumeric

tf = isnumeric (x)

x가 숫자 객체, 즉 정수, 실수 또는 복소수 배열이면 참을 돌려줍니다. 논리(logical)와 문자(character) 배열은 숫자로 간주되지 않아요.

See also: isinteger, isfloat, isreal, iscomplex, ischar, islogical, isstring, iscell, isstruct, isa.

islogical / isbool

tf = islogical (x)
tf = isbool (x)

x가 논리 객체이면 참을 돌려줍니다.

Programming Note: isboolislogical의 별칭이고 서로 바꿔 쓸 수 있어요.

See also: ischar, isfloat, isinteger, isstring, isnumeric, isa.

isfloat

tf = isfloat (x)

x가 부동소수점 숫자 객체이면 참을 돌려줍니다. double 또는 single 클래스의 객체가 부동소수점 객체예요.

See also: isinteger, ischar, islogical, isnumeric, isstring, isa.

isreal

tf = isreal (x)

x가 비복소수 행렬 또는 스칼라이면 참을 돌려줍니다. MATLAB 호환성을 위해 여기에는 논리와 문자 행렬도 포함돼요.

See also: iscomplex, isnumeric, isa.

iscomplex

tf = iscomplex (x)

x가 복소수 값을 가진 숫자 객체이면 참을 돌려줍니다.

See also: isreal, isnumeric, ischar, isfloat, islogical, isstring, isa.

ismatrix

tf = ismatrix (x)

x가 2차원 배열이면 참을 돌려줍니다. 행렬은 ndims (x) == 2이고 size (x)가 음이 아닌 M과 N에 대해 [M, N]을 반환하는 어떤 타입의 배열이에요.

See also: isscalar, isvector, iscell, isstruct, issparse, isa.

isvector

tf = isvector (x)

x가 벡터이면 참을 돌려줍니다. 벡터는 차원 중 하나가 1(1xN 또는 Nx1)인 어떤 타입의 2차원 배열이에요. 정의의 결과로 1x1 객체(스칼라)도 벡터입니다.

See also: isscalar, ismatrix, iscolumn, isrow, size.

isrow

tf = isrow (x)

x가 행 벡터(row vector)이면 참을 돌려줍니다. 행 벡터는 size (x)가 음이 아닌 N에 대해 [1, N]을 반환하는 어떤 타입의 2차원 배열이에요.

See also: iscolumn, isscalar, isvector, ismatrix, size.

iscolumn

tf = iscolumn (x)

x가 열 벡터(column vector)이면 참을 돌려줍니다. 열 벡터는 size (x)가 음이 아닌 N에 대해 [N, 1]을 반환하는 어떤 타입의 2차원 배열이에요.

See also: isrow, isscalar, isvector, ismatrix, size.

isscalar

tf = isscalar (x)

x가 스칼라이면 참을 돌려줍니다. 스칼라는 size (x)[1, 1]을 반환하는 어떤 타입의 단일 원소 객체예요.

See also: isvector, ismatrix, size.

issquare

tf = issquare (x)

x가 2차원 정사각 배열이면 참을 돌려줍니다. 정사각 배열은 N이 음이 아닌 정수일 때 size (x)[N, N]을 반환하는 어떤 타입의 2차원 배열이에요.

See also: isscalar, isvector, ismatrix, size.

issymmetric

tf = issymmetric (A)
tf = issymmetric (A, tol)
tf = issymmetric (A, "skew")
tf = issymmetric (A, "skew", tol)

Atol이 지정하는 허용오차 내에서 대칭 또는 반대칭(skew-symmetric) 숫자 행렬이면 참을 돌려줍니다. 기본 허용오차는 0(더 빠른 코드 사용)이에요.

검사할 대칭 타입은 추가 입력 "nonskew"(기본, 일반 대칭) 또는 "skew"(반대칭)로 지정할 수 있어요.

배경: 행렬이 대칭(symmetric)이려면 행렬의 전치가 원래 행렬과 같은 것을 의미해요: A == A.'. 허용오차가 주어지면 대칭은 norm (A - A.', Inf) / norm (A, Inf) < tol로 결정됩니다. 행렬이 반대칭이려면 전치가 원래 행렬의 음수와 같은 것: A == -A.'. 허용오차가 주어지면 반대칭은 norm (A + A.', Inf) / norm (A, Inf) < tol로 결정돼요.

See also: ishermitian, isdefinite.

ishermitian

tf = ishermitian (A)
tf = ishermitian (A, tol)
tf = ishermitian (A, "skew")
tf = ishermitian (A, "skew", tol)

Atol 내에서 Hermitian 또는 반-Hermitian(skew-Hermitian) 숫자 행렬이면 참을 돌려줍니다. 기본 허용오차는 0이에요.

검사할 타입은 "nonskew"(기본, 일반 Hermitian) 또는 "skew"(반-Hermitian)로 지정할 수 있어요.

배경: 행렬이 Hermitian이려면 복소 켤레 전치가 원래 행렬과 같은 것: A == A'. 허용오차가 주어지면 norm (A - A', Inf) / norm (A, Inf) < tol로 계산돼요. 반-Hermitian이려면 복소 켤레 전치가 원래 행렬의 음수와 같은 것: A == -A'. 허용오차가 주어지면 norm (A + A', Inf) / norm (A, Inf) < tol로 계산됩니다.

See also: issymmetric, isdefinite.

isdefinite

tf = isdefinite (A)
tf = isdefinite (A, tol)

Atol 내에서 대칭 양의 정부호(symmetric positive definite) 숫자 행렬이면 참을 돌려줍니다. tol을 생략하면 허용오차 100 * eps * norm (A, "fro")를 사용해요.

배경: 양의 정부호 행렬은 모든 고유값이 0보다 큰 행렬이에요. 양의 반정부호(positive semi-definite) 행렬은 모든 고유값이 0보다 크거나 같은 행렬이죠. 행렬 A가 충분히 작은 허용오차 tol에 대해 다음 두 조건이 성립하면 양의 반정부호일 가능성이 매우 높아요.

isdefinite (A) ⇒  0
isdefinite (A + 5*tol, tol) ⇒  1

See also: issymmetric, ishermitian.

isbanded

tf = isbanded (A, lower, upper)

A가 주대각선 아래 lower개, 주대각선 위 upper개의 대각선 사이에 원소가 제한된 숫자 행렬이면 참을 돌려줍니다. lowerupper는 음이 아닌 정수여야 해요.

See also: isdiag, istril, istriu, bandwidth.

isdiag

tf = isdiag (A)

A가 대각 숫자 행렬이면 참을 돌려줍니다. 대각 행렬은 주대각선 위아래의 모든 원소가 0인 2차원 배열로 정의돼요.

See also: isbanded, istril, istriu, diag, bandwidth.

istril

tf = istril (A)

A가 하삼각(lower triangular) 숫자 행렬이면 참을 돌려줍니다. 하삼각 행렬은 주대각선과 그 아래에만 0이 아닌 원소가 있어요.

See also: istriu, isbanded, isdiag, tril, bandwidth.

istriu

tf = istriu (A)

A가 상삼각(upper triangular) 숫자 행렬이면 참을 돌려줍니다. 상삼각 행렬은 주대각선과 그 위에만 0이 아닌 원소가 있어요.

See also: isdiag, isbanded, istril, triu, bandwidth.

isprime

tf = isprime (x)

x의 원소가 소수인 곳은 참, 아닌 곳은 거짓인 논리 배열을 돌려줍니다. 소수는 관례적으로 1보다 큰 양의 정수(예: 2, 3, …)로 정의되며 자기 자신과 1로만 나눠져요. Octave는 이 정의를 음의 정수와 복소수 값까지 확장해요. 음의 정수가 소수이려면 그 양의 대응값이 소수여야 합니다. 이것은 isprime (abs (x))와 동등해요.

class (x)가 복소수이면 소수성은 가우스 정수(Gaussian integer) 영역에서 검사됩니다 (https://en.wikipedia.org/wiki/Gaussian_integer). 일부 비복소수 정수는 보통 의미에서 소수지만 가우스 정수 영역에서는 아닐 수 있어요. 예를 들어 5 = (1+2i)*(1-2i)는 5가 자기 자신과 1 외의 인자를 가지므로 소수가 아님을 보여줘요. 같은 행렬에서 복소수와 실수 값을 함께 검사할 때는 주의하세요.

예시:

isprime (1:6)
  ⇒   0  1  1  0  1  0
isprime ([i, 2, 3, 5])
  ⇒   0  0  1  0

Programming Note: isprime은 abs(x) < 2^64 범위의 모든 x에 적합해요. flintmax보다 큰 입력은 uint64로 캐스팅하세요. 더 큰 입력은 Symbolic 패키지를 설치하고 로드했다면 sym을 사용해요:

isprime (sym ('58745389709258902525390450') + (0:4))
   ⇒   0  1  0  0  0

Compatibility Note: MATLAB은 소수의 정의를 확장하지 않으므로 음수나 복소수 입력이 주어지면 오류를 냅니다.

See also: primes, factor, gcd, lcm.

isuniform

tf = isuniform (v)
[tf, delta] = isuniform (v)

실수 벡터 v가 균일 간격(uniformly spaced)이면 참, 아니면 거짓을 돌려줍니다. 벡터가 균일하려면 모든 원소 사이의 평균 차이(delta)가 4 * eps (max (abs (v)))의 허용오차 내에서 같아야 해요.

선택적 출력 delta는 원소 사이의 균일 차이예요. 벡터가 균일하지 않으면 deltaNaN입니다. delta는 부동소수점 입력에 대해서는 v와 같은 클래스, 정수·논리·문자 입력에 대해서는 double 클래스예요.

Programming Notes: 빈 입력이나 스칼라 입력 같은 특수한 경우에는 출력이 항상 거짓이에요. 어떤 원소가 NaN이면 출력은 거짓이 되고, delta가 계산된 상대 허용오차보다 작으면 eps의 절대 허용오차가 사용됩니다.

See also: linspace, cumsum.

더 알아보기

  • octave-integer-data-types — 정수 데이터 타입
  • octave-numeric-data-types — 수치 데이터 타입 전반 (별도 문서)
  • octave-data-types — 데이터 타입 전반 (별도 문서)