행렬 함수

행렬 함수 (Functions of a Matrix)

행렬에 대한 지수(exponential), 로그(logarithm), 제곱근(square root) 같은 함수들을 계산하는 방법을 다뤄요. 이런 함수들은 Taylor 급수나 Padé 근사, Schur 분해 같은 고급 기법을 써서 계산됩니다. Octave 매뉴얼 18.4절을 정리해 볼게요.

출처: Functions of a Matrix

본문

expm

r = expm (A)

행렬의 지수를 돌려줍니다. 행렬 지수는 무한 Taylor 급수로 정의돼요:

expm (A) = I + A + A^2/2! + A^3/3! + ...

하지만 Taylor 급수는 행렬 지수를 계산하는 방법이 아니에요 (Moler and Van Loan, "Nineteen Dubious Ways to Compute the Exponential of a Matrix", SIAM Review, 1978 참고). 이 함수는 세 단계 사전조건화(preconditioning)를 곁들인 Ward의 대각 Padé 근사법(SIAM Journal on Numerical Analysis, 1977)을 사용해요. 대각 Padé 근사는 행렬의 유리 다항식

     -1
D (A)   N (A)

입니다. 이 근사의 Taylor 급수는 위 Taylor 급수의 처음 2q+1개 항과 일치해요. Dq(A)가 조건이 나쁠(ill-conditioned) 때는 Padé 근사 대신 (같은 사전조건화 단계를 곁들인) Taylor 급수를 직접 평가하는 게 바람직할 수 있어요.

See also: logm, sqrtm.

logm

s = logm (A)
s = logm (A, opt_iters)
[s, iters] = logm (...)

정사각 행렬 A의 행렬 로그를 계산해요. 구현은 Padé 근사와 항등식

logm (A) = 2^k * logm (A^(1 / 2^k))

을 활용해요. 선택적 입력 opt_iters는 계산할 제곱근의 최대 개수로 기본값 100이에요. 선택적 출력 iters는 실제로 계산된 제곱근의 개수입니다.

See also: expm, sqrtm.

sqrtm

s = sqrtm (A)
[s, error_estimate] = sqrtm (A)

정사각 행렬 A의 행렬 제곱근을 계산해요.

Ref: N.J. Higham, A New sqrtm for MATLAB, Numerical Analysis Report No. 336, Manchester Centre for Computational Mathematics, Manchester, England, January 1999.

See also: expm, logm.

funm

F = funm (A, fun)
F = funm (A, fun, options)
F = funm (A, fun, options, p1, …)
[F, exitflag] = funm (...)
[F, exitflag, output] = funm (...)

일반 행렬 함수를 평가해요. funm (A, fun)은 정사각 행렬 A에서 함수 fun을 평가해요. 입력 fun (x, k)은 벡터 x에서 평가한 fun이 나타내는 함수의 k번째 도함수를 돌려줘야 해요. 함수 fun은 수렴 반경이 무한한 Taylor 급수 표현을 가져야 합니다.

특별 함수 exp, log, sin, cos, sinh, cosh는 함수 핸들로 넘길 수 있어요. 예를 들어 funm (A, @cos)처럼요.

행렬 제곱근에는 sqrtm을 쓰세요. 행렬 지수에는 A에 따라 expm 또는 funm (A, @exp) 중 하나가 더 빠르거나 정확할 수 있어요.

선택적 세 번째 입력인 옵션 구조체 options로 함수의 장황함(verbosity)을 지정하고 특정 알고리즘에 영향을 줄 수 있어요. options는 다음 필드를 가질 수 있어요:

  • Display — 계산 중 화면에 어떤 정보를 인쇄할지. 문자열 "off"(정보 없음, 기본), "on"(일부 정보), "verbose"(최대 정보), 또는 0(기본)과 5 사이의 스칼라 값. Display"verbose"이거나 스칼라값 ≥ 3이면 고유값과 그룹의 플롯도 표시됩니다.
  • TolBlk — 블로킹 결정에 쓰는 허용오차 (양의 스칼라, 기본 0.1).
  • TolTay — Taylor 급수 평가의 수렴 테스트에 쓰는 허용오차 (양의 스칼라, 기본 eps).
  • MaxTerms — Taylor 급수 항의 최대 개수 (양의 정수, 기본 250).
  • MaxSqrt — 역 스케일링·제곱 과정에서 평가하는 제곱근의 최대 개수 (양의 정수, 기본 100). 로그를 계산할 때만 쓰이며 MaxTerms와 비슷하게 동작.
  • Ord — 행렬 A의 차수와 같은 길이의 벡터 형태로 사용자 지정 블로킹 패턴을 정의.

Octave는 이 필드 이름들에 어떤 대소문자든 받아들여요. options 이후의 모든 입력은 함수 fun에 위치 인자로 전달됩니다.

선택적 출력:

  • exitflag — 종료 조건을 설명하는 스칼라 종료 플래그:
    • 0 — 알고리즘이 성공했음.
    • 1 — 하나 이상의 Taylor 급수 평가가 수렴하지 않았지만, 계산된 F 값은 여전히 정확할 수 있음.
  • output — 다음 필드를 가진 구조체:
    • termsoutput.terms(i)가 i번째 블록을 평가할 때 쓰인 Taylor 급수 항 개수(또는 로그의 경우 2보다 큰 차원 행렬의 제곱근 개수)인 벡터.
    • ind — 재정렬된 Schur 인자 T의 (i,j) 블록이 T(output.ind{i}, output.ind{j})인 cell 배열.
    • ordordschur에 전달된 Schur 형식의 순서.
    • T — 재정렬된 Schur 형식.

Schur 형식이 대각이면 output = struct ("terms", ones (n, 1), "ind", {1:n}, "ord", [], "T", T)이에요.

예시:

F = funm (magic (3), @sin);
⇒ F =
   -0.3850    1.0191    0.0162
    0.6179    0.2168   -0.1844
    0.4173   -0.5856    0.8185

코드

S = funm (X, @sin);
C = funm (X, @cos);

은 (반올림 오류 내에서) 다음과 같은 결과를 만들어요:

E = expm (i*X);
C = real (E);
S = imag (E);

References: Philip I. Davies and Nicholas J. Higham, "A Schur-Parlett algorithm for computing matrix functions", SIAM Journal on Matrix Analysis and Applications, Vol. 25(2), pp. 464–485, 2003. Nicholas J. Higham, Functions of Matrices: Theory and Computation, SIAM, pp. 425, 2008, ISBN 978-0-898716-46-7.

See also: expm, logm, sqrtm.

kron

C = kron (A, B)
C = kron (A1, A2, …)

둘 이상의 행렬의 Kronecker 곱을 만듭니다. 이것은 블록별로 정의돼요:

c = [ a(i,j)*b ]

예를 들어:

kron (1:4, ones (3, 1))
     ⇒   1  2  3  4
         1  2  3  4
         1  2  3  4

입력 인자가 두 개보다 많으면 (A1, A2, …, An) Kronecker 곱은 kron (kron (A1, A2), ..., An)으로 계산됩니다. Kronecker 곱은 결합법칙이 성립하므로 잘 정의돼 있어요.

See also: tensorprod.

tensorprod

C = tensorprod (A, B, dimA, dimB)
C = tensorprod (A, B, dim)
C = tensorprod (A, B)
C = tensorprod (A, B, "all")
C = tensorprod (A, B, …, "NumDimensionsA", value)

수치 텐서 AB 사이의 텐서 곱을 계산해요. 수축(contracted)되는 AB의 차원은 각각 dimAdimB로 정의돼요. dimAdimB는 짝지을 차원을 정의하는 스칼라 또는 같은 길이의 벡터예요. 짝지어진 AB의 차원은 같은 원소 개수를 가져야 해요.

dim만 쓰이면 dimA = dimB = dim과 동등해요. 차원을 지정하지 않으면 dimA = dimB = []이고, AB의 외적(outer product)을 계산해요. "all" 옵션을 쓰면 AB의 내적(inner product)이 돼요. 이 경우 size (A) == size (B)여야 합니다.

AC로 전달되어야 하는 후행 singleton 차원을 가질 때는 속성명 "NumDimensionsA"와 속성값 쌍을 사용하세요. 지정하는 valueA의 총 차원 수여야 해요.

MATLAB Compatibility: Octave는 현재 "NumDimensionsA" 매개변수에 대해 "property_name = value" 구문을 지원하지 않아요.

See also: kron, dot, mtimes.

blkmm

C = blkmm (A, B)

행렬 블록들의 곱을 계산해요. 블록은 배열 A, B의 2차원 부분 배열로 주어집니다. A의 크기는 [m,k,…], B의 크기는 [k,n,…] 형태여야 해요. 결과의 크기는 [m,n,…]이고 다음과 같이 계산됩니다:

for i = 1:prod (size (A)(3:end))
  C(:,:,i) = A(:,:,i) * B(:,:,i)
endfor

sylvester

X = sylvester (A, B, C)

Sylvester 방정식을 풀어요. Sylvester 방정식은:

A X + X B = C

해는 표준 LAPACK 서브루틴으로 계산됩니다. 예를 들어:

sylvester ([1, 2; 3, 4], [5, 6; 7, 8], [9, 10; 11, 12])
   ⇒  [ 0.50000, 0.66667; 0.66667, 0.50000 ]

더 알아보기

  • octave-exponents-and-logarithms — 원소별 지수·로그 함수
  • octave-linear-algebra — 선형대수 전반 (별도 문서)
  • octave-matrix-manipulation — 행렬 다루기 (별도 문서)