SturdyCobble's Study Note

[MATLAB] 02. MATLAB의 행렬과 복소수 본문

프로그래밍/MATLAB

[MATLAB] 02. MATLAB의 행렬과 복소수

StudyingCobble 2019. 8. 3. 08:50

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


※ 이 글은 최소한 Python과 같은 프로그래밍 언어를 한 번 이상 접한 사람을 독자로 가정하여 작성되었습니다. 사용버전은 R2019a기준입니다. 또한 기본적인 프로그램 조작보다는 프로그래밍에 초점을 맞추어 작성하였습니다.


MATLAB의 특징은 '행렬'을 중심으로 작동된다는 점입니다. 그렇기에 수학, 공학적인 문제를 해결할 때 더욱 유용하게 이용할 수 있습니다. (일반적으로 MATLAB에서는 '행렬'과 '배열'이 비슷한 의미로서 사용됩니다.)

 

 행렬은 다음과 같이 정의됩니다.

mat1 = [1 2 3 ; 4 5 6 ; 7 8 9]

여기서 공백(또는 쉼표도 가능합니다)는 열을 구분하고, 세미콜론은 행을 구분합니다. 위 행렬은 다음과 같습니다

$$ \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} $$

 

행렬은 위와 같은 방법 이외에도 다음과 같은 함수를 통해 생성할 수 있습니다.

A = zeros(2,2)
B = ones(2,2)
C = rand(2,3)
D = eye(3)
E = diag([1 2 3])

각 변수에는 다음과 같은 행렬이 저장됩니다.

$$ A = \begin{bmatrix} 0 & 0\\ 0 & 0 \end{bmatrix} $$

$$ B = \begin{bmatrix} 1 & 1\\ 1 & 1 \end{bmatrix} $$

$$ C = \begin{bmatrix} 0.9575 & 0.1576 & 0.9572\\ 0.9649 & 0.9706 & 0.4854 \end{bmatrix} $$

$$ D= \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} $$

$$ E = \begin{bmatrix} 1 & 0 & 0\\ 0 & 2 & 0\\ 0 & 0 & 3 \end{bmatrix} $$

 

이 때 rand함수는 0~1의 무작위 값을 가지는 행렬을 반환합니다. rand(2,3)이므로 2×3 행렬이 생성된 것을 보실 수 있습니다. 만약 정규 분포가 된 무작위 함수를 이용한다면 randn()함수를 이용합니다.

 

그리고 diag함수는 아래와 같이 사용하여 주 대각선이 아닌 다른 대각선에 (위쪽은 +, 아래쪽은 -) 요소를 배치하는 것도 가능하며, 반대로 행렬의 대각 성분을 열벡터로 가져오는데 사용될 수 있습니다.

diag([1 2 3 4],1)
diag([1 2 3; 4 5 6; 7 8 9])
diag([1 2 3; 4 5 6; 7 8 9],1)
--------출력----------------
ans =

     0     1     0     0     0
     0     0     2     0     0
     0     0     0     3     0
     0     0     0     0     4
     0     0     0     0     0


ans =

     1
     5
     9


ans =

     2
     6

 

 

 

참고로 위에 주어진 함수에 인자를 한 개만 전달하는 경우(ex : rand(3)), 해당 인자를 행과 열로 하는 정사각행렬을 생성합니다.

 

그외 사칙 연산들도 존재합니다. 일단 덧셈과 뺄셈부터 알아보겠습니다.

A= [1 2; 3 4]
B= [1 1; 2 3]
A+B
A+2
A-2
A-B

 이 때, 행렬과 스칼라의 덧셈, 뺄셈은 각 요소마다 스칼라를 더하고 빼며, 행렬간 덧셈, 뺄셈은 우리가 아는 행렬간 덧셈, 뺄셈입니다. (물론 스칼라의 사칙 연산도 존재합니다.)

 

이와 같이 일반적인 함수는 행렬의 각 요소마다 연산을 진행합니다. 예를 들자면 sin함수를 각 요소에 취하기 위해서는 다음과 같은 코드면 충분합니다.

 

A = [1 1;2 2]
sin(A)

$$ \begin{bmatrix} \sin(1) & \sin(1)\\ \sin(2) & \sin(2) \end{bmatrix} $$

 

 이 때 주의할 점은 sin이 라디안을 단위로 한다는 점으로, 도(Degree)를 단위로 하려면 삼각함수에 d를 붙인, 예를 들어 sind와 같은 함수를 이용하면 됩니다.

 

곱셈과 나눗셈은 일반적은 행렬간 연산(행과 열의 내적들로 계산되는)으로 사용할 수 있으며 연산자에 점(.)을 붙여서 요소별(행과 열이 같은 요소끼리 곱하여 계산하는, 일반적인 배열처럼 계산함) 곱셈과 나눗셈도 가능합니다. (행렬간 나눗셈은 역행렬을 곱하는 것으로 정의됩니다.) 행렬과 스칼라의 곱셈과 나눗셈은 우리가 아는 행렬과 스칼라의 곱셈과 나눗셈입니다.

 

A= [1 2; 3 4]
B= [1 1; 2 3]
M1 = A*B
M2 = A.*2
M3 = A/B
M4 = A./B

위의 네 식은 다음과 같이 계산됩니다.

$$ M1 = AB $$

$$ M2 = \begin{bmatrix} 1×1 & 2×1\\ 3×2 & 4×3 \end{bmatrix} $$

$$ M3 = AB^{-1} $$

$$ M4 = \begin{bmatrix} 1/1 & 2/1\\ 3/2 & 4/3 \end{bmatrix} $$

 

당연한 이야기이겠지만, 행렬간 곱셈은 앞 행렬의 열과 뒷 행렬이 행이 같을 때, 행렬간 나눗셈은 거기에 더해서 뒷 행렬이 역행렬을 가질 때 정의되며, 요소별 곱셈, 나눗셈은 앞 뒤 행렬의 같은 크기일 때만 가능하겠죠?

 

그 외 다음과 같은 연산들도 존재합니다.

A\B
A^3
A.\B
A.^3

위의 두 개는 각각 왼쪽 나눗셈과 거듭제곱이고, 그 아래 두 개는 요소별 연산입니다.

 

 

또한, 전치행렬과 역행렬을 구하거나, 행렬간 결합을 하는 것도 가능합니다.

A = [1 2;3 4];
B = [5 6;7 8];
Ainv = inv(A)
Aconj = A'
Atrans = A.'
Aconh1 = [A,B]
Aconh2 = [A B]
Aconv = [A;B]

위 식들은 다음과 같이 계산됩니다.

 

$$ \rm{Ainv} = A^{-1} $$

$$ \rm{Aconj} = A^{*} = \bar{A^{T}}$$ (켤레 복소수 전치)

$$ \rm{Atrans} = A^{T} $$ (비켤레 복소수 전치)

$$ \rm{Aconh1} = \rm{Aconh2} = [A  \; B] $$

$$ \rm{Aconh} = \begin{bmatrix} A \\ \hline B \end{bmatrix} $$

(분수가 아니라 수직으로 결합한 행렬을 나타냅니다)

 

물론 결합을 하는 경우 행 또는 열이 맞아야 그 방향으로 결합을 할 수 있겠죠?

 

그리고 행렬 내 열벡터의 모든 요소 합을 구하는 sum함수도 존재합니다.(일부만 더하려면 다음 글인 인덱싱을 참고해주세요.) 그리고 sort함수로 각 행벡터를 정렬할 수 있습니다.

A = [4 3; 2 1]
sum(A)
sort(A)
---------출력---------
ans =

     4     3
     2     1
     

ans =

     6     4


ans =

     2     1
     4     3

 

 

MATLAB에서는 많은 것을 행렬로 계산하기에 아래와 같은 일도 가능합니다.

A = rand(1,5)
[valMax loc] = max(A)

이때, max(A)는 A행렬의 최대값과 그 위치를 배열처럼 반환하기에 위와 같은 표현으로 각 변수에 해당 값을 담을 수 있습니다.

 

 

한편, MATLAB이 공학적 문제 상황에서 유용하게 쓰이기에, 복소수 이야기를 하지 않고 넘어갈 수 없는데요, MATLAB에서는 i또는 j를 가지고 복소수를 표현하며, 일반적인 출력은 i를 사용합니다. 또한 함수를 통해 허수부와 실수부를 분리할 수도 있고, 반대로 허수부와 실수부를 통해 복소수를 생성할 수 있습니다.

c1 = 3 + 6i;
real(c1)
imag(c1)
A = rand(2)*10;
B = rand(2)*10;
c2 = complex(A,B)

위 스크립트의 실행 결과는 다음과 같을 것입니다.

ans =

     3


ans =

     6


c2 =

   2.5510 + 9.5929i   6.9908 + 1.3862i
   5.0596 + 5.4722i   8.9090 + 1.4929i

 

또한, 위상각을 angle()함수로 구할 수 있습니다.

angle(1+i) % 0.7854 = pi/4
-----출력-------
ans =

    0.7854

 

sort함수 사용시 복소수 행렬은 일차로 크기, 이차로 위상각을 기준으로 정렬하게 됩니다.

 

그 외 대표적인 상수들은 다음과 같습니다. (https://kr.mathworks.com/help/matlab/learn_matlab/expressions.html 참고)

상수

설명

pi

원주율

eps

부동소수점 상대 정밀도, $$\epsilon = 2^{-52}$$

realmin

최소 부동소수점 숫자, $$2^{-1022}$$

realmax

최대 부동소수점 숫자, $$(2\epsilon)2^{1023}$$

Inf

무한대

NaN

숫자가 아님(Not-a-Number)

 

 

Comments