여기에서는 행렬-스칼라 그리고 행렬-행렬간의 산술 연산에 대해서 설명을 하겠다. 다음의 예를 보자.
>> G=[1 2 3 4;5 6 7 8]G =1 2 3 45 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 79 11 13 15 |
스칼라와 벡터/행렬의 곱은 수학적인 의미 그대로이며 연산 우선순위도 스칼라연산과 같다. 위의 경우 곱을 먼저 행하고 뺄셈을 행하게 된다.
행렬 간의 덧셈, 뺄셈은 두 연산자의 차수가 같아야 한다. 다음과 같이 행렬 G와 H를 입력해보자.
>> G=[1 2 3 4; 5 6 7 8; 9 10 11 12] G =1 2 3 45 6 7 89 10 11 12
>> H=[1 1 1 1;2 2 2 2; 3 3 3 3] H =1 1 1 12 2 2 23 3 3 3 |
그리고 다음과 같이 덧셈, 뺄셈을 수행해 보라.
>> G+H2 3 4 57 8 9 1012 13 14 15
>> ans-H1 2 3 45 6 7 89 10 11 12
>> 2*G-H1 3 5 78 10 12 1415 17 19 21 |
곱셈의 경우 곱셈기호(*)앞의 행렬의 열수와 뒤 행렬의 행수가 같아야 계산이 수행된다. 따라서 위의 두 행렬 G와 H는 곱셈을 할 수 없다. Ht라는 행렬을 다음과 같이 정의하면
>> Ht=h'Ht =1 2 31 2 31 2 31 2 3 |
이제 행렬 G(차원)와 Ht(차원)간의 곱셈은 가능해진다.
>> G*Ht10 20 3026 52 7842 84 126 |
다른 연습 예제로서 다음과 같은 행렬 A와 B가 있을 때,
두 행렬의 곱 AB, BA, ATBT, BTAT 를 각각 구해보라.
MATLAB에서 행렬간의 곱셈은 이와 같은 보통 행렬 간 곱셈뿐만 아니라 행렬 요소 간의 곱셈도 가능하다. 행렬 요소 간 곱셈을 행하는 연산자는 (.*)이고 이 연산자 앞뒤에 오는 피연산자들의 차원은 같아야 한다.
>> G.*H1 2 3 410 12 14 1627 30 33 36 |
행렬 간의 나눗셈은 무슨 의미 일까? 예를 들어서
>> A=[1 2;3 4]A =1 23 4
>> B=[5 6;7 8]B =5 67 8 |
와 같이 정의된 정방행렬 A와 B에 대해서 A/B 또는 B\A는 무슨 의미일까? 결과를 확인해 보자.
>> A/B3.0000 -2.00002.0000 -1.0000>> B\A5.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.00002.0000 -1.0000
>> inv(B)*A5.0000 4.0000-4.0000 -3.0000 |
위의 결과와 이전의 그것과 같다는 것을 알 수 있다. 여기서는 정방행렬의 경우만 다루고 있는데 정방행렬이 아닌 행렬의 가역행렬(pseudo-inverse matrix)를 구하는 함수로 pinv()가 있다. 이에 대해서는 다음에 다루도록 한다.
나눗셈의 경우도 행렬 요소간 나눗셈이 가능하다. 연산자(./)와 (.\)가 바로 그러한 역할을 한다.
>> A./B 0.2000 0.33330.4286 0.5000
>> B.\A 0.2000 0.33330.4286 0.5000 |
요소 간 연산인 경우에는 항상 두피연산자의 차수가 같아야 한다. 위의 결과를 보면 A./B와 B.\A의 계산결과는 같다는 것을 알 수 있다.(왜일까?)
행렬의 거듭제곱을 구하는 데는 (^)연산자가 사용되며 행렬의 요소 각각의 거듭제곱을 구하는 데는 (.^)연산자가 사용된다.
>> A^27 1015 22
>> A.^21 49 16
>> A.^-11.0000 0.50000.3333 0.2500
>> 2.^A2 48 16
>> A.^B1 642187 65536 |
이 예에서 A^2과 A.^2 그리고 2.^A의 차이를 확실히 구별해야 한다. 곱셈(*)과 나눗셈(/혹은\) 그리고 거듭제곱(^)을 수행하는 연산자 앞에 ‘점(.)이 붙으면 요소간 연산’이라는 사실을 기억해야 한다.