GNU Octave 행렬 조작

GNU Octave 행렬 조작 (Matrix Manipulation)

Octave는 행렬을 다루기 위한 다양한 유틸리티 함수를 제공해요. 어떤 원소가 조건을 만족하는지 확인하는 함수부터, 행렬의 순서를 뒤집는 함수, 그리고 특별한 형태의 행렬을 만드는 함수까지 하나씩 살펴볼게요.

출처: GNU Octave Matrix Manipulation

본문

원소 찾기와 조건 확인

anyall 함수는 행렬의 원소 몇 개(a또는 전부)가 어떤 조건을 만족하는지 판별하는 데 유용해요. find 함수는 어떤 원소들이 특정 조건을 충족하는지 알아내는 데도 쓰여요.

any (x) — 원소 중 아무거나 0이 아니거나 true이면 true(logical 1)를 반환해요. x가 벡터면 원소 중 하나라도 0이 아니면 true예요. x가 행렬이면 열마다 그 열의 원소 중 0이 아닌 것이 있는지 나타내는 행 벡터를 반환해요. x가 배열이면 첫 번째 비-특이(non-singleton) 차원을 따라 동작해요. 선택 인자 dim은 동작할 차원을 지정하며 양의 정수여야 해요. 여러 차원을 vecdim 벡터로 지정하거나 "all"로 모든 원소에 대해 동작할 수도 있어요. "all"any (x(:))와 동등해요.

all (x) — 모든 원소가 0이 아니거나 true이면 true를 반환해요. 벡터면 모든 원소가 0이 아닐 때, 행렬이면 각 열의 모든 원소가 0이 아닌지 나타내는 행 벡터를 반환해요. 동작 방식은 any와 같아요.

비교 연산자(Comparison Operators)가 0과 1로 이루어진 행렬을 반환하므로, 원소가 0이 아닌지뿐 아니라 다양한 조건으로 행렬을 테스트하기 쉬워요. 예를 들어:

all (all (rand (5) < 0.9))
⇒ 0

이 코드는 무작위 5×5 행렬의 모든 원소가 0.9보다 작은지 테스트해요. 조건부 문맥(if와 while 문의 테스트 절)에서 Octave는 테스트를 all (all (condition))을 입력한 것처럼 다뤄요.

xor (x, y) — 배타적 논리합을 반환해요. x와 y 중 하나만 true일 때 true이고, 둘 다 true이거나 둘 다 false면 false예요. 인자가 둘보다 많으면 왼쪽에서 오른쪽으로 누적 적용돼요.

diff (x) — x가 길이 n인 벡터면 일차 차분 벡터 x(2)-x(1), …, x(n)-x(n-1)을 반환해요. 행렬이면 첫 번째 비-특이 차원을 따라 열 차분을 구해요. 두 번째 인자 k(음이 아닌 정수)를 주면 k차 차분을 반환해요. dim으로 차분을 구할 차원을 명시할 수도 있어요.

isinf (x) — x의 원소가 무한대인 곳에서 true인 논리 배열을 반환해요. isnan (x)는 NaN인 곳에서 true를, isfinite (x)는 유한한 곳에서 true를 반환해요. NA 값도 NaN으로 간주돼요. 예:

isinf ([13, Inf, NA, NaN]) ⇒ [ 0, 1, 0, 0 ]
isnan ([13, Inf, NA, NaN]) ⇒ [ 0, 0, 1, 1 ]
isfinite ([13, Inf, NA, NaN]) ⇒ [ 1, 0, 0, 0 ]

common_size (xi, …) — 모든 입력 인자가 스칼라이거나 공통 크기인지 판별해요. 그렇다면 err는 0이고, 스칼라는 공통 크기의 행렬로 확장돼요. 공통 크기로 맞출 수 없으면 err는 1이에요. 인자가 스칼라이거나 공통 크기인 함수를 구현할 때 유용해요.

[err, a, b] = common_size ([1 2; 3 4], 5)
⇒ err = 0
⇒ a = [ 1, 2; 3, 4 ]
⇒ b = [ 5, 5; 5, 5 ]

find (x) — 행렬의 0이 아닌 원소들의 인덱스 벡터를 반환해요. x가 행 벡터면 행으로, 아니면 열로 반환해요. 행렬의 각 원소에 대해 하나의 인덱스를 얻기 위해 Octave는 행렬의 열들이 하나의 긴 벡터를 이룬다고 가정해요(Fortran 배열 저장 방식). 예:

find (eye (2))
⇒ [ 1; 4 ]

두 번째 인자 n은 처음부터 찾을 최대 원소 수를 나타내요. direction"first""last"로 처음 또는 마지막 n개의 인덱스만 요청해요. 출력이 두 개면 [i, j] = find (…) 형태로 행과 열 인덱스를 반환하고, 세 개면 [i, j, v] = find (…)로 0이 아닌 값도 함께 반환해요. 이 함수는 희소 행렬에 특히 유용한데, 0이 아닌 원소를 벡터로 추출해 원래 행렬을 다시 만들 수 있기 때문이에요:

sz = size (a);
[i, j, v] = find (a);
b = sparse (i, j, v, sz(1), sz(2));

lookup (table, y) — 정렬된 테이블에서 값을 찾아요. 보통 보간(interpolation)의 전단계로 쓰여요. table이 증가하는 길이 N의 테이블이고 idx = lookup (table, y)라면, table 범위 안의 모든 y(i)에 대해 table(idx(i)) <= y(i) < table(idx(i+1))을 만족해요. 복잡도는 O(Mlog(N))이고, y도 정렬돼 있으면 O(min(Mlog(N), M+N))이에요. 옵션 문자열로 m(정확히 일치), b(불리언 포함 여부), l(왼쪽 구간을 -무한대로 확장), r(오른쪽 구간을 무한대로 확장)을 지정할 수 있어요. table이 정렬돼 있지 않으면 결과는 예측 불가능해요.

행렬 재배열

  • fliplr (A) — 배열을 좌우로 뒤집어요. 열 순서를 반대로 한 복사본을 반환해요(수직 축 기준 좌우 반전). fliplr ([1, 2; 3, 4])2 1 / 4 3.
  • flipud (A) — 배열을 상하로 뒤집어요. 행 순서를 반대로 한 복사본을 반환해요(수평 축 기준 상하 반전). flipud ([1, 2; 3, 4])3 4 / 1 2.
  • flip (A, dim) — 배열을 지정 차원 dim을 기준으로 뒤집어요. dim을 지정하지 않으면 첫 번째 비-특이 차원이 기본값이에요.
  • rot90 (A, k) — 배열을 90도 단위로 반시계방향 회전해요. k는 90도 회전 횟수(기본값 1)이고 음수면 시계방향이에요.

특수 유틸리티 행렬

  • eye (n) / eye (m, n) — 단위 행렬을 반환해요. 인자 없이 호출하면 스칼라 1을, 단일 스칼라 인자 n이면 n×n 정사각 단위 행렬을, 두 스칼라 인자(m, n) 또는 2원소 벡터 [m, n]이면 m×n 단위 행렬을 반환해요. 선택 인자 class는 반환형을 지정하며 기본은 "double"이에요. 예: eye (2, "uint8")는 2×2 uint8 단위 행렬. 인자 없이 호출하는 건 인자 1로 호출하는 것과 동등하고, 음수 차원은 0으로 처리돼요(MATLAB 호환용).
  • ones (n) / ones (m, n, …) — 모든 원소가 1인 스칼라·행렬·N차원 배열을 반환해요. 인자 없이 호출하면 스칼라 1을 반환해요. "like", var 인자로 var와 같은 특성을 갖도록 만들 수도 있어요.
  • gallery (name, …) — 유명한 행렬 형태를 만들어 테스트할 때 써요. Cauchy 행렬("cauchy"), Chebyshev 스펙트럼 미분 행렬("chebspec"), circulant 행렬("circul"), 대각선이 0인 삼중대각 행렬("clement"), 조건 추정에 대한 반례 행렬("condex"), 열이 주기적으로 반복되는 행렬("cycol") 등 다양한 이름을 지원해요.

더 알아보기

  • any/all/find/diff로 행렬 원소의 조건을 검사해요
  • isfinite/isinf/isnan으로 유한·무한·NaN 여부를 확인해요
  • fliplr/flipud/flip/rot90으로 행렬을 재배열하고, eye/ones/gallery로 특수 행렬을 만들어요