행렬 재배열
행렬 재배열 (Rearranging Matrices)
행렬을 뒤집거나, 회전하거나, 연결하거나, 차원을 재배치하는 함수들을 정리해요. 데이터를 원하는 형태로 바꾸는 기본 작업들이라 Octave를 쓸 때 정말 자주 만나게 됩니다. Octave 매뉴얼 16.2절을 정리해 볼게요.
본문
fliplr
B = fliplr (A)
배열을 왼쪽에서 오른쪽으로 뒤집어요. A의 열 순서가 뒤집힌 복사본을 돌려줍니다. 즉 수직 축을 기준으로 A를 좌우로 뒤집는 거예요. 예를 들어:
fliplr ([1, 2; 3, 4])
⇒ 2 1
4 3
See also: flipud, flip, rot90, rotdim.
flipud
B = flipud (A)
배열을 상하로 뒤집어요. A의 행 순서가 뒤집힌 복사본을 돌려줍니다. 즉 수평 축을 기준으로 A를 위아래로 뒤집는 거죠. 예를 들어:
flipud ([1, 2; 3, 4])
⇒ 3 4
1 2
See also: fliplr, flip, rot90, rotdim.
flip
B = flip (A)
B = flip (A, dim)
배열 A를 차원 dim을 가로질러 뒤집은 복사본을 돌려줍니다. dim을 지정하지 않으면 기본적으로 첫 번째 비-singleton 차원으로 잡아요. 예시:
## row vector
flip ([1 2 3 4])
⇒ 4 3 2 1
## column vector
flip ([1; 2; 3; 4])
⇒ 4
3
2
1
## 2-D matrix along dimension 1
flip ([1 2; 3 4])
⇒ 3 4
1 2
## 2-D matrix along dimension 2
flip ([1 2; 3 4], 2)
⇒ 2 1
4 3
See also: fliplr, flipud, rot90, rotdim, permute, transpose.
rot90
B = rot90 (A)
B = rot90 (A, k)
배열을 90도 단위로 회전시켜요. A의 원소를 90도씩 반시계 방향으로 회전시킨 복사본을 돌려줍니다. 두 번째 인자는 선택적이며, 몇 번의 90도 회전을 적용할지 지정해요(기본값 1). k가 음수면 행렬을 시계 방향으로 회전시킵니다.
예를 들어:
rot90 ([1, 2; 3, 4], -1)
⇒ 3 1
4 2
은 주어진 행렬을 시계 방향으로 90도 회전시켜요. 다음은 모두 동등한 문장들이에요:
rot90 ([1, 2; 3, 4], -1)
rot90 ([1, 2; 3, 4], 3)
rot90 ([1, 2; 3, 4], 7)
회전은 항상 처음 두 차원(즉, 행과 열)의 평면에서 수행돼요. 다른 평면에서 회전하려면 rotdim을 쓰세요.
See also: rotdim, fliplr, flipud, flip.
rotdim
B = rotdim (A)
B = rotdim (A, n)
B = rotdim (A, n, plane)
배열 A의 원소를 반시계 방향으로 90도씩 회전시킨 복사본을 돌려줍니다. 두 번째 인자 n은 선택적이며 90도 회전 횟수를 지정해요(기본 1). n이 음수면 시계 방향으로 회전합니다.
세 번째 인자도 선택적이며 회전할 평면을 정의해요. 주어지면 plane은 행렬의 서로 다른 두 유효 차원을 담은 2-요소 벡터예요. plane이 주어지지 않으면 처음 두 비-singleton 차원이 사용됩니다.
예를 들어:
rotdim ([1, 2; 3, 4], -1, [1, 2])
⇒ 3 1
4 2
은 주어진 행렬을 시계 방향으로 90도 회전시켜요. 다음은 모두 동등한 문장들이에요:
rotdim ([1, 2; 3, 4], -1, [1, 2])
rotdim ([1, 2; 3, 4], 3, [1, 2])
rotdim ([1, 2; 3, 4], 7, [1, 2])
See also: rot90, fliplr, flipud, flip.
cat
A = cat (dim, array1, array2, …, arrayN)
N-D 배열 객체 array1, array2, …, arrayN을 차원 dim을 따라 연결한 결과를 돌려줍니다.
A = ones (2, 2);
B = zeros (2, 2);
cat (2, A, B)
⇒ 1 1 0 0
1 1 0 0
또는 A와 B를 두 번째 차원을 따라 이렇게 연결할 수도 있어요:
[A, B]
dim은 N-D 배열 객체의 차원보다 클 수 있고, 그러면 다음 예제처럼 결과가 dim개의 차원을 가집니다:
cat (4, ones (2, 2), zeros (2, 2))
⇒ ans(:,:,1,1) =
1 1
1 1
ans(:,:,1,2) =
0 0
0 0
See also: horzcat, vertcat.
horzcat
A = horzcat (array1, array2, …, arrayN)
N-D 배열 객체들을 차원 2를 따라 수평 연결한 결과를 돌려줍니다. 배열은 새 행렬을 만드는 구문으로도 수평 연결할 수 있어요. 예를 들어:
A = [ array1, array2, ... ]
이 구문은 Octave 파서가 함수 호출 오버헤드 없이 배열을 연결할 수 있어서 약간 더 효율적이에요.
See also: cat, vertcat.
vertcat
A = vertcat (array1, array2, …, arrayN)
N-D 배열 객체들을 차원 1을 따라 수직 연결한 결과를 돌려줍니다. 배열은 새 행렬을 만드는 구문으로도 수직 연결할 수 있어요. 예를 들어:
A = [ array1; array2; ... ]
이 구문도 파서 오버헤드가 없어 약간 더 효율적입니다.
See also: cat, horzcat.
permute
B = permute (A, perm)
N-D 배열 객체 A의 일반화된 전치(generalized transpose)를 돌려줍니다. 치환 벡터 perm은 1:ndims (A)의 원소를 담아야 해요(순서는 아무 데나, 하지만 각 원소는 한 번만). A의 N번째 차원은 PERM(N) 차원으로 재배치돼요. 예를 들어:
x = zeros ([2, 3, 5, 7]);
size (x)
⇒ 2 3 5 7
size (permute (x, [2, 1, 3, 4]))
⇒ 3 2 5 7
size (permute (x, [1, 3, 4, 2]))
⇒ 2 5 7 3
## The identity permutation
size (permute (x, [1, 2, 3, 4]))
⇒ 2 3 5 7
See also: ipermute.
ipermute
A = ipermute (B, iperm)
permute 함수의 역함수예요. 표현식
ipermute (permute (A, perm), perm)
은 원래 배열 A를 돌려줍니다.
See also: permute.
reshape
B = reshape (A, m, n, …)
B = reshape (A, [m n …])
B = reshape (A, …, [], …)
B = reshape (A, size)
지정한 차원(m, n, …)을 가진, 원소를 행렬 A에서 가져온 행렬을 돌려줍니다. 행렬의 원소는 열 우선(column-major) 순서로 접근해요(Fortran 배열이 저장되는 방식). 다음 코드는 1x4 행 벡터를 2x2 정사각 행렬로 재구성하는 걸 보여줘요:
reshape ([1, 2, 3, 4], 2, 2)
⇒ 1 3
2 4
원래 행렬의 총 원소 수(prod (size (A)))는 새 행렬의 총 원소 수(prod ([m n …]))와 일치해야 해요. 반환 행렬의 한 차원은 지정하지 않은 채로 둘 수 있고 Octave가 자동으로 크기를 정해요. 빈 행렬 []로 지정 안 된 차원을 표시합니다.
See also: resize, vec, postpad, cat, squeeze.
resize
B = resize (A, m)
B = resize (A, m, n, …)
B = resize (A, [m n …])
필요에 따라 원소를 잘라내면서 A를 재크기 조정해요. 결과에서 어떤 인덱스를 가진 원소는, 그 인덱스가 A의 경계 안에 있으면 A의 해당 원소와 같고, 그렇지 않으면 0으로 설정됩니다.
다시 말해 문장
B = resize (A, dv)
은 다음 코드와 동등해요:
B = zeros (dv, class (A));
sz = min (dv, size (A));
for i = 1:length (sz)
idx{i} = 1:sz(i);
endfor
B(idx{:}) = A(idx{:});
하지만 더 효율적으로 수행됩니다. m만 주어지고 스칼라이면 결과의 차원은 m×m이에요. m, n, …이 모두 스칼라면 결과 차원은 m×n×...이고, 입력이 벡터면 결과 차원은 그 벡터의 원소로 주어집니다.
객체는 가진 차원보다 더 많은 차원으로 재크기 조정할 수 있어요. 그 경우 누락된 차원은 1로 가정합니다. 객체를 더 적은 차원으로 재크기 조정하는 건 불가능해요.
See also: reshape, postpad, prepad, cat.
circshift
y = circshift (x, n)
y = circshift (x, n, dim)
배열 x의 값을 순환 이동시켜요. n은 x의 차원 수보다 길지 않은 정수 벡터여야 해요. n의 값은 양수 또는 음수일 수 있고, 값이 이동하는 방향을 결정해요. n의 원소가 0이면 x의 해당 차원은 이동하지 않습니다. n이 스칼라이고 dim이 지정되지 않으면 이동은 첫 번째 비-singular 차원에 적용돼요.
스칼라 dim이 주어지면 해당 차원을 따라 동작합니다. 이 경우 n도 스칼라여야 해요.
예시:
x = [1, 2, 3;
4, 5, 6;
7, 8, 9];
## positive shift on rows (1st non-singular dim)
circshift (x, 1)
⇒
7 8 9
1 2 3
4 5 6
## negative shift on rows (1st non-singular dim)
circshift (x, -2)
⇒
7 8 9
1 2 3
4 5 6
## no shift of rows, shift columns by 1 (2nd dimension)
circshift (x, [0,1])
⇒
3 1 2
6 4 5
9 7 8
## shift columns (2nd dimension)
circshift (x, 1, 2)
⇒
3 1 2
6 4 5
9 7 8
See also: permute, ipermute, shiftdim.
shiftdim
y = shiftdim (x, n)
[y, ns] = shiftdim (x)
x의 차원을 n만큼 이동시켜요, 여기서 n은 정수 스칼라여야 합니다. n이 양수면 x의 차원이 왼쪽으로 이동하고, 앞쪽 차원들이 끝으로 순환됩니다. n이 음수면 차원이 오른쪽으로 이동하고 n개의 앞쪽 singleton 차원이 추가됩니다.
인자를 하나만 주고 호출하면 shiftdim은 앞쪽 singleton 차원을 제거하고, 제거된 차원 수를 두 번째 출력으로 돌려줍니다.
더 알아보기
- octave-matrix-manipulation — 행렬 다루기 전반 (별도 문서)
- octave-vector-rotation-matrices — 벡터 회전 행렬 (별도 문서)
- octave-strings — 문자열 다루기 (별도 문서)