matlab for c/c++ programmers - ita.kaist.ac.kr · quiz sol. (5min) 문제 4) 어은 초등학교...

63
행렬 다루기: 심화편 [email protected] 1

Upload: others

Post on 19-Sep-2019

14 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 다루기: 심화편

김 탁 은

[email protected]

1

Page 2: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

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

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

2

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 3: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

빈 행렬 (Empty Matrix)

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

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

3

>> 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 4: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

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

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

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

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

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

4

Page 5: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

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

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

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

최소값이 위치한 인덱스?

5

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

V =

1 6 2

I =

2 3 3

최소값

열에서 최소값의 위치

Page 6: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

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

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

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

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

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

6

Page 7: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz (5min)

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

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

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

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

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

7

국어 수학 과학 체육

영희 98 83 89 89

철수 89 92 97 87

민수 78 86 91 96

Page 8: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol. (5min)

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

8

국어 수학 과학 체육

영희 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 9: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬의 차원 변경

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

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

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

9

>> 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 10: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz

10

Page 11: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

11

>> 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 12: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

12

>> 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

>> transpose(M)

Page 13: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

13

>> M = randi(10,2,3) + i*randi(10,2,3)

M =

7.0000 + 8.0000i 10.0000 + 2.0000i 5.0000 + 5.0000i

4.0000 + 8.0000i 1.0000 + 5.0000i 4.0000 + 7.0000i

>> ctranspose(M)

ans =

7.0000 - 8.0000i 4.0000 - 8.0000i

10.0000 - 2.0000i 1.0000 - 5.0000i

5.0000 - 5.0000i 4.0000 - 7.0000i

>> M’ % 프라임

z = a+bi

conj(z) = a-bi

Page 14: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

transpose와 ctranspose 차이

• 각 원소가 실수인 행렬 M에 대해, transpose(M) 과 ctranspose(M)은 동일

• 각 원소가 복소수인 행렬 M에 대해, transpose(M) 과 ctranspose(M)은 서로 다름

14

>> M = magic(2)

M =

1 3

4 2

>> transpose(M)

ans =

1 4

3 2

>> ctranspose(M)

ans =

1 4

3 2

>> M = magic(2)+magic(2)*i

M =

1.0000 + 1.0000i 3.0000 + 3.0000i

4.0000 + 4.0000i 2.0000 + 2.0000i

>> transpose(M)

ans =

1.0000 + 1.0000i 4.0000 + 4.0000i

3.0000 + 3.0000i 2.0000 + 2.0000i

>> ctranspose(M)

ans =

1.0000 - 1.0000i 4.0000 - 4.0000i

3.0000 - 3.0000i 2.0000 - 2.0000i

Page 15: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

rot90( M )

• 행렬 M을 반시계 방향으로 90도 회전함

15

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

M =

1 2 3

4 5 6

>> rot90(M)

ans =

3 6

2 5

1 4

Page 16: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

16

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> flipud(M)

ans =

4 9 2

3 5 7

8 1 6

flipud (flip up-down)

• 행렬 M을 상하로 회전시킴

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> fliplr(M)

ans =

6 1 8

7 5 3

2 9 4

fliplr (flip left-right)

• 행렬 M을 좌우로 회전시킴

Page 17: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

17

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> flipud(M)

ans =

4 9 2

3 5 7

8 1 6

flipdim(M, 1)

• 행렬 M을 상하로 회전시킴

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> fliplr(M)

ans =

6 1 8

7 5 3

2 9 4

flipdim(M, 2)

• 행렬 M을 좌우로 회전시킴

flipdim( M, dim )

• 행렬 M을 dim 방향으로 회전

Page 18: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 Reshaping

18

circshift( M, shiftsize )

• 행렬 M의 행 또는 열을 shiftsize 만큼 shift

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> circshift(M, -1)

ans =

3 5 7

4 9 2

8 1 6

circshift(M, -1)

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> circshift(M, 1)

ans =

4 9 2

8 1 6

3 5 7

circshift(M, 1)

>> M = magic(3)

M =

8 1 6

3 5 7

4 9 2

>> circshift(M, [1 -1])

ans =

9 2 4

1 6 8

5 7 3

circshift(M, [1 -1])

Page 19: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행렬 복제

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

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

19

>> 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 - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz

20

Page 21: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

21

>> 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 - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

대각 행렬

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

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

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

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

22

>> 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 - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

삼각 행렬

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

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

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

23

>> 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 - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

행과 열 재배치 (reordering)

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

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

24

>> 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

Page 25: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

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

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

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

25

>> 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 - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Sparse Matrix

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

26

(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 - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Sparse Matrix

Sparse Matrix 에서 연산

• Full matrix 에서의 연산 방법을 그대로 적용 가능

27

>> M = zeros(4,6);

>> M([1 5 7]) = [5 9 6]

M =

5 9 0 0 0 0

0 0 0 0 0 0

0 6 0 0 0 0

0 0 0 0 0 0

>> S = sparse(M)

S =

(1,1) 5

(1,2) 9

(3,2) 6

>> F = S * S'

F =

(1,1) 106

(3,1) 54

(1,3) 54

(3,3) 36

>> full(F)

ans =

106 0 54 0

0 0 0 0

54 0 36 0

0 0 0 0

Page 28: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Sparse Matrix

Sparse Matrix vs Full Matrix

• 두 행렬이 차지하는 메모리 크기를 비교

28

>> M = zeros(100,100);

>> M([1 5 10 23]) = [5 9 13 2];

>> S = sparse(M);

>> S = sparse(M)

S =

(1,1) 5

(5,1) 9

(10,1) 13

(23,1) 2

>> whos

Name Size Bytes Class Attributes

M 100x100 80000 double

S 100x100 872 double sparse

Page 29: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열 (Multidimensional Array)

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

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

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

• 3차원 배열의 예

– 1st index : row index

– 2nd index : column index

– 3rd index: page index

29

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 30: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열의 의미

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

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

30

RGB or CYK

n

m

Page 31: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열의 의미

MRI image

• 여러 장의 slice 이미지가 다차원 배열에 저장되어 있다고 볼 수 있음

31

Page 32: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열의 생성

방법 1. 2차원 배열을 먼저 생성한 뒤, 2차원 배열을 한 차원씩

확장하여 생성

• 예를 들어, 3 x 3 x 2인 3차원 배열을 만드는 방법

32

>> 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 33: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열의 생성

방법 2. 모든 2차원 배열을 먼저 생성한 뒤, cat 함수를 이용하여

생성한 배열들을 합침

• 예를 들어, 3 x 3 x 2인 3차원 배열을 만드는 방법

33

>> A = magic(3)

A =

8 1 6

3 5 7

4 9 2

>> B = [1 0 4; 3 5 6; 9 8 7]

B =

1 0 4

3 5 6

9 8 7

>> C = cat(3, A, B)

C(:,:,1) =

8 1 6

3 5 7

4 9 2

C(:,:,2) =

1 0 4

3 5 6

9 8 7

1 page

2 page

Page 34: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

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

N = ndims(A)

• 다차원 배열 A의 차원의 개수를 알려줌

[m, n, p, q, …] = size(A)

• 각 차원의 크기를 알려줌

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

실행해봅시다.

34

Page 35: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz

아래 두 3 x 3 x 2 배열을 각각 생성해 보자. 생성한 두 3차원 배열로부터 3 x 3 x

2 x 2인 4차원 배열을 생성해 보자.

35

Page 36: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

아래 두 3 x 3 x 2 배열을 각각 생성해 보자.

36

>> M1 = [5 7 8; 0 1 9; 4 3 6]

M1 =

5 7 8

0 1 9

4 3 6

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

M1(:,:,1) =

5 7 8

0 1 9

4 3 6

M1(:,:,2) =

1 0 4

3 5 6

9 8 7

Page 37: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

아래 두 3 x 3 x 2 배열을 각각 생성해 보자.

37

>> M2 = [1 0 3; 4 -1 2; 8 2 1]

M2 =

1 0 3

4 -1 2

8 2 1

>> M2(:,:,2) = [6 8 3; 4 3 6; 5 9 2]

M2(:,:,1) =

1 0 3

4 -1 2

8 2 1

M2(:,:,2) =

6 8 3

4 3 6

5 9 2

Page 38: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

생성한 두 3차원 배열로부터 3 x 3 x 2 x 2인 4차원 배열을 생성해 보자.

38

>> M1(:,:,:,2) = M2

M1(:,:,1,1) =

5 7 8

0 1 9

4 3 6

M1(:,:,2,1) =

1 0 4

3 5 6

9 8 7

M1(:,:,1,2) =

1 0 3

4 -1 2

8 2 1

M1(:,:,2,2) =

6 8 3

4 3 6

5 9 2

Page 39: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열에서 합, 평균

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

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

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

39

Page 40: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열에서 특정 영역의 값 가져오기

40

>> P1 = [5 7 8; 0 1 9; 4 3 6];

>> P2 = [1 0 4; 3 5 6; 9 8 7];

>> M = cat(3, P1, P2);

>> M(2:end, 2:end, 1)

ans =

1 9

3 6

>> M(2:3, 2:3, :)

ans(:,:,1) =

1 9

3 6

ans(:,:,2) =

5 6

8 7

Page 41: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열에서 특정 영역의 값 가져오기

41

>> M(1, :, :)

ans(:,:,1) =

5 7 8

ans(:,:,2) =

1 0 4

>> M(:,3,:)

ans(:,:,1) =

8

9

6

ans(:,:,2) =

4

6

7

Page 42: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Singleton Dimension 제거

Singleton Dimension?

• 배열 A가 있을 때, 크기가 1인 차원

• 예) 16 x 16 x 1 x 27 세번째 차원이 singleton dimension

B = squeeze(A)

• 배열 A에서 싱글톤 차원을 제거

• 배열 A와 동일한 개수의 원소를 가진 배열 B를 리턴

42

>> Y = rand(2,1,3)

Y(:,:,1) =

0.9898

0.0397

Y(:,:,2) =

0.7779

0.9733

Y(:,:,3) =

0.4151

0.3108

>> Z = squeeze(Y)

Z =

0.9898 0.7779 0.4151

0.0397 0.9733 0.3108

>> mat=repmat(1,[1,1,5])

mat(:,:,1) =

1

mat(:,:,2) =

1

mat(:,:,3) =

1

mat(:,:,4) =

1

mat(:,:,5) =

1

>> squeeze(mat)

ans =

1

1

1

1

1

Page 43: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

MRI 영상 분석의 예

43

단층 영상을 열(column)으로 잘라서 이미지를

재구성 하면, 측면 영상이 나옴

>> load mri

>> D = squeeze(D);

>> size(D)

ans =

128 128 27

>> I = D(:, 64, :);

>> size(I)

ans =

128 1 27

>> I = squeeze(I);

>> size(I)

ans =

128 27

>> imshow(I, map)

>> I2 = imresize(I, [128, 54]);

>> imshow(I2, map)

Page 44: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz

A 백화점 체인의 매장별 항목별 분기별 매출액(단위: 백만원)은 다음과 같다.

아래 데이터를 3 x 2 x 4 배열로 표현하고, 다음을 계산해보자.

• 1) 각 매장의 각 항목별 1년 총 매출액과 분기별 평균 매출액

• 2) 각 매장의 1년 매출액

• 3) 2분기, 4분기의 서울 매장 정보만 가져오기

44

서울매장 대전매장

여성의류 200 80

가전 180 50

귀금속 500 120

서울매장 대전매장

여성의류 320 120

가전 210 65

귀금속 320 85

서울매장 대전매장

여성의류 560 220

가전 250 100

귀금속 630 160

1분기

서울매장 대전매장

여성의류 340 90

가전 120 50

귀금속 230 60

4분기 3분기

2분기

Page 45: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

A 백화점 체인의 매장별 항목별 분기별 매출액(단위: 백만원)은

다음과 같다. 아래 데이터를 3 x 2 x 4 배열로 표현하고, 다음을

계산해보자.

• 1) 각 매장의 각 항목별 1년 총 매출액과 분기별 평균 매출액

• 2) 각 매장의 1년 매출액

• 3) 2분기, 4분기의 서울 매장 정보만 가져오기

45

서울매장 대전매장

여성의류 200 80

가전 180 50

귀금속 500 120

서울매장 대전매장

여성의류 320 120

가전 210 65

귀금속 320 85

서울매장 대전매장

여성의류 560 220

가전 250 100

귀금속 630 160

1분기

서울매장 대전매장

여성의류 340 90

가전 120 50

귀금속 230 60

4분기 3분기

2분기

>> Q1 = [200 80; 180 50; 500 120]

Q1 =

200 80

180 50

500 120

>> Q2 = [320 120; 210 65; 320 85]

Q2 =

320 120

210 65

320 85

>> Q3 = [560 220; 250 100; 630 160]

Q3 =

560 220

250 100

630 160

>> Q4 = [340 90; 120 50; 230 60]

Q4 =

340 90

120 50

230 60

Page 46: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

A 백화점 체인의 매장별 항목별 분기별 매출액(단위: 백만원)은

다음과 같다. 아래 데이터를 3 x 2 x 4 배열로 표현하고, 다음을

계산해보자.

• 1) 각 매장의 각 항목별 1년 총 매출액과 분기별 평균 매출액

• 2) 각 매장의 1년 매출액

• 3) 2분기, 4분기의 서울 매장 정보만 가져오기

46

서울매장 대전매장

여성의류 200 80

가전 180 50

귀금속 500 120

서울매장 대전매장

여성의류 320 120

가전 210 65

귀금속 320 85

서울매장 대전매장

여성의류 560 220

가전 250 100

귀금속 630 160

1분기

서울매장 대전매장

여성의류 340 90

가전 120 50

귀금속 230 60

4분기 3분기

2분기

>> M = cat(3, Q1, Q2, Q3, Q4)

M(:,:,1) =

200 80

180 50

500 120

M(:,:,2) =

320 120

210 65

320 85

M(:,:,3) =

560 220

250 100

630 160

M(:,:,4) =

340 90

120 50

230 60

Page 47: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz Sol.

A 백화점 체인의 매장별 항목별 분기별 매출액(단위: 백만원)은

다음과 같다. 아래 데이터를 3 x 2 x 4 배열로 표현하고, 다음을

계산해보자.

• 1) 각 매장의 각 항목별 1년 총 매출액과 분기별 평균 매출액

• 2) 각 매장의 1년 매출액

• 3) 2분기, 4분기의 서울 매장 정보만 가져오기

47

서울매장 대전매장

여성의류 200 80

가전 180 50

귀금속 500 120

서울매장 대전매장

여성의류 320 120

가전 210 65

귀금속 320 85

서울매장 대전매장

여성의류 560 220

가전 250 100

귀금속 630 160

1분기

서울매장 대전매장

여성의류 340 90

가전 120 50

귀금속 230 60

4분기 3분기

2분기

% 문제 1번 Solution

>> sum(M, 3)

ans =

1420 510

760 265

1680 425

>> mean(M, 3)

ans =

355.0000 127.5000

190.0000 66.2500

420.0000 106.2500

% 문제 2번 Solution

>> sum( sum(M, 3) )

ans =

3860 1200

% 문제 3번 Solution

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

ans(:,:,1) =

320

210

320

ans(:,:,2) =

340

120

230

% squeeze

>> Y = M(:, 1, [2 4]);

>> squeeze(Y)

ans =

320 340

210 120

320 230

Page 48: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

다차원 배열 생성 함수

ones, zeros, rand, randn

48

>> 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 49: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

MATLAB Data Types

49

Page 50: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

MATLAB Data Types

50

Page 51: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Numeric Data Types

default numeric data type은 double

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

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

51

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 52: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Numeric Data Type간 변환

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

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

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

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

52

>> A = rand(5,3);

>> sA = single(A)

>> ui8 = uint8(A)

>> ui16 = uint16(sA)

>> double(ui16)

>> …

Page 53: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Numeric Data Type 변환 하는 이유?

1. 매우 큰 배열을 만들 때, 메모리를 절약하기 위해

2. 크기가 큰 여러 배열들 간의 연산 시, 계산 속도를 빨리 하기 위해

53

>> 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 54: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

문자열

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

두 문자열의 합성

• 문자열은 1 x n 배열로 취급됨

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

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

하면 에러가 남

54

>> x = ‘hello world’

x =

hello world

>> x = ‘hello ’

>> y = ‘world’

>> z = [x y]

z =

hello world

Page 55: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

문자열

문자열의 길이

문자열 배열 생성 방법 I

• 각 문자의 길이가 동일하도록 spacebar로 맞춰준다.

55

>> 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 56: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

문자열

문자열 배열 생성 방법 II

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

56

>> 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 57: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Cell 데이터 타입

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

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

57

>> [10 'Hello World']

ans =

Hello World

실패!!

의도와 전혀 다른

예상치 못한 결과

>> A{1,1} = 10

A =

[10]

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

A =

[10] 'hello world'

올바른 결과

Page 58: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Cell 데이터 타입

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

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

58

>> 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 59: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Cell 데이터 타입

Cell 안에 Cell 넣기

Cell 안에 Cell의 원소 접근하기

59

>> 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 60: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Cell에 문자열 저장하기

60

>> 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 61: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

Quiz

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

61

Page 63: MATLAB for C/C++ Programmers - ita.kaist.ac.kr · Quiz Sol. (5min) 문제 4) 어은 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 이를 렬로 나타내고,

http://www.mathworks.co.kr/kr/help/matlab/matlab_prog/in

finity-and-nan.html#f2-86756

63