기본 조작법
행렬 만들기
꺽쇠괄호로 묶고 행은 세미콜론, 열은 쉼표로 구분하여 입력한다. 열은 쉼표 없이 스페이스로 구분할 수도 있다. 행이나 열의 개수가 맞지 않으면 에러가 난다.octave-3.4.0:67> A = [1, 2, 3; 4, 5, 6] A = 1 2 3 4 5 6일정한 간격의 숫자를 자동으로 생성할 때는
start:end
또는 start:step:end
형식의 문법을 이용할 수 있다.octave-3.4.0:101> 1:10 ans = 1 2 3 4 5 6 7 8 9 10 octave-3.4.0:102> 1:2:10 ans = 1 3 5 7 90으로 채워진 행렬은
zeros(N, M)
, 1로 채워진 행렬은 ones(N, M)
으로 생성할 수 있다.octave-3.4.0:152> ones(4,1) ans = 1 1 1 1항등 행렬(identity matrix)는
eye(X)
로 생성할 수 있고 대각원소 x
를 가지는 대각행렬을 diag(x)
로 생성할 수 있다.
octave-3.4.0:156> eye(3)
ans =
Diagonal Matrix
1 0 0
0 1 0
0 0 1
octave-3.4.0:157> diag([1 2 3])
ans =
Diagonal Matrix
1 0 0
0 2 0
0 0 3
인덱싱/슬라이싱
행렬A
에 대해 A(i,j)
로 i행, j열의 원소를 가리킬 수 있다.octave-3.4.0:92> A A = 1 2 3 4 5 6 octave-3.4.0:90> A(2, 2) ans = 5 octave-3.4.0:91> A(1, 2) ans = 2행렬 내의 일부 범위를 지정할 수도 있다.
octave-3.4.0:93> A(1:2, 1:2) ans = 1 2 4 5
합치기: 행/열 묶기
행 벡터x
, y
를 묶어 행렬을 만들 수 있다.octave-3.4.0:116> x = 1:10 x = 1 2 3 4 5 6 7 8 9 10 octave-3.4.0:117> y = 11:20 y = 11 12 13 14 15 16 17 18 19 20 octave-3.4.0:118> [x; y] ans = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
열 벡터를 묶어 행렬을 만들 수도 있다.
octave-3.4.0:123> x = 1:3; y = 4:6; z = 7:9 z = 7 8 9 octave-3.4.0:126> [x' y' z'] ans = 1 4 7 2 5 8 3 6 9
두 행렬을 합칠 수도 있다.
octave-3.4.0:130> A A = 1 4 7 2 5 8 3 6 9 octave-3.4.0:131> B B = 11 12 13 14 15 16 octave-3.4.0:132> [A B] ans = 1 4 7 11 12 2 5 8 13 14 3 6 9 15 16
행렬의 크기
행렬 A에 대해ndims(A)
명령을 내리면 2가 나온다. 2차원이기 때문이다. 컬럼의 수는 columns(A)
, 행의 수는 rows(A)
, 원소의 개수는 numel(A)
로 알 수 있다. size(A)
는 행과 열의 개수를 동시에 알려주고 length(A)
는 행과 열 중 긴 것의 길이를 알려준다.기본 연산
전치
실수 행렬 A의 전치(transpose)는A'
또는 A.'
로 가능하다. octave-3.4.0:123> A = [1, 2, 3; 4, 5, 6] A = 1 2 3 4 5 6 octave-3.4.0:124> A' ans = 1 4 2 5 3 6참고로, 복소수 행렬 B의 경우에는
B.'
는 전치, B'
는 전치 켤레 행렬을 뜻한다.행렬의 곱
두 행렬 A, B의 곱은A*B
로 계산할 수 있다.octave-3.4.0:125> A = [1, 2, 3; 4, 5, 6] A = 1 2 3 4 5 6 octave-3.4.0:126> B = [1, 1; 1, -1; -1, 1] B = 1 1 1 -1 -1 1 octave-3.4.0:127> A * B ans = 0 2 3 5
행렬의 곱이 아니라 원소끼리의 곱(element by element multiplication)을 계산하려고 할 때는,
A .* B
와 같은 연산자를 이용한다.octave-3.4.0:128> A = [1, 2, 3; 4, 5, 6] A = 1 2 3 4 5 6 octave-3.4.0:129> B = [1, 0, 1; 0, 1, 0] B = 1 0 1 0 1 0 octave-3.4.0:130> A .* B ans = 1 0 3 0 5 0
트레이스
정방행렬 A의 대각원소의 합을 행렬 A의 트레이스(trace)라고 한다.trace(A)
로 구할 수 있다.octave-3.4.0:9> A = [1, 0, -1; 0, 2, 2; -1, 4, 5] A = 1 0 -1 0 2 2 -1 4 5 octave-3.4.0:10> trace(A) ans = 8
행렬식
정방행렬 A의 행렬식(determinant)는det(A)
또는 inverse(A)
로 구할 수 있다.octave-3.4.0:16> A = [1, 2; 3, 4] A = 1 2 3 4 octave-3.4.0:17> det(A) ans = -2
역행렬
정방행렬 A의 역행렬은inv(A)
로 구할 수 있다. octave-3.4.0:16> A = [1, 2; 3, 4] A = 1 2 3 4 octave-3.4.0:18> inv(A) ans = -2.00000 1.00000 1.50000 -0.50000
고유치와 고유벡터
정방행렬 A의 고유치(eigen value)와 고유벡터(eigenvalue)는eig(A)
로 구할 수 있다.octave-3.4.0:30> A = [1, 4; 9, 1] A = 1 4 9 1 octave-3.4.0:31> eig(A) ans = 7 -5 octave-3.4.0:32> [v, lambda] = eig(A) v = 0.55470 -0.55470 0.83205 0.83205 lambda = Diagonal Matrix 7 0 0 -5
vec
행렬 $A$를 열벡터로 바꾸는 연산은vec(A)
로 할 수 있다.octave-3.4.0:149> A A = 1 2 3 4 5 7 octave-3.4.0:150> vec(A) ans = 1 4 2 5 3 7
행렬의 유형
주어진 행렬 A의 유형을matrix_type(A)
를 이용하여 알 수 있다. unknown, full, positive definite, diagonal, permuted diagonal, upper, lower, banded, banded positive definite, singular로 구별해 준다.octave-3.4.0:33> A = [2, 2, 1; 2, 5, 1; 1, 1, 2] A = 2 2 1 2 5 1 1 1 2 octave-3.4.0:34> matrix_type(A) ans = Positive Definite
행렬의 분해
비정칙치 분해
행렬 $A$는\[
A = U S V'
\]
로 분해될 수 있다. 이때 $U$, $V$는 직교행렬(orthogonal)이고 $S$는 대각행렬이다. $S$의 대각원소는 $A$의 비정칙치(singular values)라고 하며 이것은 $A'A$의 고유치의 양의 제곱근과 같다.
A = 2 2 1 2 5 1 1 1 2 octave-3.4.0:180> [U, S, V] = svd(A) U = -0.44910 0.29313 -0.84403 -0.84403 -0.44910 0.29313 -0.29313 0.84403 0.44910 S = Diagonal Matrix 6.41147 0 0 0 1.81521 0 0 0 0.77332 V = -0.44910 0.29313 -0.84403 -0.84403 -0.44910 0.29313 -0.29313 0.84403 0.44910
결과를 살펴보자. 우선, $U$와 $V$는 직교행렬이다.
octave-3.4.0:183> U' * U ans = 1.0000e+00 -1.9429e-16 1.6653e-16 -1.9429e-16 1.0000e+00 2.2204e-16 1.6653e-16 2.2204e-16 1.0000e+00 octave-3.4.0:184> V' * V ans = 1.00000 -0.00000 0.00000 -0.00000 1.00000 -0.00000 0.00000 -0.00000 1.00000다음으로 $A=USV'$임을 확인해 보자.
octave-3.4.0:187> U * S * V' ans = 2.00000 2.00000 1.00000 2.00000 5.00000 1.00000 1.00000 1.00000 2.00000다음으로 $A'A$의 고유치와 $S$의 대각원소의 제곱이 일치하는지 확인해 보자.
octave-3.4.0:193> eig(A' * A) ans = 0.59802 3.29498 41.10700 octave-3.4.0:192> diag(S) .** 2 ans = 41.10700 3.29498 0.59802
촐레스키 분해
양정치 행렬(definite positive matrix) $A$는 항상\[
A = R' R
\]
로 표현할 수 있으며 이때 $R$은 대각원소가 양수인 상삼각행렬(upper triangular matrix)이다. 이것을
촐레스키 분해(Cholesky decomposition)라고 하며
chol(A)
로 계산할 수 있다.octave-3.4.0:43> A A = 2 2 1 2 5 1 1 1 2 octave-3.4.0:46> matrix_type(A) ans = Positive Definite octave-3.4.0:44> R = chol(A) R = 1.41421 1.41421 0.70711 0.00000 1.73205 0.00000 0.00000 0.00000 1.22474
결과를 확인해 보자. 위에서 보듯이 R은 대각원소가 모두 양수이고 상삼각행렬이다. $R'R$을 계산해 보면 $A$를 얻을 수 있다.
octave-3.4.0:120> R' * R ans = 2.0000 2.0000 1.0000 2.0000 5.0000 1.0000 1.0000 1.0000 2.0000
QR 분해
임의의 실수 정방행렬 $A$의 경우에 항상\[
A = QR
\]
로 나타낼 수 있다. 이때 $Q$는 직교행렬(orthogonal matrix)이다. 즉, $Q'Q=I$이다. $R$은 상삼각행렬(upper triangular matrix)이다. 이것을
QR decomposition이라고 하며
qr(A)
로 계산할 수 있다.octave-3.4.0:131> A = [2, 2, 1; 2, 5, 1; 1, 1, 2] A = 2 2 1 2 5 1 1 1 2 octave-3.4.0:132> [Q, R] = qr(A) Q = 0.66667 -0.59628 -0.44721 0.66667 0.74536 0.00000 0.33333 -0.29814 0.89443 R = 3.00000 5.00000 2.00000 0.00000 2.23607 -0.44721 0.00000 0.00000 1.34164
결과를 확인해 보자.
R
은 위 결과에서 보듯이 상삼각행렬이고 다음에서 Q
가 직교행렬인 것을 확인할 수 있다. 그리고 $QR =A$를 만족한다.octave-3.4.0:134> Q' * Q ans = 1.00000 -0.00000 0.00000 -0.00000 1.00000 -0.00000 0.00000 -0.00000 1.00000 octave-3.4.0:140> Q * R ans = 2.00000 2.00000 1.00000 2.00000 5.00000 1.00000 1.00000 1.00000 2.00000
QR 분해는 정방행렬이 아닌 경우에도 가능하다.
댓글 없음:
댓글 쓰기