TearDitch
[너Do 나Do MATLAB]#3 수치연산(Numerical Manipulation)과 스칼라, 벡터, 행렬의 입력 본문
[너Do 나Do MATLAB]#3 수치연산(Numerical Manipulation)과 스칼라, 벡터, 행렬의 입력
TearDitch 2018. 1. 14. 20:01MATLAB(매트랩)에서 가장 많이 사용하게 될 숫자형 데이터(Numerical data)의 기본적인 수치연산에 대해서 알아보겠습니다.
지난 시간에 살펴본 데이터 형식[#2 데이터 형식(Data Type)]에서 숫자형 데이터(Numerical data)는 주로 Matrix 형태의 다차원 array로 저장된다고 이야기 했습니다. 숫자형 데이터의 수치연산은 주로 스칼라(scalar), 벡터(vector), 행렬(matrix)의 연산과 같습니다. MATLAB에서는 스칼라 역시 1x1 행렬과 동일하게 취급하기 때문에 가장 기본은 행렬연산이라고 할 수 있겠습니다.
먼저 초등학교로 돌아가서 단일 값을 갖는 유리수의 연산을 살펴보겠습니다. 덧셈, 뺄샘, 곱셈, 나눗셈 사칙연산이 되겠습니다.
>> % 덧셈
>> a = 1 + 2
a =
3
>> b = 3 - 1
2
>> % 곱셈
>> c = a * b
6
>> d = a / b
d =
1.5000
>> % exponentiation
>> e = a ^ b
9
어렵지 않죠? 저는 위에서 변수를 좌변에 넣어서 표현했지만 변수없이 단순 계산기 처럼 입력해도 결과에는 아무 상관이 없습니다. 그리고 지난 시간에는 언급하지 않았지만 MATLAB의 유리수 표기는 기본이 shot 형태입니다. 이말은 소수점 아래 4자리까지만 보인다는 것입니다. 그래서 만약 우리가 취급하는 변수가 소수점 5번째 이하를 포함하고 있다면 5번째 자리에서 반올림한 형태로 표시됩니다. 이건 표시만 이렇게 보이는 것이지 실제 자리수 값은 모두 갖고 있기 때문에 연산에는 아무 영향을 주지 않습니다. 만약 그 아래 자리까지 보고 싶다면 format long 이라는 명령어를 입력하고 변수를 다시 불러보면 5번째 이하의 자리수도 확인할 수 있습니다.
연산을 하기 전에 먼저 MATLAB에서 1차원 벡터와 다차원 행렬의 입력부터 살펴보겠습니다. 벡터나 행렬이나 [ ] 괄호 기호 안에 숫자를 넣어서 입력하게 됩니다. 행으로 데이터를 나열할 때는 한 칸 띄어쓰기를 하거나 콤마(,)를 붙이면 됩니다. 그리고 데이터를 다른 열로 나열하고자 할 때는 세미콜론(;)을 사용합니다.
vector1 =
1 2 3 4
vector2 =
1 2 3 4
띄어쓰기를 하나 콤마(,)를 사용하나 결과는 같다는걸 알 수 있습니다. 그런데 MATLAB은 독특하게도 위에서 예시로 언급한 것과 같은 연속된 정수로 이루어진 벡터를 콜론(:)을 이용해서 쉽게 표현할 수 있습니다.
vector3 =
1 2 3 4
게다가 위의 예는 1씩 증가하는 벡터이지만 만약 2씩 증가하거나 혹은 -1.5씩 감소하는 벡터도 만들 수 있습니다.
vector4 =
1 3
vector5 =
4.0000 2.5000 1.0000
위의 예에서 보시는 것처럼 콜론 사이의 값으로 증가하며(등차수열) 최대값 혹은 최소값이 제일 끝에 위치한 수(4 또는 1) 를 넘지 않을 때까지 벡터의 각항을 생성하게 됩니다.
이와 비슷하게 행렬의 입력도 예시를 보시면 이해하기 쉽습니다.
matrix1 =
1 2
3 4
matrix2 =
3 4 5 6
5 6 7 8
그리고 벡터와 행렬은 다른 벡터나 행렬을 포함하여 표현할 수 있습니다. 이 때 행렬의 dimension을 고려해야 합니다. 즉 행과 열이 일치해야만 포함시킬 수 있습니다.
matrix3 =
1 2 3 4 5 6
3 4 5 6 7 8
Error using vertcat
Dimensions of matrices being doncatenated are not consistent.
error 메세지와 같이 행과 열의 dimension을 일치시켜야 합니다.
행렬의 입력은 마지막으로 특수한 행렬에 대해서 소개하고 마무리 하겠습니다. 행렬의 연산에 많이 사용하는 단위행렬(Identity matrix)와 모든 성분이 0 또는 1인 행렬 입니다. 그리고 random하게 0~1사이의 숫자를 만들어 주는 행렬도 있습니다.
a =
1 0 0
0 1 0
0 0 1
0 0 0
a =
1 1 1
1 1 1
1 1 1
1 1 1
a =
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
a =
0.8147 0.9134
0.9058 0.6342
0.1270 0;0975
그럼 본격적으로 연산에 대해서 살펴보겠습니다. MATLAB은 행렬연산이 기본이기에 매우 강력하고 편리하게 연산이 가능한데요. 만약 C언어로 프로그래밍 한다면 꽤 긴 code를 위의 사칙연산 수준으로 간단히 해낼 수 있습니다. 먼저 벡터 연산부터 살펴본 후 행렬 연산을 해보도록 하겠습니다.
기본적인 덧셈과 뺄샘은 단일 값을 갖는 유리수 연산과 같습니다. + 와 - 기호를 사용하면 됩니다. 그리고 당연히 dimension이 갖아야 연산이 가능합니다. 이에 대한 예제는 생략하도록 하겠습니다.
다음은 벡터의 전치(Transpose) 입니다. 이것은 행렬에도 동일하게 적용할 수 있는데, 행을 열로 또는 열을 행으로 형태를 바꿔주는 것입니다. 전치는 작은 따옴표(')를 이용해서 표현 할 수 있습니다.
vector3 =
1
2
3
4
다음은 벡터의 곱셈인데요. 벡터의 곱셈은 내적(Inner product)와 외적(Cross product)로 나뉩니다. 내적(Inner product)의 경우 위에서 사용한 전치를 이용할 수 있고 또는 dot 이라는 함수를 사용할 수도 있습니다. 외적은 cross 라는 함수를 사용합니다.
>> c = vector6*vector7'
c =
20
c =
20
d =
-1 2 -1
또한 각 성분을 별도로 연산하는 것도 가능한데요. .^ 를 이용해서 거듭제곱을 표현할 수 있고, .* 의 경우 각 성분 곱을 의미합니다.
e =
1 4 9
f =
2 6 12
이제 벡터와 유사하게 행렬의 연산에 대해서 살펴보겠습니다. 위에서 설명드린 모든 것을 거의 동일하게 행렬에 적용하면 됩니다.
transMatrix1 =
1 3
2 4
>> A = matrix1*matrix2
A =
13 16
29 36
B =
1 4
9 16
>> C = matrix1.*matrix2
3 8
15 24
선형대수학을 상기해보시면 행렬의 경우 행렬식(Determinant)를 구할 필요가 있습니다. 그리고 역행렬(Inverse matrix)를 구하게 됩니다. 또한 행렬의 대표값으로 고유값(Eigenvalue)과 고유벡터(eigenvector)를 구하는데요. 이것은 MATLAB에서 제공하는 det, inv, eig 함수를 이용하여 매우 매우 쉽게 찾을 수 있습니다.
detMatrix1 =
-2
invMatrix1 =
-2.0000 1.0000
1.5000 -0.5000
eigMatrix1 =
-0.3723
5.3723
어떤가요? 선형대수학 정말 쉽죠?^^;; 지금 2x2 행렬을 가지고 다루었지만 이보다 더 큰 행렬도 동일한 방법으로 구하실 수 있습니다.
이번 포스팅을 마무리 하며 마지막으로 행렬의 인덱스를 이용한 원소 접근법을 간단히 보여드리겠습니다. 만약 우리가 m x n 행렬을 다룬다면 m개의 행과 n개의 열로 이루어져 있을 것입니다. 이 행렬의 (i, j) 성분을 부르거나 혹은 특정 행 또는 열만을 우리가 다루고 싶을 때 다음과 같이 사용할 수 있습니다.
g =
3
D =
3 4
E =
1
3
앞으로 우리가 다루게 될 데이터는 대부분이 이런 수치행렬이 될 것입니다. 이런 연산 방법을 익숙하게 다루신다면 원하는 데이터 처리에 매우 용이하겠죠. 꼬옥 숙지해야한답니다. 그럼 오늘은 여기까지...
'MATLAB' 카테고리의 다른 글
[너Do 나Do MATLAB]#5 제어흐름(Control Flow), 조건문(Conditional Statements)/루프 제어문(Loop Control Statements) 사용 (0) | 2018.02.03 |
---|---|
[너Do 나Do MATLAB]#4 논리연산자(Boolean/Relational operator)와 논리연산(Logical operation) (0) | 2018.01.18 |
[너Do 나Do MATLAB]#2 데이터 형식(Data Type) (0) | 2018.01.13 |
[너Do 나Do MATLAB] #1 경로지정 하기 (0) | 2018.01.02 |
[너Do 나Do MATLAB] #0 들어가며 (0) | 2017.12.31 |