matlab for c/c++ programmers - kaist it academy web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39...

46
MATLAB Programming Quiz (3min) 문제 1) 1부터 10까지 10개의 연속된 숫자를 가진 벡터 x가 있을 때, 벡터 x의 짝수 번째에 위치한 값들을 벡터 x의 최대값에서 뺀 값으로 대체하여 봅시다. = [ 1 2 3 4 5 6 7 8 9 10 ] = [ 1 3 5 7 9 ] Hint 콜론 연산자, max 함수, 스칼라와 벡터의 차, 벡터의 일부 원소 변경 2

Upload: lamduong

Post on 03-Apr-2018

233 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz (3min)

문제 1) 1부터 10까지 10개의 연속된 숫자를 가진 벡터 x가 있을 때, 벡터 x의 짝수 번째에 위치한 값들을 벡터 x의 최대값에서 뺀 값으로 대체하여 봅시다.

• 𝑥 = [ 1 2 3 4 5 6 7 8 9 10 ]

• 𝑎𝑛𝑠 = [ 1 𝟖 3 𝟔 5 𝟒 7 𝟐 9 𝟎 ]

• Hint – 콜론 연산자, max 함수, 스칼라와 벡터의 차, 벡터의 일부 원소 변경

2

Page 2: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz Sol. (3min)

문제 1) 1부터 10까지 10개의 연속된 숫자를 가진 벡터 x가 있을 때, 벡터 x의 짝수 번째에 위치한 값들을 벡터 x의 최대값에서 뺀 값으로 대체하여 봅시다.

• 𝑥 = [ 1 2 3 4 5 6 7 8 9 10 ]

• 𝑎𝑛𝑠 = [ 1 𝟖 3 𝟔 5 𝟒 7 𝟐 9 𝟎 ]

3

>> x = 1:10

x =

1 2 3 4 5 6 7 8 9 10

>> x(2:2:10) = max(x) – x(2:2:10)

Page 3: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz (5min)

문제 2) 다음 연립 방정식을 행렬로 표현하고, 방정식의 근 x을 행렬 연산을 통해 계산해봅시다.

• 연립 방정식 −3𝑥1 − 𝑥3 = -3

2𝑥1 + 5𝑥2 − 7𝑥3 = 1

−𝑥1 + 4𝑥2 + 8𝑥3 = 2

• Hint – 방정식의 근 행렬로 구하기

• 𝐴𝑥 = 𝑏 ⇒ 𝐴−1𝐴𝑥 = 𝐼𝑥 = 𝑥 = 𝐴−1𝑏

– 행렬 M의 역행렬 구하는 함수

• inv(M)

4

Page 4: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz Sol. (5min)

문제 2) 다음 연립 방정식을 행렬로 표현하고, 방정식의 근 x을 행렬 연산을 통해 계산해봅시다.

• 연립 방정식 −3𝑥1 − 𝑥3 = -3

2𝑥1 + 5𝑥2 − 7𝑥3 = 1

−𝑥1 + 4𝑥2 + 8𝑥3 = 2

• Hint – 방정식의 근 행렬로 구하기

• 𝐴𝑥 = 𝑏 ⇒ 𝐴−1𝐴𝑥 = 𝐼𝑥 = 𝑥 = 𝐴−1𝑏

– 행렬 M의 역행렬 구하는 함수

• inv(M)

5

>> A = [-3 0 -1; 2 5 -7; -1 4 8]

A =

-3 0 -1

2 5 -7

-1 4 8

>> b = [-3 1 2]‘

b =

-3

1

2

>> x = inv(A) * b

x =

0.9124

0.2028

0.2627

Page 5: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz (5min)

문제 3) 10 x 10 magic 행렬을 생성에서 짝수 행, 홀수 열인 원소들의 값을 5 x 5 magic 행렬 값으로 대체하세요.

6

M =

92 99 1 8 15 67 74 51 58 40

98 80 7 14 16 73 55 57 64 41

4 81 88 20 22 54 56 63 70 47

85 87 19 21 3 60 62 69 71 28

86 93 25 2 9 61 68 75 52 34

17 24 76 83 90 42 49 26 33 65

23 5 82 89 91 48 30 32 39 66

79 6 13 95 97 29 31 38 45 72

10 12 94 96 78 35 37 44 46 53

11 18 100 77 84 36 43 50 27 59

M =

92 99 1 8 15 67 74 51 58 40

17 80 24 14 1 73 8 57 15 41

4 81 88 20 22 54 56 63 70 47

23 87 5 21 7 60 14 69 16 28

86 93 25 2 9 61 68 75 52 34

4 24 6 83 13 42 20 26 22 65

23 5 82 89 91 48 30 32 39 66

10 6 12 95 19 29 21 38 3 72

10 12 94 96 78 35 37 44 46 53

11 18 18 77 25 36 2 50 9 59

Page 6: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz Sol. (5min)

문제 3) 10 x 10 magic 행렬을 생성에서 짝수 행, 홀수 열인 원소들의 값을 5 x 5 magic 행렬 값으로 대체하세요.

7

M =

92 99 1 8 15 67 74 51 58 40

98 80 7 14 16 73 55 57 64 41

4 81 88 20 22 54 56 63 70 47

85 87 19 21 3 60 62 69 71 28

86 93 25 2 9 61 68 75 52 34

17 24 76 83 90 42 49 26 33 65

23 5 82 89 91 48 30 32 39 66

79 6 13 95 97 29 31 38 45 72

10 12 94 96 78 35 37 44 46 53

11 18 100 77 84 36 43 50 27 59

M =

92 99 1 8 15 67 74 51 58 40

17 80 24 14 1 73 8 57 15 41

4 81 88 20 22 54 56 63 70 47

23 87 5 21 7 60 14 69 16 28

86 93 25 2 9 61 68 75 52 34

4 24 6 83 13 42 20 26 22 65

23 5 82 89 91 48 30 32 39 66

10 6 12 95 19 29 21 38 3 72

10 12 94 96 78 35 37 44 46 53

11 18 18 77 25 36 2 50 9 59

>> M = magic( 10 );

>> M(2:2:end, 1:2:end) = magic(5)

Page 7: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬 다루기: 심화편

김 탁 은

[email protected]

8

Page 8: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

서브 행렬로부터 행렬 만들기

각 행렬들을 서브(sub) 행렬로 하여 새로운 행렬 M 생성

9

p q

𝑴 = r

s

>> B = [1 2; 3 4]

B =

1 2

3 4

>> C = [ B zeros(2); ones(2) eye(2) ]

C =

1 2 0 0

3 4 0 0

1 1 1 0

1 1 0 1

Page 9: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

빈 행렬 (Empty Matrix)

Empty Matrix의 정의 • 0 x 0, m x 0 x n, … 등 어느 한 dimension이라도 0인 것

• 아래와 같이 행이나 열에 []을 대입하면 해당 행 또는 열이 제거됨

10

>> Z = []

Z =

[]

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> M(2, :) = []

M =

8 1 6

4 9 2

Page 10: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬 transpose

행렬 M의 원소가 𝑎𝑖𝑗일 때

• 𝑎𝑖𝑗 → 𝑎𝑗𝑖

11

>> M = randi( 10, 3, 5)

M =

1 8 5 8 7

5 8 5 8 7

4 2 7 3 2

>> M’ % 프라임

ans =

1 5 4

8 8 2

5 5 7

8 8 3

7 7 2

Page 11: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬에서 행/열의 합, 평균

sum(M) : 행 방향으로 원소들의 합 계산

sum(M,2) : 열 방향으로 원소들의 합 계산

mean(M) : 행 방향으로 원소들의 평균 계산

mean(M,2) : 열 방향으로 원소들의 평균 계산

12

s𝑢𝑚 𝑀 = 23 21 21

𝑀 = 9 8 111 7 8

13 6 2

s𝑢𝑚 𝑀, 2 =

281621

𝑚𝑒𝑎𝑛 𝑀, 2 =

9.33335.33337.0000

𝑚𝑒𝑎𝑛 𝑀 = 7.6667 7.0000 7.0000

Page 12: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬에서 행/열의 최대 및 최소

min(M) : 행 방향으로 원소들의 최소값 계산

min(M,[],2) : 열 방향으로 원소들의 최소값 계산

최소값이 위치한 인덱스?

13

𝑚𝑖𝑛 𝑀 = 1 6 2

𝑀 = 9 8 111 7 8

13 6 2

𝑚𝑖𝑛 𝑀, , 2 =

812

>> [V, I] = min(M)

V =

1 6 2

I =

2 3 3

최소값

열에서 최소값의 위치

Page 13: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬에서 행/열의 분산, 표준편차

var(M) : 행 방향으로 원소들의 분산 계산

var(M,[],2) : 열 방향으로 원소들의 분산 계산

std(M) : 행 방향으로 원소들의 표준편차 계산

std(M,[],2) : 열 방향으로 원소들의 표준편차 계산

14

𝑣𝑎𝑟 𝑀 = 37.3333 1.0000 21.0000

𝑀 = 9 8 111 7 8

13 6 2

𝑣𝑎𝑟 𝑀, , 2 =

2.3333

14.333331.0000

𝑠𝑡𝑑 𝑀, , 2 =

1.52753.78595.5678

𝑠𝑡𝑑 𝑀 = 6.1101 1.0000 4.5826

Page 14: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz (5min)

문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 행렬로 나타내고, 여러 가지 값들을 구해봅시다.

• 1) 각 과목별 평균, 분산, 최고점, 최저점

• 2) 각 학생별 총점 및 평균

• 3) 각 학생 별 최고점 받은 과목 점수

• 4) 반 전체 점수 합계 및 평균

15

국어 수학 과학 체육

영희 98 83 89 89

철수 89 92 97 87

민수 78 86 91 96

Page 15: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz Sol. (5min)

문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 행렬로 나타내고, 여러 가지 값들을 구해봅시다.

16

국어 수학 과학 체육

영희 98 83 89 89

철수 89 92 97 87

민수 78 86 91 96

>> S = [98 83 89 89; 89 92 97 87; 78 86 91 96]

S =

98 83 89 89

89 92 97 87

78 86 91 96

% 각 과목별 평균, 분산, 최고점, 최저점

>> mean(S), var(S), max(S), min(S)

% 각 학생별 총점 및 평균

>> sum(S’), mean(S’)

% 각 학생 별 최고점 받은 과목 점수

>> max(S’)

% 반 전체 점수 합계 및 평균

>> sum(sum(S)), mean(mean(S))

Page 16: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬의 차원 변경

reshape 함수 • m x n 행렬 p x q 행렬로 변경

• 변환하려는 행렬과 변환하고자 하는 행렬의 원소 수는 동일해야 함 (즉, m*n == p*q)

• reshape( m x n 행렬, p, q)

17

>> M = randi( 10, 3, 5)

M =

1 8 5 8 7

5 8 5 8 7

4 2 7 3 2

>> reshape(M, 5, 3)

ans =

1 2 8

5 5 3

4 5 7

8 7 7

8 8 2

Page 17: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz

문제 4) 1:27 벡터로부터 reshape 함수를 통해 다음 행렬을 만들어 봅시다.

• 𝑀 = 1 2 3

10 11 1219 20 21

4 5 613 14 1522 23 24

7 8 916 17 1825 26 27

18

Page 18: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz Sol.

문제 4) 1:27 벡터로부터 reshape 함수를 통해 다음 행렬을 만들어 봅시다.

• 𝑀 = 1 2 3

10 11 1219 20 21

4 5 613 14 1522 23 24

7 8 916 17 1825 26 27

• 1:27 벡터로부터 reshape 함수를 통해 위의 M 행렬을 만드는 방법

19

>> v = 1:27

v =

Columns 1 through 11

1 2 3 4 5 6 7 8 9 10 11

Columns 12 through 22

12 13 14 15 16 17 18 19 20 21 22

Columns 23 through 27

23 24 25 26 27

>> reshape(v, 9, 3)'

ans =

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

Page 19: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행렬 복제

repmat 함수 • B = repmat( m x n 행렬, p, q)

• m x n 행렬을 열 방향으로 p개, 행 방향으로 q개 복제하여 mp x nq 행렬을 생성

20

>> M = [1 2 3; 4 5 6]

M =

1 2 3

4 5 6

>> repmat( M, 1, 2 )

ans =

1 2 3 1 2 3

4 5 6 4 5 6

>> v = [1 3 4];

v =

1 3 4

>> repmat(v, 3, 2)

ans =

1 3 4 1 3 4

1 3 4 1 3 4

1 3 4 1 3 4

Page 20: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz

문제 5) 5개의 2차원 공간상의 점들이 아래와 같이 행렬 M으로 주어져 있고, 점 Q가 아래와 같이 벡터로 주어졌을 때, 점 Q와 각 점들간의 유클리디언 거리를 구해보세요.

• 𝑀 =

1 35 62 38 9

, 𝑄 = 5 2

• 두 점 𝑃1 = 𝑥1 𝑦1 , 𝑃2 = 𝑥2 𝑦2 이 주어졌을 때,

– 유클리디언 거리 = 𝑥1 − 𝑥22 + 𝑦1 − 𝑦2

2

• Hint! repmat을 이용해 Q를 4 x 2 행렬로 변환

Q와 M간의 행렬 연산을 통해 각 원소간 차의 제곱을 계산

sum 함수와 sqrt 함수 사용

21

Page 21: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz Sol.

문제 5) 5개의 2차원 공간상의 점들이 아래와 같이 행렬 M으로 주어져 있고, 점 Q가 아래와 같이 벡터로 주어졌을 때, 점 Q와 각 점들간의 유클리디언 거리를 구해보세요.

• 𝑀 =

1 35 62 38 9

, 𝑄 = 5 2

• 두 점 𝑃1 = 𝑥1 𝑦1 , 𝑃2 = 𝑥2 𝑦2 이 주어졌을 때,

– 유클리디언 거리 = 𝑥1 − 𝑥22 + 𝑦1 − 𝑦2

2

22

>> M = [1 3; 5 6; 2 3; 8 9]

M =

1 3

5 6

2 3

8 9

>> Q = [5 2]

Q =

5 2

>> rQ = repmat(Q, 4, 1)

rQ =

5 2

5 2

5 2

5 2

>> (rQ-M).^2

ans =

16 1

0 16

9 1

9 49

>> sqrt(sum((rQ-M).^2, 2))

ans =

4.1231

4.0000

3.1623

7.6158

Page 22: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

대각 행렬

행렬의 대각 원소를 제외한 나머지가 0인 행렬 • diag(x): 대각 원소가 x의 원소들로 이루어지는 대각 행렬

• diag(x, k): x를 k번째 대각 위치에 넣음 – k = 0 → 주대각선

– k > 0 → 주대각선 윗부분

– k < 0 → 주대각선 아랫부분

23

>> diag( [1 2 3] )

ans =

1 0 0

0 2 0

0 0 3

>> diag( [1 2], 1 )

ans =

0 1 0

0 0 2

0 0 0

>> diag( [3 4], -2 )

ans =

0 0 0 0

0 0 0 0

3 0 0 0

0 4 0 0

Page 23: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

삼각 행렬

Upper triangular matrix • triu(A) : 주 대각선 및 그 윗부분의 원소들만을 취함

• triu(A, k) : A의 k번째 대각선 및 그 윗부분의 원소들만을 취함

Lower triangular matrix tril(A) : 주 대각선 및 그 아랫부분의 원소들만을 취함 tril(A, k) : A의 k번째 주 대각선 및 그 아랫부분의 원소들만을 취함

24

>> A = magic(3)

A =

8 1 6

3 5 7

4 9 2

>> triu(A)

ans =

8 1 6

0 5 7

0 0 2

>> triu(A, 1)

ans =

0 1 6

0 0 7

0 0 0

>> A = magic(3)

A =

8 1 6

3 5 7

4 9 2

>> tril(A)

ans =

8 0 0

3 5 0

4 9 2

>> tril(A, 1)

ans =

8 1 0

3 5 7

4 9 2

Page 24: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

행과 열 재배치 (reordering)

주어진 행렬에서 행 또는 열의 위치를 변경하고자 할 때

• Col 1 ↔ Col 3, Col 2 ↔ Col 4 이므로, [1 2 3 4 5] [3 4 1 2 5]

25

𝑀 =

8 56 6

1 6 25 7 6

3 69 2

1 1 75 8 8

>> M = randi(10, 4, 5)

M =

8 5 1 6 2

6 6 5 7 6

3 6 1 1 7

9 2 5 8 8

>> M( :, [3 4 1 2 5])

ans =

1 6 8 5 2

5 7 6 6 6

1 1 3 6 7

5 8 9 2 8

𝑀′ =

1 65 7

8 5 26 6 6

1 15 8

3 6 79 2 8

Page 25: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

• “행렬” “논리연산자” “조건” 으로 특정 조건 만족하는 행렬 원소 선택

• 선택된 원소의 값을 수정하려면

특정 조건 만족하는 행렬 원소

26

𝑀 =

8 56 6

1 6 25 7 6

3 69 2

1 1 75 8 8

>> M <= 1

ans =

0 0 1 0 0

0 0 0 0 0

0 0 1 1 0

0 0 0 0 0

>> find(M<=1)

ans =

9

11

15

>> M(M <= 1) = -10 >> M(find(M<=1)) = -10

Page 26: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Sparse Matrix

원소들의 대부분이 0인 행렬

27

𝑀 = 0 0 30 0 00 0 0

0 0 00 0 00 2 0

6 0 00 5 00 0 0

(1, 3) = 3

(1, 7) = 6

(2, 8) = 5

(3, 5) = 2

full matrix

sparse matrix

sparse(M)

full(M)

Page 27: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

다차원 배열 (Multidimensional Array)

2개 이상의 차원을 가질 수 있는 배열

n 차원 배열은 n-1 차원 배열을 아래 그림과 같이 쌓아놓은 것으로 생각할 수 있음

기존 2차원 행렬에 이용했던 방법을 다차원 배열에서도 그대로 이용

• 3차원 배열의 예

– 1st index : row index

– 2nd index : column index

– 3rd index: page index

28

3) 3, (4,3) 2, (4,3) 1, (4,

3) 3, (3,3) 2, (3,3) 1, (3,

3) 3, (2,3) 2, (2,3) 1, (2,

3) 3, (1,3) 2, (1,3) 1, (1,

2) 3, (4,2) 2, (4,2) 1, (4,

2) 3, (3,2) 2, (3,2) 1, (3,

2) 3, (2,2) 2, (2,2) 1, (2,

2) 3, (1,2) 2, (1,2) 1, (1,

1) 3, (4,1) 2, (4,1) 1, (4,

1) 3, (3,1) 2, (3,1) 1, (3,

1) 3, (2,1) 2, (2,1) 1, (2,

1) 3, (1,1) 2, (1,1) 1, (1,

page

column

row

Page 28: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

다차원 배열의 의미

m x n 픽셀 크기를 가지는 컬러 이미지는 RGB 또는 CYK 값으로 표현됨

즉, 이미지는 m x n x 3 의 행렬로 구성된다고 볼 수 있음

29

RGB or CYK

n

m

Page 29: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

다차원 배열의 생성

2차원 배열을 먼저 생성한 뒤, 2차원 배열을 한 차원씩 확장하여 생성 • 예를 들어, 3 x 3 x 2인 3차원 배열을 만드는 방법

30

>> A = magic(3)

A =

8 1 6

3 5 7

4 9 2

>> A(:, :, 2) = [1 0 4; 3 5 6; 9 8 7]

A(:,:,1) =

8 1 6

3 5 7

4 9 2

A(:,:,2) =

1 0 4

3 5 6

9 8 7

1 page

2 page

Page 30: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

배열의 차원을 알아보는 함수

N = ndims(A) • 다차원 배열 A의 차원의 개수를 알려줌

[m, n, p, q, …] = size(A) • 각 차원의 크기를 알려줌

실습) 앞서 만든 3차원 배열 A에 대해 ndims(A), size(A)를 각각 실행해봅시다.

31

Page 31: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz

문제 6) 아래 두 3 x 3 x 2 배열을 생성해 봅시다. 그리고 두 배열로부터 3 x 3 x 2 x 2인 4차원 배열을 생성해 봅시다.

32

1 0 43 5 69 8 7

5 7 80 1 94 3 6

6 8 34 3 65 9 2

1 0 34 −1 28 2 1

Page 32: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

다차원 배열에서 합, 평균

sum(M) : 첫 번째 차원 방향 원소들의 합 계산

sum(M, 2) : 두 번째 차원 방향으로 원소들의 합 계산

sum(M, 3) : 세 번째 차원 방향으로 원소들의 합 계산

33

1 0 43 5 69 8 7

5 7 80 1 94 3 6

s𝑢𝑚 𝑀 = 9 11 23

13 13 17 = 𝑠𝑢𝑚(𝑀)

s𝑢𝑚 𝑀, 2

=

5

1424

s𝑢𝑚 𝑀, 2

=

201013

6 17 123 6 15

13 11 13

Page 33: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

다차원 배열 생성 함수

ones, zeros, rand, randn

34

>> ones(3, 3, 2)

ans(:,:,1) =

1 1 1

1 1 1

1 1 1

ans(:,:,2) =

1 1 1

1 1 1

1 1 1

>> zeros(3,3,2)

ans(:,:,1) =

0 0 0

0 0 0

0 0 0

ans(:,:,2) =

0 0 0

0 0 0

0 0 0

>> rand(3,3,2)

ans(:,:,1) =

0.0563 0.3996 0.2954

0.8547 0.3254 0.3661

0.3843 0.5554 0.3490

ans(:,:,2) =

0.6302 0.9444 0.9196

0.6644 0.3503 0.2887

0.9921 0.1930 0.5509

>> randn(3,3,2)

ans(:,:,1) =

0.8746 -0.2592 -0.8729

-0.4928 0.2126 1.3399

-0.4823 2.0369 -0.2154

ans(:,:,2) =

0.8979 -0.2592 0.9610

0.0597 0.9589 -0.5638

-0.5342 1.2668 -1.2888

Page 34: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

MATLAB Data Types

35

Page 35: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

MATLAB Data Types

36

Page 36: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Numeric Data Types

default numeric data type은 double

• 데이터 타입 확인은 >> class(A)

• 데이터 타입 별 min/max 값은 정수의 경우 intmin() / intmax(), 실수의 경우 realmin() / realmax()

37

Data Type Size (bytes) Min Max

int8 1 -128 128

int16 2 -32768 32767

int32 4 -2147483648 2147483647

uint8 1 0 255

uint16 2 0 65535

uint32 4 0 4294967295

single 4 1.1755e-38 3.4028e+38

double 8 2.2251e-308 1.7977e+308

Page 37: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Numeric Data Type간 변환

변환하고자 하는 데이터 타입의 이름을 함수처럼 사용하여, 행렬을 매개변수로 주면 됨

주의할 점 • 데이터 범위가 더 넓은 데이터 타입에서 데이터 범위가 좁은 데이터 타입으로 변환 시,

데이터 손실이 있을 수 있음.

• eg) A = uint32(257)와 B = int8(A)는 서로 다른 값

38

>> A = rand(5,3);

>> sA = single(A)

>> ui8 = uint8(A)

>> ui16 = uint16(sA)

>> double(ui16)

>> …

Page 38: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Numeric Data Type 변환 하는 이유?

매우 큰 배열을 만들 때, 메모리를 절약하기 위해 다른 Numeric Data Type으로 변환할 필요가 있음

39

>> clear all; clc;

% double 타입의 1000 x 1000 행렬 생성

>> dA = rand(1000,1000);

>> class(dA)

ans =

double

% double 타입 행렬을 single 타입으로 변환

>> sA = single(dA);

>> class(sA)

ans =

single

% 두 배열이 차지하는 메모리 공간 확인

>> whos

Name Size Bytes Class Attributes

dA 1000x1000 8000000 double

sA 1000x1000 4000000 single

Page 39: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

문자열

문자열은 작은 따옴표로 나타냄

두 문자열의 합성 • 문자열은 1 x n 배열로 취급됨

• 따라서 두 문자열의 합성은 두 1 x n 배열의 합성 방법과 동일

• 대부분의 경우 두 문자열의 길이가 서로 다르므로, [x; y] 와 같이 문자열을 합성하려고 하면 에러가 남

40

>> x = ‘hello world’

x =

hello world

>> x = ‘hello ’

>> y = ‘world’

>> z = [x y]

z =

hello world

Page 40: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

문자열

문자열의 길이

문자열 배열 생성 방법 I • 각 문자의 길이가 동일하도록 spacebar로 맞춰준다.

41

>> length(z)

ans =

11

>> A = [‘apple’; ‘orange’]

Error using vertcat

Dimensions of matrices being concatenated are not consistent.

>> A = ['apple '; 'orange']

A =

apple

orange

Page 41: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

문자열

문자열 배열 생성 방법 II

문자열 배열에서 각 문자열 접근 방법

42

>> a = 'apple';

>> b = 'orange';

>> c = 'bananas';

>> abc = char(a,b,c)

abc =

apple

orange

bananas

>> abc( 1, : )

ans =

apple

>> abc( 2, : )

ans =

orange

>> abc( 3, : )

ans =

bananas

Page 42: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Cell 데이터 타입

숫자 10과 문자 ‘Hello World’를 동시에 한 배열에 저장할 수 있을까?

Cell array는 서로 다른 타입의 데이터들을 한 곳에 저장 가능

43

>> [10 'Hello World']

ans =

Hello World

실패!!

의도와 전혀 다른

예상치 못한 결과

>> A{1,1} = 10

A =

[10]

>> A{1,2} = 'hello world'

A =

[10] 'hello world'

올바른 결과

Page 43: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Cell 데이터 타입

Cell() 함수 이용하여 Cell 데이터 생성

Cell 데이터 시각화 • 각 셀에 어떠한 타입의 데이터가 있는지 보여줌

44

>> A = cell(1,2)

A =

[] []

>> A{1,1} = 10

A =

[10] []

>> A{1,2} = 'hello world'

A =

[10] 'hello world'

1 x 2 크기의 cell 배열 생성

• 배열 원소 접근 방법과 동일

• []이 아니라 {}임을 주의

>> cellplot(A, ‘legend’)

Page 44: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Cell 데이터 타입

Cell 안에 Cell 넣기

Cell 안에 Cell의 원소 접근하기

45

>> C = { [1 2], ‘hello’ ; ‘world’, [3, 4] }

C =

[1x2 double] 'hello'

'world' [1x2 double]

>> D = {C, 'kaist'; 'academy', 2014}

D =

{2x2 cell} 'kaist'

'academy' [2014]

>> cellplot(D, ‘legend’)

% “hello” 원소에 접근하기

>> D{1,1}{1,2}

% [1 2] 배열의 원소 접근하기

>> D{1,1}{1,1}(1)

Page 45: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Cell에 문자열 저장하기

46

>> C = cell(1,3)

C =

[] [] []

>> C{1} = 'Seoul'

C =

'Seoul' [] []

>> C{2} = 'Daejeon'

C =

'Seoul' 'Daejeon' []

>> C{3} = 'Busan'

C =

'Seoul' 'Daejeon' 'Busan‘

>> cellplot(C)

문자열 저장하기 문자열 가져오기

>> >> C{1}

ans =

Seoul

>> C{2}

ans =

Daejeon

>> C{3}

ans =

Busan

Page 46: MATLAB for C/C++ Programmers - KAIST IT Academy Web … ·  · 2014-01-0723 5 82 89 91 48 30 32 39 66 79 6 13 95 97 ... 문제 4) 어은 ... •m x n 행렬을 열 방향으로 p개,

MATLAB Programming

Quiz

문제 7) 다음과 같은 원소들로 구성된 2 x 2 Cell 배열을 만들어 봅시다.

47

[1 2] ′KA𝐼𝑆𝑇′2 + 3𝑖 5