대각·치환 행렬 생성과 조작
대각·치환 행렬 생성과 조작
대각 행렬이나 치환 행렬처럼 구조가 단순한 행렬은 모든 원소를 다 저장할 필요가 없을 때가 있어요. Octave는 이런 행렬을 특별한 객체로 다루어 저장 공간을 아끼고 연산 속도를 높여 주는데, 이 문서에서 그 기본 사용법을 살펴볼게요.
본문
대각 행렬(diagonal matrix)은 주대각선(main diagonal) 바깥의 원소가 모두 0인 행렬이에요. 다시 말해 D(i,j) == 0이고 i != j인 경우죠. 흔히 정사각 대각 행렬을 생각하지만, 정의는 비정사각 행렬에도 그대로 적용돼서 그런 경우 보통 직사각 대각 행렬(rectangular diagonal matrix)이라고 해요.
치환 행렬(permutation matrix)은 각 행과 각 열에 값 1인 원소가 하나씩만 있는 정사각 행렬이에요. 나머지 원소는 전부 0이죠. 즉 치환 벡터 p가 존재해서 j == p(i)이면 P(i,j) == 1이고, 그 외에는 P(i,j) == 0이에요.
Octave는 실수·복소수 직사각 대각 행렬과 치환 행렬을 특별히 취급해요. 이를 특수한 객체로 저장해 효율적인 저장 방식과 알고리즘을 쓰기 때문에, Octave 언어로 읽기 쉽고 효율적인 행렬 대수 표현식을 작성할 수 있어요. 이 특별 처리는 optimize_diagonal_matrix와 optimize_permutation_matrix 함수로 끌 수 있어요.
optimize_diagonal_matrix
val = optimize_diagonal_matrix ()
old_val = optimize_diagonal_matrix (new_val)
old_val = optimize_diagonal_matrix (new_val, "local")
대각 행렬을 저장할 때 공간 효율적인 특수 형식을 사용할지 조회하거나 설정해요. 기본값은 true예요. 이 옵션을 false로 바꾸면 Octave는 대각 행렬을 일반(full) 행렬로 저장해요. 함수 안에서 "local" 옵션과 함께 호출하면 이 설정은 해당 함수와 그 함수가 호출하는 서브루틴 안에서만 변경되고, 함수를 빠져나가면 원래 값으로 복원돼요. 참고: optimize_range, optimize_permutation_matrix.
optimize_permutation_matrix
val = optimize_permutation_matrix ()
old_val = optimize_permutation_matrix (new_val)
old_val = optimize_permutation_matrix (new_val, "local")
치환 행렬을 저장할 때 공간 효율적인 특수 형식을 사용할지 조회하거나 설정해요. 기본값은 true예요. 이 옵션을 false로 바꾸면 Octave는 치환 행렬을 일반 행렬로 저장해요. 함수 안에서 "local" 옵션과 함께 호출하면 이 설정은 해당 함수와 서브루틴 안에서만 변경되고, 함수를 빠져나가면 원래 값으로 복원돼요. 참고: optimize_range, optimize_diagonal_matrix.
공간 절약 효과는 다음 코드로 드러나요.
x = diag (rand (10, 1));
xf = full (x);
sizeof (x)
⇒ 80
sizeof (xf)
⇒ 800
더 알아보기
- 대각·치환 행렬은 행렬 대수(Matrix Algebra) 문서에서 계속 다뤄져요.
- 범위 객체의 저장 최적화를 다루는
optimize_range, 치환 행렬의optimize_permutation_matrix도 함께 보면 좋아요.