Matlab/행렬
자료 정보 | ||
---|---|---|
| ||
| ||
| ||
| ||
2강에서는 Matlab에서 사용하는 행렬에 대한 기본적인 사항을 다룹니다.
Matlab에 행렬을 입력하는 방법은 간단합니다. [] 괄호를 이용하면 행렬을 표시한다는 뜻이고, 콤마(,)는 같은 행의 원소를 나열할 때, 세미콜론(;)은 다음 행으로 넘어갈 때 사용합니다.
>> A=[1, 2, 3, 4; 5, 6, 7, 8] A = 1 2 3 4 5 6 7 8 >> B=[9; 10; 11; 12] B = 9 10 11 12
행렬 안에 꼭 숫자만 들어갈 필요는 없습니다. 변수나 함수가 들어가도 됩니다.
>> a=pi a = 3.1416 >> D=[linspace(1,3,3); 2, 4, 5; 5:1:7; exp(1), pi, a] % linspace는 곧 배웁니다. D =
1.0000 2.0000 3.0000 2.0000 4.0000 5.0000 5.0000 6.0000 7.0000 2.7183 3.1416 3.1416
벡터 데이터 생성
[편집]Matlab에서는... 스칼라: 1×1 사이즈 행렬, 즉 단일값으로 되어있는 데이터를 '스칼라'라고 하고 벡터: 1×n 사이즈 행렬(n≥2), 즉 가로 한 줄로 되어있는 데이터를 '행 벡터'라고 하고 벡터: m×1 사이즈 행렬(m≥2), 즉 세로 한 줄로 되어있는 데이터를 '열 벡터'라고 하고 행렬: m×n 사이즈 행렬(m≥2, n≥2)을 좁은 의미에서 '행렬(Matrix)'이라고 구분하여 부릅니다. 물론 넓은 의미에서 매트랩의 모든 데이터는 행렬로 볼 수 있습니다.
a:step:b 콜론 연산자(:)
[편집]"a부터 step 간격으로 b까지"
1 시작 범위(a)와 간격(step), 마지막 범위(b)를 입력해서 행렬을 생성할 수도 있습니다.
>> C= 0:2:10 C = 0 2 4 6 8 10
2 가운데 입력하는 간격을 생략할 수도 있습니다. 이때 자동으로 1 간격으로 생성됩니다.
>> C1= 0:10 C1 = 0 1 2 3 4 5 6 7 8 9 10
3 대괄호과 섞어서도 사용할 수 있습니다.
>> V = [ 1, 3, 1:2:9 ] V = 1 3 1 3 5 7 9
>> N = [ 1:2:9 ; 2:2:10 ] N = 1 3 5 7 9 2 4 6 8 10
linspace() 함수
[편집]1 linspace(a,b,n)을 이용해 a부터 b까지 범위를 n개 값으로 자동으로 균일한 간격으로 나누어 표시할 수도 있습니다.
>> linspace(0,10,5) ans = 0.00000 2.50000 5.00000 7.50000 10.00000
2 linespace(a, b)만 입력하면 100개 값으로 나누어 표시해 줍니다.
>> linspace(1,10) ans = Columns 1 through 12: 1.0000 1.0909 1.1818 1.2727 1.3636 1.4545 1.5455 1.6364 1.7273 1.8182 1.9091 2.0000 ... (중략) Columns 97 through 100: 9.7273 9.8182 9.9091 10.0000
영행렬, 단위행렬, 1행렬
[편집]영행렬
[편집]1 영행렬인 정방행렬(정사각행렬)은 zeros(n)에 변수를 한 개만 입력하면 됩니다.
>> zeros(3)
ans =
0 0 0
0 0 0
0 0 0
2 i행, j열의 영행렬은 zeros(m, n)를 이용해 생성합니다.
>> zeros(3,4) ans =
0 0 0 0 0 0 0 0 0 0 0 0
3 모든 원소가 a인 m×n 사이즈 행렬은 zeros(m, n)에 덧셈을 이용해 생성합니다.
>> zeros(3, 4) + 3 ans =
3 3 3 3 3 3 3 3 3 3 3 3
단위 행렬
[편집]1 정방의 단위 행렬은 eye(n)을 이용해 생성합니다.
>> eye(5) ans =
Diagonal Matrix
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
2 m×n 크기의 단위행렬은 eye(m, n)을 이용해 생성합니다.
행렬의 축에 있는 원소가 1이고 다른 원소는 0인 행렬이 생성됩니다.
>> eye(3,4)
ans =
Diagonal Matrix
1 0 0 0
0 1 0 0
0 0 1 0
행렬의 축 어느 원소의 행 번호, 열 번호를 각각 i, j라고 하면, i=j일 때 행렬의 축에 놓인다고 말합니다. 즉, 1행 1열부터 2행 2열, 3행 3열 등과 같이 i행 i열 원소가 행렬의 축입니다.
1행렬
[편집]1 1로만 이루어진 정방행렬은 ones(x)로 생성합니다.
>> ones(3)
ans =
1 1 1
1 1 1
1 1 1
2 1로만 이루어진 i행, j열의 행렬은 ones(i, j)로 생성합니다.
>> ones(3,4) ans =
1 1 1 1 1 1 1 1 1 1 1 1
3 모든 원소가 a인 정방행렬을 만들 때, ones(m, n) * a 형태를 사용하기도 합니다.
단, 성능은 zeros(m, n) + a 형태가 일반적으로 더 유리하다고 판단합니다. 컴퓨터는 곱셈보다는 덧셈을 훨씬 빨리 수행할 수 있기 때문입니다.
>> ones(3,4) * 3 ans =
3 3 3 3 3 3 3 3 3 3 3 3
전치
[편집]1 전치(transpose)를 사용하면 i행 j열의 행렬을 j행 i열의 행렬로 뒤집을 수 있습니다. 전치하고자 하는 행렬에 작은 따옴표(')를 붙여주면 됩니다.
>> a=pi a = 3.1416 >> D=[linspace(1,3,3); 2, 4, 5; 5:1:7; exp(1), pi, a] D =
1.0000 2.0000 3.0000 2.0000 4.0000 5.0000 5.0000 6.0000 7.0000 2.7183 3.1416 3.1416 >> D' ans =
1.0000 2.0000 5.0000 2.7183 2.0000 4.0000 6.0000 3.1416 3.0000 5.0000 7.0000 3.1416
2 함수를 사용해서 만드는 행렬도 간단히 전치할 수 있습니다.
>> linspace(1,3,3)' ans =
1 2 3
3 연산 결과를 전치할 때는 괄호를 사용할 수 있습니다.
>> ( [1, 2 ; 3, 4] * [10 ; 1] )' ans = 12 34
행렬의 원소 선택
[편집]인덱싱(indexing)
[편집]원소 번호를 '첨자 인덱스(-index)'라고 하고, 원소를 하나 선택하는 것을 인덱싱이라고 합니다.
1 위에서 정의한 행렬 D의 i행 j열 원소는 D(i,j)로 인덱싱 하여 불러낼 수 있습니다.
>> D(4,1) ans = 2.7183
또한 해당 원소의 자리에 새 값을 덮어쓰기 할 수도 있습니다.
>> D(4,1)=999; >> D D =
1.0000 2.0000 3.0000 2.0000 4.0000 5.0000 5.0000 6.0000 7.0000 999.0000 3.1416 3.1416
2 linspace로 만든 행렬에 바로 적용할 수도 있습니다. 이때 행 벡터나 열 벡터의 원소를 출력할 때, 괄호 안의 숫자는 한개만 넣습니다.
>> linspace(1,3,3)'(2) ans = 2 >> linspace(1,3,3)'(3) ans = 3
앞서 정의한 C 행렬의 네번째 원소를 불러와 봅니다.
>> C(4) ans = 6
슬라이싱(slicing)
[편집]콜론(:)의 사용
[편집]1 행 벡터나 열 벡터의 경우 m번째에서 n번째 원소를 선택할 수도 있습니다. 앞서 정의한 B에서 두번째부터 네번째까지의 원소로 행렬을 만들면,
>> B B =
9 10 11 12
>> B(2:4) ans =
10 11 12
2 콜론(:)을 이용해 특정한 열이나 행 전체를 선택할 수도 있습니다.
>> D(:,3) %행 자리에 콜론(:)이 들어갔으므로 모든 행을 선택하는데, 열 자리에는 3열을 선택하였으므로, 3열에 해당하는 모든 행을 출력합니다. ans =
3.0000 5.0000 7.0000 3.1416
>> D(2,:) %열 자리에 콜론(:)이 들어갔으므로 모든 열을 선택하는데, 행 자리에는 2행을 선택하였으므로, 2행에 해당하는 모든 열을 출력합니다. ans =
2 4 5
3 eye(5) 행렬의 2행부터 4행, 1열부터 4열까지의 원소로 행렬을 만들어 봅니다.
>> eye(5) ans =
Diagonal Matrix
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
>> ans(2:4, 1:4) ans =
0 1 0 0 0 0 1 0 0 0 0 1
불연속적인 행과 열 선택
[편집]연속되지 않은 행과 열을 선택할 수도 있습니다. 이때는 행과 열을 선택할 때 [] 괄호를 사용해주어야 합니다.
>> V=4:3:34
V =
4 7 10 13 16 19 22 25 28 31 34
>> u=V([3,5, 8:10]) % 3번째, 5번째, 8~10번째 원소로 새 행렬 u를 생성
u =
10 16 25 28 31
>> A=[1,2,3,9; 2,4,5,10; 5,6,7,11; 999, pi, pi, 12; 1,2,3,9; 2,4,5,10; 5,6,7,11; 999, pi, pi, 12]
A =
1.0000 2.0000 3.0000 9.0000
2.0000 4.0000 5.0000 10.0000
5.0000 6.0000 7.0000 11.0000
999.0000 3.1416 3.1416 12.0000
1.0000 2.0000 3.0000 9.0000
2.0000 4.0000 5.0000 10.0000
5.0000 6.0000 7.0000 11.0000
999.0000 3.1416 3.1416 12.0000
>> A([4,7], [1,3:4]) % A행렬에서 4행, 7행을 선택하고, 그 중 1열, 3~4열에 해당하는 원소로 행렬을 생성
ans =
999.0000 3.1416 12.0000
5.0000 7.0000 11.0000
기존 행렬에 원소 추가하기
[편집]벡터에 원소 추가하기
[편집]행벡터 혹은 열벡터의 경우 원소를 추가해 보겠습니다.
>> A=1:5
A =
1 2 3 4 5
>> A(6:10)=linspace(0,10,5) % A행렬의 6번째부터 10번째 원소를, 0부터 10까지의 수에서 같은 간격 다섯 개 수로 지정
A =
Columns 1 through 6:
1.00000 2.00000 3.00000 4.00000 5.00000 0.00000
Columns 7 through 10:
2.50000 5.00000 7.50000 10.00000
>> A(15)=999 % 10번째 원소까지만 있는 행렬에, 15번째 원소만 추가한다면, 11번째 원소부터 14번째 원소는 자동으로 0으로 채워집니다.
A =
Columns 1 through 6:
1.00000 2.00000 3.00000 4.00000 5.00000 0.00000
Columns 7 through 12:
2.50000 5.00000 7.50000 10.00000 0.00000 0.00000
Columns 13 through 15:
0.00000 0.00000 999.00000
>> NEW(7)=777 % 아직 존재하지 않는 행렬의 임의 주소에 원소를 할당해 주면, 나머지 주소에는 자동으로 0이 채워집니다.
NEW =
0 0 0 0 0 0 777
행렬에 원소 추가하기
[편집]>> A=ones(5)
A =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> A(3, 8)=999 % 3행 8열에 새 원소 999를 추가하고 나머지 빈 주소에는 0으로 채우기
A =
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 999
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
>> B=A(:,1:5) % A행렬에서 모든 행에 해당하며, 1에서 5열까지의 원소로 새 행렬 B를 만듦
B =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> B(8,8)=888 % B 행렬에서 8행 8열에 새 원소 888을 추가하고 나머지 빈 주소에는 0을 입력
B =
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 888
이미 원소가 있는 주소에 다른 수를 지정하면, 원소가 교체됩니다.
>> B1=ones(5)
B1 =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> B1(3,4)=999 % B1행렬의 3행 4열에 999로 교체
B1 =
1 1 1 1 1
1 1 1 1 1
1 1 1 999 1
1 1 1 1 1
1 1 1 1 1
이어붙이기
[편집]벡터끼리 이어붙이기
[편집]벡터끼리도 이어붙일 수 있습니다.
>> v1=[3:8]
v1 =
3 4 5 6 7 8
>> v2=[11:17]
v2 =
11 12 13 14 15 16 17
>> v3=[v1 v2]
v3 =
3 4 5 6 7 8 11 12 13 14 15 16 17
2차원 행렬 이어붙이기
[편집]2차원 행렬에도 원소 추가를 할 수 있습니다. 이미 있는 행렬에 이미 있는 행렬을 붙여서 새로운 행렬을 만드는 것도 가능합니다.
>> D1=[D, B] % 앞서 만든 D, B행렬을 이어붙여 D1행렬을 만들어 줍니다.
D1 =
1.0000 2.0000 3.0000 9.0000
2.0000 4.0000 5.0000 10.0000
5.0000 6.0000 7.0000 11.0000
999.0000 3.1416 3.1416 12.0000
>> D2=[D1; D1] % D1행렬을 세로로 이어붙여 D2행렬을 만듭니다. 가로로 이어붙인다면 세미콜론(;) 대신 쉼표(,)나 띄어쓰기를 넣어주면 됩니다.
D2 =
1.0000 2.0000 3.0000 9.0000
2.0000 4.0000 5.0000 10.0000
5.0000 6.0000 7.0000 11.0000
999.0000 3.1416 3.1416 12.0000
1.0000 2.0000 3.0000 9.0000
2.0000 4.0000 5.0000 10.0000
5.0000 6.0000 7.0000 11.0000
999.0000 3.1416 3.1416 12.0000
예제 1) ones, zeros를 이용해 첫 두 행은 0, 다음 두 행은 1인 4X4 행렬을 만들어보자.
>> A=ones(2), B=zeros(2)
A =
1 1
1 1
B =
0 0
0 0
>> C=[B B; A A]
C =
0 0 0 0
0 0 0 0
1 1 1 1
1 1 1 1
예제 2) 모두 0으로 채워진 6X6 행렬에서, 3, 4열 그리고 3, 4행에 1을 추가해서 중앙에 십자 표시를 만들어보자.
>> A=ones(2), B=zeros(2)
A =
1 1
1 1
B =
0 0
0 0
>> C=[B A B; A A A; B A B]
C =
0 0 1 1 0 0
0 0 1 1 0 0
1 1 1 1 1 1
1 1 1 1 1 1
0 0 1 1 0 0
0 0 1 1 0 0
예제 3) 예제 2에서 만든 C 행렬의 1행, 2행 그리고 3 ~ 6열에 해당하는 부분에, 행렬의 2, 3행 그리고 3 ~ 6열에 해당하는 원소를 대입해보자.
>> D=[5:5:30; 20:5:45; 0:5:25]
D =
5 10 15 20 25 30
20 25 30 35 40 45
0 5 10 15 20 25
>> C([1,2], [3:6])=D([2,3], [3:6])
C =
0 0 30 35 40 45
0 0 10 15 20 25
1 1 1 1 1 1
1 1 1 1 1 1
0 0 1 1 0 0
0 0 1 1 0 0
원소 제거하기
[편집]제거할 원소를 지정하고 [] 괄호로 덮어쓰기 해주면 원소를 제거할 수 있습니다. 0으로 치환하는 것이 아니라 해당 부분을 제거하고 나머지 부분을 이어붙여서 더 작은 행렬을 만들어줍니다.
>> A=[1:10]
A =
1 2 3 4 5 6 7 8 9 10
>> A(3:6)=[]
A =
1 2 7 8 9 10
>> B=[1:10; 11:20; 21:30]
B =
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
>> B([1,2],[3,4])=[]
error: a null assignment can only have one non-colon index % 가운데만 뻥 뚫린 행렬을 만드는 것은 불가능합니다.
>> B(:,[3,4])=[] % B행렬의 3, 4열을 제거하고 나머지 부분을 이어붙입니다.
B =
1 2 5 6 7 8 9 10
11 12 15 16 17 18 19 20
21 22 25 26 27 28 29 30
행렬의 조작을 위한 함수
[편집]함수 | 설명 | 예시 |
---|---|---|
length(A) | 원소 개수를 알려준다. 스크립트 작성 시, 특히 반복문을 만들 때, length함수를 쓰면 임의 길이의 벡터나 행렬에 대해 반복문을 쉽게 작동시킬 수 있다. | >> A=linspace(99,105,6)
A =
99.000 100.200 101.400 102.600 103.800 105.000
>> length(A)
ans = 6
>> B=[1 2 3 4; 5 6 7 8] % 2차원 행렬일 때는 행과 열 길이 중 큰 것의 개수를 알려준다.
B =
1 2 3 4
5 6 7 8
>> length(B)
ans = 4 % 행보다 열의 수가 더 크므로 4 출력
>> B'
ans =
1 5
2 6
3 7
4 8
>> length(ans)
ans = 4 % 열보다 행의 수가 더 크므로 4 출력
|
size(A) | 해당 행렬의 행과 열 수를 알려준다 | >> B'
ans =
1 5
2 6
3 7
4 8
>> size(B')
ans =
4 2
>> B
B =
1 2 3 4
5 6 7 8
>> size(B)
ans =
2 4
|
reshape(A, m, n) | 크기가 iXj인 행렬을 mXn 행렬로 만들어준다 이때 ij=mn이어야 한다 생성되는 행렬은 1열의 위에서부터 아래로, 2열의 위에서부터 아래로 (...) 순서로 원소가 입력된다 |
>> B
B =
1 2 3 4
5 6 7 8
>> reshape(B,4,2)
ans =
1 3
5 7
2 4
6 8
|
diag(v) | v 벡터의 원소를 대각 성분으로 갖는 대각행렬을 만든다 | >> v=[9 8 7 6];
>> diag(v)
ans =
Diagonal Matrix
9 0 0 0
0 8 0 0
0 0 7 0
0 0 0 6
|
diag([넣을 원소들], 중심으로부터의 변위)를 사용하면 오른쪽과 같이 중심에서 떨어진 곳에 대각 성분을 넣은 행렬을 만들 수 있다. | >> v=[9 8 7];
>> diag(v, 1)
ans =
Diagonal Matrix
0 9 0 0
0 0 8 0
0 0 0 7
0 0 0 0
| |
diag(A) | A행렬의 대각 성분을 추출하여 열 벡터를 만든다 위의 명령어와 동일하지만 입력값에 행렬이 입력되는 것이 차이점이다 |
>> A=[3 6 9; 7 8 9 ; 1 2 3]
A =
3 6 9
7 8 9
1 2 3
>> diag(A)
ans =
3
8
3
|
문자열
[편집]Matlab 2016 b 및 이후 버전에서는 문자형 배열('abc')과 문자열("abc")이 구분되었습니다. 문자열에 몇 가지 편의 기능이 추가되었습니다. 문자형 배열의 타입은 기존과 같이 'char' 타입이며, 문자열의 타입은 'string'으로 구분됩니다. (관례적 쓰임에 따라 문자형 배열, 문자열 모두 넓은 의미에서 문자열로 부를 수 있습니다.)
문자형 배열
[편집]문자형 배열은 작은 따옴표(') 사이에 입력합니다. 문자형 배열도 일종의 행렬로 저장되며 문자 하나하나를 원소로 갖습니다. 알파벳, 한글, 특수문자, 이모지, 띄어쓰기, 숫자 역시 작은 따옴표 안에 입력할 경우 문자로 취급합니다. 문자형 배열에도 행렬에서 사용하는 연산자와 함수 등을 사용할 수 있습니다. 예를 들어 어느 문자형 배열을 변수에 저장했을 때, 문자형 배열의 일부분을 수정하고 싶다면 슬라이싱과 인덱싱을 통해 편집할 수도 있습니다.
>> text='Hello World!' % 문자형 배열 입력
text =
'Hello World'
>> text(1) % 인덱싱
ans =
'H'
>> text(1)='M' % 해당 문자형 배열의 첫번째 인덱스의 원소를 'M'으로 변경
text =
'Mello World'
(문자형 배열의 부분 수정이 통째로 입력보다 불편하다는 설명은 잠시 삭제하였습니다.) Letsdev (토론) 2020년 9월 30일 (수) 00:27 (KST)
문자형은 숫자처럼 다룰 수도 있습니다. 참고로 소문자 'a'는 값으로 97과 같습니다.
>> 'a' == 97
ans =
logical
1
자세한 내용은 아스키코드표, 유니코드표 등을 참고하십시오. Matlab은 유니코드 인코딩 방식의 하나인 UTF-8을 기본으로 합니다.
>> slCharacterEncoding % 매트랩의 인코딩을 확인하거나 변경할 수 있는 내장함수. 참고용이므로 몰라도 된다.
ans =
'UTF-8'
문자열(Matlab 2016 b 및 이후)
[편집]이 항목을 설명하는 동안 등장하는 '문자열'이란 문자형 배열을 포함하지 않는, 좁은 의미의 문자열입니다.
문자열은 큰따옴표(") 사이에 입력한다는 점이 문자형 배열 작성과 차이점입니다.
큰따옴표 사이에 입력함으로써 몇 가지 동작에 차이가 발생합니다. 문자열 자체에서 인덱싱을 하는 것은 불가능해지지만, 서로 길이가 다른 여러 문자열로 배열을 만드는 것이 가능해졌습니다.
문자형 배열만 지원하는 버전에서는 문자열의 길이가 다를 경우 부족한 칸을 공백 문자로 채우거나 cell 타입이라는 것으로 객체화하여야 했습니다. 이제 문자열을 본격적으로 지원하면서 일반 배열을 생성하는 것과 같은 모양으로 다룰 수 있게 되었습니다.
>> str = "abc";
>> str(2)
Index exceeds the number of array elements (1).
>> strlist = ["김철수", "김수한무" ; "고북이와두루미삼", "천갑자동"]
strlist =
2×2 string array
"김철수" "김수한무"
"고북이와두루미삼" "천갑자동"
행렬의 연산
[편집]덧셈과 뺄셈은 특별한 거 없이 그냥 행렬의 크기가 동일하면 서로 더하고 뺄 수 있습니다. 하나의 행렬에서 스칼라 양을 빼면 행렬의 모든 원소에서 연산이 실행됩니다.
>> A=[1:3;3:5;6:8]
A =
1 2 3
3 4 5
6 7 8
>> A-8
ans =
-7 -6 -5
-5 -4 -3
-2 -1 0
행렬의 곱셈은 수학에서의 행렬의 곱셈과 동일합니다. aXb 행렬과 cXd 행렬을 서로 곱해주기 위해서는 b=c이어야 하며, 결과값은 aXd행렬이 됩니다.
>> B=ans % B는 3*3행렬
B =
-7 -6 -5
-5 -4 -3
-2 -1 0
>> C=[1 2 3 4; 3 4 5 6; 7 8 9 10] % C는 3*4 행렬
C =
1 2 3 4
3 4 5 6
7 8 9 10
>> B*C % 3*3행렬에 3*4 행렬을 곱하는 것은 가능하고, 결과는 3*4 행렬입니다.
ans =
-60 -78 -96 -114
-38 -50 -62 -74
-5 -8 -11 -14
>> C*B % 3*4행렬에 3*3 행렬을 곱하는 것은 불가능하고, 에러가 나옵니다.
error: operator *: nonconformant arguments (op1 is 3x4, op2 is 3x3)
덧셈, 뺄셈과 마찬가지로 하나의 행렬에 스칼라 양을 곱해주면 해당 형렬의 모든 원소에 곱셈이 실행됩니다.
octave:1> A=[1 2 ; 3 4]
A =
1 2
3 4
octave:2> 3*A
ans =
3 6
9 12
행렬을 이용한 연립방정식의 풀이
[편집]행렬을 이용해 연립 방정식을 풀기 위해선 우선 연립 방정식을 행렬의 곱으로 바꾼 다음, 왼쪽 나눗셈(\)을 이용하거나 역행렬을 구하는 명령(inv(A)), 행렬의 형태를 바꾸어 구하는 방법을 이용하면 됩니다.
왼쪽 나눗셈을 이용한 풀이를 보겠습니다. 2x-y+3z=4, x+4y+z=2, 6x+10y+3z=0의 해를 구한다고 한다면,
octave:3> A=[2 -1 3; 1 4 1; 6 10 3]
A =
2 -1 3
1 4 1
6 10 3
octave:4> b=[4;2;0]
b =
4
2
0
octave:5> x=A\b
x =
-1.80488
0.29268
2.63415
같은 연립방정식을 역행렬 명령어를 이용해 풀어봅시다. A*x1=b에서 양변에 A의 역행렬(inv(A))를 곱해준다고 할 때, x1=inv(A)*b가 되므로,
octave:6> x1=inv(A)*b
x1 =
-1.80488
0.29268
2.63415
위의 예시와 동일한 결과가 나옴을 알 수 있습니다.
참고) inv(A)와 A\eye(3)은 동일한 값입니다.
octave:26> inv(A)-A\eye(3)
ans =
1.3878e-017 1.1102e-016 5.5511e-017
-1.3878e-017 0.0000e+000 -1.3878e-017
0.0000e+000 0.0000e+000 -2.7756e-017
다음으로 행렬의 형태를 바꾸어주어 풀 수도 있습니다. 이때는 에서 를 구해주면 됩니다.
이 식은 원래 구하고자 하는 연립방정식의 행렬식 형태인 에서 좌변의 곱하는 순서를 바꾸고 모든 행렬을 전치해준 것과 같습니다.
octave:11> A'
ans =
2 1 6
-1 4 10
3 1 3
octave:12> b'
ans =
4 2 0
octave:13> x2=b'*inv(A')
x2 =
-1.80488 0.29268 2.63415
원소별 연산
[편집]같은 크기의 행렬끼리 연산할 때, 수학에서의 행렬의 곱셈을 이용하지 않고 원소끼리만 연산하고 싶다면 연산 기호 앞에 마침표(.)를 찍어주면 됩니다.
octave:14> A=[2 3; 5 6]
A =
2 3
5 6
octave:15> B=[5 5; 6 2]
B =
5 5
6 2
octave:16> A.*B % 원소끼리 단순 곱셈
ans =
10 15
30 12
octave:17> A*B % 행렬의 곱셈을 이용한 결과. 원소끼리 단순히 곱한 것과 다릅니다.
ans =
28 16
61 37
원소별 곱셈(.*) 이외에도 나눗셈(./), 거듭제곱(.^), 왼쪽 나눗셈(.\)이 있습니다.
예제) 인 정수에 대하여, 값을 나열하여라.
octave:18> x=[-5:5], y=x.^2-4*x
x =
-5 -4 -3 -2 -1 0 1 2 3 4 5
y =
45 32 21 12 5 0 -3 -4 -3 0 5
행렬에 관한 기타 함수
[편집]- mean(A) : A가 행렬일 때, 원소들의 산술 평균값을 알려줍니다.
- max(A) : A행렬에서 가장 큰 값을 알려줍니다.
- [m, n]=max(A) : A행렬에서 가장 큰수 m과, 그 수의 위치 n을 알려줍니다. 꼭 m과 n으로 문자를 정할 필요 없이 아무 문자나 해도 됩니다.
octave:19> [m, n]=max(y) % 위 예제에서 사용한 y 행렬에서 가장 큰 값은 m에, 위치는 n에 지정합니다. m = 45 n = 1
- 이차원 이상의 행렬에서는 m에 가장 큰 값을, n에 그 값의 행번호를 알려줍니다.
octave:21> Y=[y; y-1; linspace(30,55,11)] Y = Columns 1 through 8: 45.00000 32.00000 21.00000 12.00000 5.00000 0.00000 -3.00000 -4.00000 44.00000 31.00000 20.00000 11.00000 4.00000 -1.00000 -4.00000 -5.00000 30.00000 32.50000 35.00000 37.50000 40.00000 42.50000 45.00000 47.50000 Columns 9 through 11: -3.00000 0.00000 5.00000 -4.00000 -1.00000 4.00000 50.00000 52.50000 55.00000 octave:22> [m, n]=max(Y) m = Columns 1 through 10: 45.000 32.500 35.000 37.500 40.000 42.500 45.000 47.500 50.000 52.500 Column 11: 55.000 n = 1 3 3 3 3 3 3 3 3 3 3
- min(A) : max(A)와 동일하나, 최솟값을 찾아줍니다.
- [m, n]=min(A) : [m, n]=max(A)와 동일하나, 최솟값과 위치를 찾아줍니다.
- sum(A) : 원소들의 합을 알려줍니다. 벡터가 아닌 행렬에 대해서는 각 열의 합을 벡터로 나타내 줍니다.
>> A=[1 2; 3 4]; sum(A)
ans =
4 6
- sort(A) : 원소들을 오름차순으로 정렬해줍니다. 만약 이차원 이상의 행렬이라면 각각의 열에 대해서 오름차순으로 정리해 줍니다.
octave:27> A A = 2 -1 3 1 4 1 6 10 3 octave:28> sort(A) ans = 1 -1 1 2 4 3 6 10 3
- median(A) : 중앙값을 알려줍니다.
octave:30> B=[5 9 2 4]; median(B) ans = 4.5000
- 이차 이상의 행렬에 대해서는 각 열의 중앙값을 알려줍니다.
octave:27> A A = 2 -1 3 1 4 1 6 10 3 octave:29> median(A) ans = 2 4 3
- std(A) : 표준편차를 알려줍니다.
- det(A) : 행렬식을 알려줍니다.
octave:32> B=[5 9 ; 2 4], det(B) B = 5 9 2 4 ans = 2.0000
- dot(a,b) : 두 벡터의 내적을 구해줍니다.
octave:33> a=[1 2 3], b=[4 5 6] a = 1 2 3 b = 4 5 6 octave:34> dot(a,b) ans = 32
- cross(a,b) : 두 벡터의 외적을 구해줍니다.
octave:35> cross(a,b) ans = -3 6 -3
응용 예제
[편집]세 힘의 합력 크기를 Matlab을 이용해 구하고, 합력의 작용 방향도 구하시오.
octave:36> F1=400*[cosd(-20), sind(-20)], F2=500*[cosd(30), sind(30)], F3=700*[cosd(143), sind(143)]
F1 =
375.88 -136.81
F2 =
433.01 250.00
F3 =
-559.04 421.27
octave:37> F=F1+F2+F3
F =
249.84 534.46
octave:38> F_total=sqrt(sum(F.^2))
F_total = 589.98
octave:39> d=atand(F(2)/F(1))
d = 64.945
참고한 글, 강의
[편집]- 스터디메이크 Matlab 강좌
- 충북대 수치해석 강의