여기에서는 행렬-스칼라 그리고 행렬-행렬간의 산술 연산에 대해서 설명을 하겠다. 다음의 예를 보자.


>> G=[1 2 3 4;5 6 7 8]
G =
1 2 3 4
5 6 7 8

>> G-2
-1 0 1 2 3 4 5 6

>> -2+G
-1 0 1 2 3 4 5 6


이 예에서 변수 G는 행렬이고 2는 스칼라이다. 기본적으로 (수학적인) 행렬의 덧셈 뺄셈은 두 행렬의 차수가 같아야 하지만 한쪽이 스칼라이고 다른 한쪽이 행렬이면 행렬의 모든 요소에서 그 스칼라를 더하거나 빼준 행렬을 결과로 내보낸다.


>> 2*G-1 󰎠
1 3 5 7
9 11 13 15


스칼라와 벡터/행렬의 곱은 수학적인 의미 그대로이며 연산 우선순위도 스칼라연산과 같다. 위의 경우 곱을 먼저 행하고 뺄셈을 행하게 된다.


 행렬 간의 덧셈, 뺄셈은 두 연산자의 차수가 같아야 한다. 다음과 같이 행렬 G와 H를 입력해보자.


>> G=[1 2 3 4; 5 6 7 8; 9 10 11 12] 󰎠
G =
1 2 3 4
5 6 7 8
9 10 11 12

>> H=[1 1 1 1;2 2 2 2; 3 3 3 3] 󰎠
H =
1 1 1 1
2 2 2 2
3 3 3 3


그리고 다음과 같이 덧셈, 뺄셈을 수행해 보라.


>> G+H
2 3 4 5
7 8 9 10
12 13 14 15

>> ans-H
1 2 3 4
5 6 7 8
9 10 11 12

>> 2*G-H
1 3 5 7
8 10 12 14
15 17 19 21


 곱셈의 경우 곱셈기호(*)앞의 행렬의 열수와 뒤 행렬의 행수가 같아야 계산이 수행된다. 따라서 위의 두 행렬 G와 H는 곱셈을 할 수 없다. Ht라는 행렬을 다음과 같이 정의하면


>> Ht=h'
Ht =
1 2 3
1 2 3
1 2 3
1 2 3


이제 행렬 G(차원)와 Ht(차원)간의 곱셈은 가능해진다.


>> G*Ht
10 20 30
26 52 78
42 84 126


 다른 연습 예제로서 다음과 같은 행렬 A와 B가 있을 때,

두 행렬의 곱 AB, BA, ATBT, BTAT 를 각각 구해보라.

 MATLAB에서 행렬간의 곱셈은 이와 같은 보통 행렬 간 곱셈뿐만 아니라 행렬 요소 간의 곱셈도 가능하다. 행렬 요소 간 곱셈을 행하는 연산자는 (.*)이고 이 연산자 앞뒤에 오는 피연산자들의 차원은 같아야 한다.


>> G.*H
1 2 3 4
10 12 14 16
27 30 33 36


행렬 간의 나눗셈은 무슨 의미 일까? 예를 들어서


>> A=[1 2;3 4]
A =
1 2
3 4

>> B=[5 6;7 8]
B =
5 6
7 8



와 같이 정의된 정방행렬 A와 B에 대해서 A/B 또는 B\A는 무슨 의미일까? 결과를 확인해 보자.


>> A/B
3.0000 -2.0000
2.0000 -1.0000
>> B\A
5.0000 4.0000
-4.0000 -3.0000


스칼라의 경우를 생각해 보자. 4/3은 4에게 3의 역수를 곱하는 계산 즉, 4x3-1이다. 마찬가지로 3\4은 3의 역수를 4에 곱하는 것(3-1x4)이다. 행렬의 경우도 마찬가지이다. A/B는 행렬 A에 B의 역행렬을 곱하는 것이고, B\A는 B의 역행렬에 A행렬을 곱하는 것이다. 두 결과가 같다고 생각하기 쉽지만  '행렬에서는 교환법칙이 성립하지 않는다'는 것에 유의해야 한다. 위의 결과를 보아도 서로 다르다는 것을 알 수 있다. 즉 A/B와 B\A는 A와 B가 스칼라라면 같은 수이지만 행렬이라면 서로 다른 행렬이 된다.


 MATLAB에서 역행렬을 구하는 함수는 inv()이다. (inverse 의 줄임말을 함수명으로 채용)


>> A*inv(B)
3.0000 -2.0000
2.0000 -1.0000

>> inv(B)*A
5.0000 4.0000
-4.0000 -3.0000


위의 결과와 이전의 그것과 같다는 것을 알 수 있다. 여기서는 정방행렬의 경우만 다루고 있는데 정방행렬이 아닌 행렬의 가역행렬(pseudo-inverse matrix)를 구하는 함수로 pinv()가 있다. 이에 대해서는 다음에 다루도록 한다.


 나눗셈의 경우도 행렬 요소간 나눗셈이 가능하다. 연산자(./)와 (.\)가 바로 그러한 역할을 한다.


>> A./B 󰎠
0.2000 0.3333
0.4286 0.5000

>> B.\A 󰎠
0.2000 0.3333
0.4286 0.5000


요소 간 연산인 경우에는 항상 두피연산자의 차수가 같아야 한다. 위의 결과를 보면 A./B와 B.\A의 계산결과는 같다는 것을 알 수 있다.(왜일까?)


 행렬의 거듭제곱을 구하는 데는 (^)연산자가 사용되며 행렬의 요소 각각의 거듭제곱을 구하는 데는 (.^)연산자가 사용된다.


>> A^2
7 10
15 22

>> A.^2
1 4
9 16

>> A.^-1
1.0000 0.5000
0.3333 0.2500

>> 2.^A
2 4
8 16

>> A.^B
1 64
2187 65536


이 예에서 A^2과 A.^2 그리고 2.^A의 차이를 확실히 구별해야 한다. 곱셈(*)과 나눗셈(/혹은\) 그리고 거듭제곱(^)을 수행하는 연산자 앞에 ‘점(.)이 붙으면 요소간 연산’이라는 사실을 기억해야 한다.



Posted by 살레시오

댓글을 달아 주세요