기본 콘텐츠로 건너뛰기

라벨이 matrix인 게시물 표시

[matplotlib]quiver()함수

[Linear Algebra] 파이썬으로 행렬 객체 만들기

행렬 객체 만들기 python에서 행렬 객체를 생성하기 위해서는 numpy, pandas 모듈을 사용합니다. numpy 모듈에서 array() 함수는 다른 행렬 객체를 생성하는 대부분 함수의 기반이 되는 함수입니다. import numpy as np from sympy import * x=np.array([1,2,3]); x array([1, 2, 3]) 위 객체 x는 3개의 요소로 구성된 벡터입니다. 즉 하나의 차원을 가집니다( 차원(dimension) 참조). 객체의 차원과 그에 따른 형태는 각각 .ndim, .shape 속성을 확인할 수 있습니다. x.ndim, x.shape (1, (3,)) 위 결과에 의하면 객체 x는 1차원으로 3개의 요소들로 구성됨을 나타냅니다. 같은 요소들로 구성된 다음 객체 x1은 행렬입니다. x1=np.array([[1],[2],[3]]); x1 array([[1], [2], [3]]) print(x1) [[1] [2] [3]] 파이썬의 함수 print() 는 결과의 자료형 등의 속성을 배제한 상태로 출력합니다. x1.ndim, x1.shape (2, (3, 1)) 객체 x1는 2차원 즉, 2개의 축으로 행과 열로 구성됩니다. 그러나 행 또는 열 중 하나가 1일 경우 실제적으로 1차원인 벡터입니다. 파이썬에서 벡터와 행렬을 구분한다는 것은 매우 중요합니다. 벡터, 행렬 연산의 경우 기본적으로 차원을 조정해야 하기 때문입니다. 예를 들어 행과 열이 바꾸는 것을 전치(transpose)라고 하며 객체.T 로 실행됩니다. 그러나 벡터일 경우는 실행되지 않습니다. x.T array([1, 2, 3]) x1.T array([1, 2, 3]) 벡터인 객체 x를 행렬로 변경하기 위해 numpy객체.reshape(행의 수, 열의 수) 메소드를 사용할 수 있습니다. 이 함수에서 행의수 또는 열의수에 -1을 지정하면 다른쪽에 지정된 수에 의해 자동으로 변환됩니다. 예를 ...

[Linear Algebra] 행렬식(Determinant)

행렬식(Determinant) 관련된 내용 역행렬(Inverse matrix) 기약행 사다리꼴 형태 (Reduced row echelon form, rref) 역행렬이 존재한다는 것은 선형 시스템에서 유일한 해집합이 존재한다는 것을 의미합니다. 즉, 표준 행렬에 대한 역행렬의 존재는 유일한 해집합을 가질 수 있는 필수 조건입니다. 반대로 표준 행렬의 역행렬이 존재하지 않는다면 다양한 해집합들이 존재하거나 해가 존재하지 않는 상태입니다. 역행렬이 존재하지 않은 행렬을 특이 행렬(singular matrix) 이라고 합니다. 행렬은 그 행렬로부터 계산할 수 있는 행렬식(determinant) 이 0인 경우 역행렬이 존재하지 않는 특성을 가지고 있습니다. 즉, 행렬식은 어떤 행렬에 대해 특이 행렬 여부를 결정할 수 있는 근거가 됩니다. 행렬식은 det(행렬) 또는 |행렬| 과 같이 나타냅니다. 2×2 행렬의 행렬식은 식 1과 같이 쉽게 계산이 됩니다. $$A=\begin{bmatrix}a& b\\c & d \end{bmatrix} \Rightarrow \text{det(A)}=\vert{A}\vert =\vert{ad -bc}\vert$$ (식 1) 2×2 이상의 형태를 가진 정방 행렬의 역행렬은 소행렬식과 여인수 방법 으로 계산할 수 있습니다. 이 방법은 n×n의 행렬로부터 2×2 차원의 부분 행렬을 추출하고 식 1의 행렬식 계산을 반복하여 전체 행렬의 행렬식을 계산하는 것으로 n의 값이 커질수록 계산은 매우 번거롭습니다. 대신, 모든 정방행렬의 행렬식은 numpy.linalg.det() 함수를 사용하여 계산할 수 있습니다. A=np.array([[1,1,2], [2,4,-3], [3,6,-5]]) print(A) [[ 1 1 2] [ 2 4 -3] [ 3 6 -5]] AInv=la.inv(A) print(AInv) [[ 2. -17. 11.] [ -1. 11. -7.] [ 0. 3....

[Linear Algebra] 기약행 사다리꼴 형태 (Reduced row echelon form, rref)

기약행 사다리꼴 형태 (Reduced row echelon form, rref) 관련된 내용 역행렬(Inverse matrix) 행렬식(Determinant) 행사다리 꼴(row echelon form, ref) 은 식 1과 같이 상삼각행렬 형태를 보입니다. 각 행에서 0이외의 첫번 째 요소가 1인 경우를 기약행사다리꼴(reduced row echelon form, rref) 이라고 합니다. $$\begin{bmatrix}0& a& b & c & \cdots\\0& 0& d & e & \cdots\\0& 0& 0 & f & \cdots\\ \vdots& \vdots& \vdots& \vdots& \ddots\end{bmatrix}$$ (식 1) 식 2는 연립방정식을 행렬 방정식으로 나타낸 것입니다. $$\begin{aligned}x+y& =2\\ 2x+4y &=-3\\ 3x+6y & =5 \end{aligned}\Rightarrow \begin{bmatrix} 1& 1\\2& 4\\3& 6\end{bmatrix} \begin{bmatrix} x\\ y\end{bmatrix} = \begin{bmatrix}2\\ -3\\5\end{bmatrix}$$ (식 2) 식 2에서는 나타낸 것과 같이 표준행렬은 정방행렬이 아니므로 역행렬에 의한 해를 결정할 수 없습니다. 이 경우 식 3에서 나타낸 것과 같이 표준행렬과 상수행렬을 결합한 형태에서 각 행간의 연산에 의해 표준행렬을 항등행렬의 형태로 전환할 수 있다면 해를 결정 할 수 있습니다. \begin{align}\begin{bmatrix} 1& 1& :2 \\2& 4& :-3\\3& 6 & :5\end{bmatrix} &\Rightarrow \begin{bmatrix} ...

[Linear Algebra] 대칭행렬(Symmetric matrix)

대칭행렬(Symmetric matrix) 식 1와 같이 행렬의 대각 요소들을 기준으로 양쪽의 요소가 동일한 정방 행렬을 의미합니다. \begin{bmatrix}{\color{red}a_{11}} & b & c\\ b & {\color{red}a_{22}} & d\\c & d & {\color{red}a_{33}}\end{bmatrix} (식 1) 대칭 행렬은 다음 코드와 같이 삼각 행렬과 그 전치행렬과의 합으로 생성할 수 있습니다. np.random.seed(4) x=np.random.randint(-10, 10, (3,3)) y=np.random.randint(-10, 10, (3,3)) A=np.triu(x)+np.triu(x).T print(A) [[ 8 -5 -9] [-5 -4 8] [-9 8 6]] B=np.tril(y)+np.tril(y).T print(B) [[ -4 2 -7] [ 2 -8 -10] [ -7 -10 -2]] 대칭행렬의 특성 대칭 행렬 A, B과 스칼라 k 사이에 다음의 관계가 성립합니다. A = A T , 즉, 대칭 행렬과 그 행렬의 전치 행렬은 같습니다. 두 대칭행렬 A ± B는 대칭 행렬입니다. 대칭행렬의 스칼라 곱 역시 대칭 행렬입니다. (AB) T = B T A T print(A==A.T) [[ True True True] [ True True True] [ True True True]] print(A+B) [[ 4 -3 -16] [ -3 -12 -2] [-16 -2 4]] print(3*A) [[ 24 -15 -27] [-15 -12 24] [-27 24 18]] 일반적으로 대칭 행렬인 A와 B의 곱은 대칭 행렬이 되지 않습니다. 그러나 두 대칭 행렬의 곱의 교환 법칙이 성립하는 경우 즉, AB = BA인 경우 다음 식이 성립하며 그 곱 역시 대칭행렬이 됩니다(...

[Linear Algebra] 삼각 행렬(Triangular matrix)

삼각 행렬(Triangular matrix) 식 1과 같이 삼각 행렬은 대각요소를 기준으로 그 요소들을 포함하여 윗 부분 또는 아래 부분의 요소들이 0이 아닌 값으로 구성된 행렬입니다. 0이 아닌 값들이 아랫 부분을 구성하는 경우는 하삼각 행렬(lower triangular matrix), 반대의 경우는 상삼각 행렬(upper triangular matrix)이 됩니다. \begin{align}\text{하삼각행렬}:\; \begin{bmatrix}{\color{red}a_{11}} & 0 & 0\\ a_{21} & {\color{red}a_{22}} & 0\\a_{31} & a_{32} & {\color{red}a_{33}}\end{bmatrix}\\ \text{상삼각행렬}:\; \begin{bmatrix}{\color{red}a_{11}} & a_{12} & a_{13}\\0& {\color{red}a_{22}} & a_{23}\\0 & 0 & {\color{red}a_{33}}\end{bmatrix} \end{align} (식 1) 하삼각행렬(lower triangular matrix) 대각 요소들을 기준으로 그 위 부분이 모두 0인 행렬 np.tril(x, k=0) 함수 사용. 이 함수의 인수 x는 배열 객체이며 k는 행렬의 대각요소들의 위치를 지정합니다. k의 기본값 0은 인덱스[0,0]을 기준으로하는 대각요소들을 의미합니다. 상삼각 행렬(upper triangular matrix) 대각 요소들을 기준으로 그 아래 부분이 모두 0인 행렬. np.triu(x, k=0) 함수 사용. np.random.seed(2) x=np.random.randint(1, 10, 9).reshape((3,3)) print(x) [[9 9 7] [3 9 8] [3 2 6]] print(np.triu(x)) [[9 9 7] [0 9 8] [0...

[Linear Algebra] 항등 행렬 (Identity Matrix) 과 대각행렬(Diagonal matix)

항등 행렬 (Identity Matrix) 과 대각행렬(Diagonal matix) 항등 행렬 (Identity Matrix) 대각행렬(Diagonal matix) 항등 행렬 (Identity Matrix) 항등 행렬은 정방 행렬 중 대각 원소가 모두 1이고 그 외 모든 원소들은 0인 행렬이며 I n 으로 나타냅니다. n은 행 또는 열의 수를 나타냅니다. 항등 행렬과의 행렬 곱은 그 행렬 자신이 됩니다(식 1). AI = A (식 1) I: 항등행렬 np.eye(n) 함수로 n×n 차원의 항등행렬을 생성할 수 있습니다. np.random.seed(1) A=np.random.randint(1,10, (3,3)) print(A) [[6 9 6] [1 1 2] [8 7 3]] I=np.eye(3) print(I) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] print(A@I) [[6. 9. 6.] [1. 1. 2.] [8. 7. 3.]] 대각행렬(Diagonal matix) 식 2와 같이 정방 행렬의 주 대각 요소들을 제외한 다른 요소들이 0인 행렬을 대각 행렬이라 합니다. 주 대각 요소를 포함하여 모든 요소가 0인 영행렬, 그리고 항등 행렬은 대표적인 대각 행렬입니다. $$\begin{bmatrix}{\color{red}a_{11}} & 0 & 0\\ 0 & {\color{red}a_{22}} & 0\\0 & 0 & {\color{red}a_{33}}\end{bmatrix}$$ (식 2) 대각 행렬은 np.diag() 함수를 사용하여 생성할 수 있습니다. print(np.diag([1,2,3])) [[1 0 0] [0 2 0] [0 0 3]]

[Linear Algebra] 정방 행렬 (Square matrix)과 트레이스(Trace)

정방 행렬 (Square matrix)과 트레이스(Trace) 내용 정방 행렬 (Square matrix) 트레이스(Trace) 정방 행렬 (Square matrix) 식 1의 행렬 A와 같이 열과 행의 갯수가 동일한 행렬을 정방 행렬 이라 하고 이 정방 행렬의 전치 행렬($A^T$)은 식 1과 같이 주 대각(main diagonal) 외 요소들의 대칭적 교환으로 이루어집니다. $$A=\begin{bmatrix}{\color{red}a_{11}} & a_{12} & a_{13}\\ a_{21} & {\color{red}a_{22}} & a_{23}\\a_{31} & a_{32} & {\color{red}a_{33}}\end{bmatrix}\;\Rightarrow\; A^T= \begin{bmatrix}{\color{red}a_{11}} & a_{21} & a_{31}\\ a_{12} & {\color{red}a_{22}} & a_{32}\\a_{13} & a_{23} & {\color{red}a_{33}}\end{bmatrix}$$ (식 1) 위 식의 붉은 색이 주 대각 요소들입니다. A=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(A) [[1 2 3] [4 5 6] [7 8 9]] print(A.T) [[1 4 7] [2 5 8] [3 6 9]] 트레이스(Trace) 정방 행렬에서 대각 요소들의 합을 그 행렬의 트레이스라고 하며 tr(A) 라고 나타냅니다(식 2). $$A=\begin{bmatrix}{\color{red}a_{11}} & a_{12} & a_{13}\\ a_{21} & {\color{red}a_{22}} & a_{23}\\a_{31} & a_{32} & {\color{red}a_{33}}\end{bmatrix}\;\Rightarro...

[Linear Algebra] 전치행렬(Transposed matrix)

전치 행렬(Transposed matrix) m×n 형태의 행렬 A의 행과 열을 교환한 행렬을 A의 전치 행렬이라 하며 A T 로 나타냅니다. 그 전치 행렬의 형태는 n×m 입니다. 행렬 A와 전치 행렬 사이에 식 1의 관계가 성립합니다. A i,j = A T j,i (식 1) 전치 행렬은 numpy array 객체의 속성 .T 또는 함수 transpose() 를 사용하여 생성할 수 있습니다. A=np.array([[2, 4, 9], [3, 6, 7]]) print(A) [[2 4 9] [3 6 7]] print(np.transpose(A)) [[2 3] [4 6] [9 7]] print(A.T) [[2 3] [4 6] [9 7]] 식 2와 같이 전치 행렬을 다시 전치시키면 원시행렬(original matrix)이 됩니다. (A T ) T = A (식 2) print(A.T.T==A) [[ True True True] [ True True True]] 두 행렬의 행렬곱의 전치 행렬은 식 3과 같이 계산됩니다. (A·B) T = B T ·A T (식 3) 다음 코드에서 임의의 행렬 객체를 생성하기 위해 numpy.random 모듈의 randint() 함수를 사용하였습니다. 생성된 랜덤수의 재현성을 위해 numpy.random.seed() 함수를 사용하였습니다. np.random.seed(0) B=np.random.randint(-10, 10, (3,3)) print(B) [[ 2 5 -10] [ -7 -7 -3] [ -1 9 8]] # A·B AB=A@B # BT·AT BtAt=np.dot(B.T, A.T) print(np.equal(AB.T, BtAt)) [[ True True] [ True True] [ True True]]