Feb 21, 2018
MATLAB Programming
시작하기에 앞서
강의 시간• 1월 6일 ~ 1월 17 (월~금)• 13:30 ~ 16:30 (총 30시간)• 50분 강의, 10분 휴식
강의 교재• 쉽게 배우는 MATLAB 입문과 활용 (2판)• 임종수의 MATLAB 7
강의 방법• 실습 위주의 강의• 컴퓨터 프로그래밍은 실제 직접 타이핑 하고 실행해보는 것이 매우 중요• 폭 넓게 다양한 기능들을 배우기보다 기본 기능을 확실히 익힐 수 있도록 강의• 개개인이 MATLAB 소프트웨어를 갖고 있지 않으므로, 숙제는 없음
연락처• 강사 김탁은 ( [email protected] )• IT 아카데미 사무국 ( [email protected], 042-350-8941~3)
2
MATLAB Programming
MATLAB 강좌에서 다루는 내용들
MATLAB 개요• MATLAB의 개발 역사, 활용 범위
MATLAB 기본 연산• 행렬 연산 (덧셈, 뺄셈, 곱셈), 각종 수학 함수
프로그래밍 작성 기법• 연산자, 데이터 타입, 프로그램 흐름 제어, M-파일 스크립트 및 M-파일 함수 작성
그래프 드로잉• 막대 그래프, 로그 그래프, 3차원 그래프
각종 수학 문제 해결 기법• 심볼릭 툴박스, 선형 대수, 방정식, 미분과 적분
데이터 분석• 데이터 정렬, 최대/최소, 평균
파일 입출력• 데이터 파일 읽기 및 저장
3
MATLAB Programming
오늘 강의 내용
MATLAB 소개 및 역사
MATLAB 인터페이스 둘러보기
MATLAB 기본 명령어
벡터/행렬 기본 연산
기본적인 수학 함수 사용법
4
MATLAB Programming
MATLAB?
MATrix LABoratory
다양한 수치 해석 문제에 대한total solution 제공
Script 언어로, 사용자의 입력에대한 결과 즉시 확인 가능
강력한 시각화 도구 제공
다양한 툴박스 지원
• Control System Toolbox• Signal Processing Toolbox• Image Processing Toolbox• Wavelet Toolbox• …
5
MATLAB Programming
MATLAB?
GUI Interface
Simulink• Model-based design tool
개발용 및 상용 보드 지원• 각종 device driver• VxWare 등
Embedded Solution 제공• MATLAB Code C, VHDL, …
6
MATLAB Programming
MATLAB 역사
Early 1970s• Linear algebra 문제 해결을 위한 LINPACK 라이브러리, eigenvalue/eigenvector를 계산하기위한 EISPACK 라이브러리 개발
Late 1970s• Cleve Moler 교수가 New Mexico 대학 재직 시학생들이 LINPACK, EISPACK 라이브러리를 Fortran을배우지 않고 사용할 수 있도록 소프트웨어 개발
1984• Cleve Moler가 Stanford 대학에서 강의. 학생이었던
Jack Little가 강의에 감명 받음. 상업적 성공 예감.• MATLAB을 C로 포팅. 라이브러리 작성. Mathworks창업
Cleve Moler
Jack Little
7
MATLAB Programming
MATLAB 역사
관련 자료
• Cleve Moler– http://www.mathworks.co.kr/company/aboutus/founders/clevemoler.ht
ml
• Jack Little– http://www.mathworks.co.kr/company/aboutus/founders/jacklittle.html
• Origins of MATLAB 비디오– http://www.mathworks.co.kr/videos/origins-of-matlab-
70332.html?type=shadow
8
MATLAB Programming
오늘날의 MATLAB
테크니컬 컴퓨팅
• 데이터 수집 – 수집 보드, 계측 장비 등 하드웨어와 통신하여 데이터 수집• 데이터 분석 – 강력한 수리 엔진으로 통계적 분석, 이미지 분석, 신호 분석 등을 쉽고 빠르게 처리• 수학적 모델링 – curve fitting, 통계학, 최적화 등 수학적 도구 제공• 알고리즘 개발 – C++/Fortran 대비 빠른 설계, 다양한 알고리즘 및 과학/수학 함수 제공• 병렬 컴퓨팅 – 대규모 데이터를 멀티코어, 클러스터, 그리드 및 클라우드 등을 통해 처리• 데스크탑 및 웹 배포 – 개발한 알고리즘 또는 프로그램을 데스트탑 또는 웹으로 배포 기능
시뮬레이션 및 모델 기반 설계
• 시스템 설계와 시뮬레이션 – 사전 정의된 라이브러리 블록으로 시스템 모델링• 이산 이벤트 시뮬레이션 – 큐잉 시스템이나 에이전트 기반 시스템 시뮬레이션• 임베디드 코드 생성 – MATLAB 코드로부터 C/C++ 코드 생성, 특정 프로세서 아키텍처를 위한
코드 최적화• HDL 코드 생성 및 검증 – VHDL, Verilog 코드 생성, 소프트웨어와 하드웨어 Cosimulation• 확인, 검증 및 테스트 – 임베디드 소프트웨어, 디지털/아날로그 하드웨어의 가상 테스트를 통한
프로젝트 문제 제거 및 개발시간 단축
9
MATLAB Programming
오늘날의 MATLAB
다양한 프로그램
• 임베디드 시스템• 제어 시스템• 디지털 신호 처리• 통신 시스템• 이미지 및 비디오 처리• FPGA 설계• 메카트로닉스• 테스트 및 측정• 계산 생명공학• 계산 금융
다양한 산업
• 항공 우주 및 국방• 자동차• 생명 과학 및 제약• 통신• 전자 및 반도체• 에너지• 금융 서비스• 산업 자동화 및 기계
단순히 수학 계산을 위한 프로그램이 아니라,산업 전반에 활용되는 강력한 도구!!
10
MATLAB Programming
MATLAB 시작하기!
11
MATLAB Programming
MATLAB 소프트웨어 구하기
KAIST 학생/직원• 학교에서 MATLAB License를 구매하였음• 학교 이메일 주소 (*@kaist.ac.kr) 이나 연구실 메일 주소(*@*.kaist.ac.kr로끝나는 메일)만 있으면 Mathworks 홈페이지에 등록 후 설치 가능
• http://circnts.kaist.ac.kr/에서 다운로드 후 설치
License가 없는 분• 아진 출판사 (http://ajin.to)에서학생용 MATLAB 구매 후 사용
• 학생임을 증명하기 위한 학생증사본 등이 필요
• MATLAB은 불법 복제 단속이심하므로 정식으로 구매하여사용하시길 바랍니다
12
MATLAB Programming
MATLAB 첫화면 (R2012b)
13
MATLAB Programming
MATLAB 인터페이스
Editor
Command Window
CurrentFolder
Workspace
CommandHistory
14
MATLAB Programming
MATLAB 인터페이스
Current Folder• 현재 작업 디렉토리의 파일 리스트를 보여줌• 파일을 더블 클릭하면 해당 파일 확장자에 따른
액션이 실행됨
Editor• M-파일 스크립트 파일을 작성하기 위한 에디터
Command Window• MATLAB 명령어를 직접 입력하여 실행
Workspace• 현재 MATLAB에서 사용되고 있는 데이터에
대한 정보를 기록• 더블 클릭하여 해당 데이터를 Excel과 같은
spread sheet 구조로 볼 수 있으며, 수정도 가능
Command History• MATLAB을 사용하는 동안 실행한 모든
명령어들의 목록을 보여줌
Editor
Command Window
CurrentFolder
Workspace
CommandHistory
15
MATLAB Programming
MATLAB 인터페이스
본인의 MATLAB 인터페이스가 다르게 나타날 때• Layout의 Default를 누름• Editor 화면은 나타나지 않음
16
MATLAB Programming
MATLAB 인터페이스 익숙해지기
[실습 1] 2 x 3 행렬을 만들고, Workspace에서 값을 바꿔봅시다.
1. Command Window에서 아래 명령어를 입력합니다.
2. Workspace에 “A”를 더블 클릭하여 아래와 같은 spread sheet가 나타나는지확인합니다.
3. 값을 변경한 다음, 우측 상단의 X 표시를 눌러 spread sheet를 끕니다. 그리고 아래 명령어를 입력하여 값이 변경되었는지 확인합니다.
>> A = [1 2 3; 4 5 6]
>> A
17
MATLAB Programming
MATLAB 인터페이스 익숙해지기
[실습 2] 방금 전에 입력한 명령어를 화살표 키를 이용하여불러봅시다.
1. 마우스로 Command Window를 선택하면 창이 활성화되어 타이틀 바의색이 진하게 되고, 프롬프트(>>)에 커서가 깜박거립니다.
2. 키보드의 위/아래 화살표 키를 눌러보세요. 이전에 입력했던 명령어가프롬프트에 나타나는지 확인합니다.
3. 화살표 키를 조작하는 대신 Command History 창에 나타난 명령어를 더블클릭하여 실행해봅시다.
18
MATLAB Programming
MATLAB 조작 기본 명령어
MATLAB 종료하기
Command Window 깨끗하게 만들기
MATLAB에서 사용하는 모든 변수와 함수 지우기
MATLAB 도움말 이용하기
>> clc
>> clear또는>> clear all
>> quit
>> help cos
또는, workspace에서변수를선택한다음마우스오른쪽버튼클릭하여 delete를선택하거나, 키보드의 delete 키를누르면해당변수삭제
19
MATLAB Programming
변수 할당 및 수식 연산
변수 할당• 다른 프로그래밍 언어(C/JAVA 등)에서 변수 할당 방법과 동일하게
= 연산자 사용하여 변수 할당
• = 는 “동치”가 아니라, 오른쪽의 값을 왼쪽의 변수에 “할당”하라는 뜻!
변수 할당 예제
>> 변수명(variable) = 수식(expression)
>> A = 5 * 3A =
15
>> a = A * 10a =
150
주의할 점!
• 변수명은무조건영문자로시작해야한다. 숫자, 특수문자, 언더바등으로시작할수없다.
• MATLAB에서는대소문자를다르게처리한다.
• 따라서변수명 a와변수명 A는서로다른변수이다.
20
MATLAB Programming
변수 할당 및 수식 연산
변수명 없이 수식만 쓰는 경우는?
• MATLAB이 자동으로 계산 결과를 ans 변수에 할당함
• ans 변수는 일반 변수처럼 사용 가능
>> 5 * 3 + 6
>> 5 * 3 + 6ans =
26
>> ans * 3ans =
63
21
MATLAB Programming
수식 표현에 익숙해지기
다음 수식을 MATLAB 수식 표현으로 기술하기
• 𝜋𝜋 = 3.141592 …는 pi 로 기술• 자연상수 e는 exp(1)로 기술. 𝑒𝑒𝑥𝑥는 exp(x)로 기술• i와 j는 복소수(complex number)의 허수를 의미
8 +6 × 1 + 5
243 × 𝜋𝜋 × 103
𝑒𝑒 3 + 𝜋𝜋 × 103
𝑒𝑒𝜋𝜋 × −1
>> 8 + (6 * (1 + sqrt(5))) / 2
>> 4 / 3 * pi * 10^3
>> exp(sqrt(3)) + pi * 10^3
>> exp(pi * sqrt(-1)) >> exp(pi * i)or
22
MATLAB Programming
변수 할당 및 수식 표현에 익숙해지기
[실습 3] x = 5 일 때, 다음 수식들을 계산해 봅시다.
sin(3𝑥𝑥)(𝑥𝑥 − 3)(𝑥𝑥 + 3)
−3 sin 𝑥𝑥 𝑐𝑐𝑐𝑐𝑐𝑐2 𝑥𝑥 − 𝑐𝑐𝑠𝑠𝑠𝑠3(𝑥𝑥)
𝑥𝑥2 − 2
𝑒𝑒𝑖𝑖𝑥𝑥 + 𝑒𝑒−𝑖𝑖𝑥𝑥
2𝑒𝑒𝑖𝑖𝑥𝑥 − 𝑒𝑒−𝑖𝑖𝑥𝑥
2𝑠𝑠
23
MATLAB Programming
변수 할당 및 수식 표현에 익숙해지기
[실습 3] x = 5 일 때, 다음 수식들을 계산해 봅시다.
sin(3𝑥𝑥)(𝑥𝑥 − 3)(𝑥𝑥 + 3)
−3 sin 𝑥𝑥 𝑐𝑐𝑐𝑐𝑐𝑐2 𝑥𝑥 − 𝑐𝑐𝑠𝑠𝑠𝑠3(𝑥𝑥)
𝑥𝑥2 − 2
>> x = 5;>> sin(3*x)/((x-3)*(x+3)) - (3*sin(x)*cos(x)^2-sin(x)^3)/(x^2-2)ans =
0.0124
𝑒𝑒𝑖𝑖𝑥𝑥 + 𝑒𝑒−𝑖𝑖𝑥𝑥
2𝑒𝑒𝑖𝑖𝑥𝑥 − 𝑒𝑒−𝑖𝑖𝑥𝑥
2𝑠𝑠
>> x = 5;>> (exp(i*x)+exp(-i*x))/2 * (exp(i*x)-exp(-i*x))/(2*i)ans =
-0.2720
24
MATLAB Programming
벡터 (vector)
벡터란?• 정의: 크기와 방향을 갖는 물리적인 양• 표현: 순서를 가지는 어떠한 수들의 나열
MATLAB에서 벡터 기술하기• 괄호[ ] 사이에 숫자를 나열• 숫자 간 구분은 공백(space) 또는 컴마(,)
행(row)벡터 & 열(column)벡터• 열 벡터는 숫자 사이에 세미콜론(;)을 사용하여 생성
>> u = [-3 2 4 8 11]u =
-3 2 4 8 11
>> u = [-3, 2, 4, 8, 11]u =
-3 2 4 8 11or
>> u = [1; 2; 3]u =
123
25
MATLAB Programming
벡터 (vector)
행 벡터 ↔ 열 벡터 변환하기• 괄호 끝에 프라임 기호(‘) 붙이기
벡터 원소 참조하기
>> u = [-3 2 4]u =
-3 2 4>> u’u =
-324
>> u = [-3; 2; 4]u =
-324
>> u’u =
-3 2 4
>> u(1)ans =
-3>> u(2)ans =
2>> u(3)ans =
4
>> u(4)Index exceeds matrix dimensions.
• 벡터의 시작 인덱스는 1• 벡터 범위를 벗어난 원소 접근시
26
MATLAB Programming
순차적인 행벡터 생성
[1, 2, 3, …, 100] 인 행벡터를 생성하는 방법
• 방법 I: 숫자들을 일일이 기술
– 손도 아프고.. 시간도 없고.. 만약 중간에 입력하다가 틀리면??
• 방법 II: 콜론 연산자 (colon operator) 사용
– 쉽고 빠르게 원하는 행벡터 생성!!
• 방법 III. linspace 함수 사용
>> u = [1 2 3 4 5 … 100]
>> u = 1:100
>> u = linspace(1,100,100)
27
MATLAB Programming
순차적인 행벡터 생성
콜론 연산자 사용법
• 의미: “시작값” 부터 “종료값” 까지 “증가/감소분”씩 증가/감소하는 수들의 벡터• 증가값 생략시 증가값은 1로 설정
다양한 순차적 행벡터 생성 예
• 예 1) -5부터 2까지 정수로 구성된 순차적 행벡터를 생성하라
• 예 2) 2부터 -5까지 정수로 구성된 순차적 행벡터를 생성하라
• 예 3) 0부터 1까지 0.01씩 증가하는 순차적 행벡터를 생성하라
>> u = 시작값:증가/감소분:종료값
>> u = -5:2 or >> u = -5:1:2
>> u = 2:-1:-5
>> u = 0:0.01:1
28
MATLAB Programming
순차적인 행벡터 생성
linspace• 간격이 일정한 수들의 벡터를 생성
• 생성할 값 개수 생략시 100으로 설정
순차적 행벡터 생성 예
• 예 1) -1부터 1까지 간격이 동일한 9개의 값을 생성하라
• 예 2) 1부터 -1까지 역순으로 간격이 동일한 5개의 값을 생성하라
>> u = linspace(시작값, 종료값, 생성할 값 개수)
>> u = linspace(-1, 1, 9)ans =
-1.0000 -0.7500 -0.5000 -0.2500 0 0.2500 0.5000 0.7500 1.0000
>> u = linspace(1, -1, 5)ans =
1.0000 0.5000 0 -0.5000 -1.0000
29
MATLAB Programming
단일 벡터 연산
각종 수학 함수• 벡터의 각 원소에 대해 적용
• 벡터의 각 원소의 n-제곱근
>> a = [1 2 3];>> exp(a)ans =
2.7183 7.3891 20.0855
>> log(a)ans =
0 0.6931 1.0986
>> sqrt(a)ans =
1.0000 1.4142 1.7321
>> a = [1 2 3]>> a .^ 2ans =
1 4 9
주의할 점!
• n-제곱근을의미하는 ^ 기호는스칼라에대해정의
• 따라서벡터에대해 a^3와같이사용하면에러
>> a = [-0.4 1.2 0.6 -1.3]a =
-0.4000 1.2000 0.6000 -1.3000
>> abs(a)ans =
0.4000 1.2000 0.6000 1.3000
>> floor(a)ans =
-1 1 0 -2
>> ceil(a)ans =
0 2 1 -1
절대값
올림
내림
30
MATLAB Programming
벡터와 스칼라 연산
• 벡터 𝐴𝐴 = (𝑎𝑎1,𝑎𝑎2 … , 𝑎𝑎𝑛𝑛)와, 스칼라 변수 c가 있을 때,– 𝐴𝐴 + 𝑐𝑐 = 𝑐𝑐 + 𝐴𝐴 = (𝑐𝑐 + 𝑎𝑎1, 𝑐𝑐 + 𝑎𝑎2 … , 𝑐𝑐 + 𝑎𝑎𝑛𝑛)– 𝐴𝐴 − 𝑐𝑐 = (𝑎𝑎1 − 𝑐𝑐, 𝑎𝑎2 − 𝑐𝑐… ,𝑎𝑎𝑛𝑛 − 𝑐𝑐)– 𝑐𝑐 − 𝐴𝐴 = (𝑐𝑐 − 𝑎𝑎1, 𝑐𝑐 − 𝑎𝑎2 … , 𝑐𝑐 − 𝑎𝑎𝑛𝑛)– 𝐴𝐴 ∗ 𝑐𝑐 = 𝑐𝑐 ∗ 𝐴𝐴 = (𝑐𝑐 ∗ 𝑎𝑎1, 𝑐𝑐 ∗ 𝑎𝑎2 … , 𝑐𝑐 ∗ 𝑎𝑎𝑛𝑛)– 𝐴𝐴/𝑐𝑐 = (𝑎𝑎1/𝑐𝑐,𝑎𝑎2/𝑐𝑐… ,𝑎𝑎𝑛𝑛/𝑐𝑐)– 𝑐𝑐 ./𝐴𝐴 = (𝑐𝑐/𝑎𝑎1, 𝑐𝑐/𝑎𝑎2 … , 𝑐𝑐/𝑎𝑎𝑛𝑛)
>> a = [1 2 3 4];>> c = 5;
>> a + cans =
6 7 8 9
>> a – cans =
-4 -3 -2 -1
>> c – aans =
4 3 2 1
>> a*cans =
5 10 15 20
>> c*aans =
5 10 15 20
>> a/cans =
0.2000 0.4000 0.6000 0.8000
>> c./aans =
5.0000 2.5000 1.6667 1.2500
31
MATLAB Programming
벡터 간 연산
다음 두 벡터가 있을 때,
두 벡터의 합과 차
두 벡터의 내적
두 벡터의 외적
>> x = [-1 0 1]>> y = [3 4 5]
>> dot(x,y)ans =
2
>> cross(x,y)ans =
-4 8 4
𝐱𝐱′𝐲𝐲 =−𝟏𝟏𝟎𝟎𝟏𝟏
𝟑𝟑 𝟒𝟒 𝟓𝟓
두 벡터의 각 원소간 곱셈
두 벡터의 각 원소간 나눗셈
>> x’*yans =
-3 4 -50 0 03 4 5
>> x+yans =
2 4 6>> x-yans =
-4 -4 -4>> x .* yans =
-3 0 5
>> x ./ yans =
-0.3333 0 0.2000
32
MATLAB Programming
벡터와 통계량
벡터가 주어졌을 때, 벡터의 통계량을 계산• 통계량: 최대값, 최소값, 전체 합, 평균, 분산, 표준편차 등
>> x = [5 3 8 4];>> min(x)ans =
3
>> max(x)ans =
8
>> sum(x)ans =
20
>> mean(x)ans =
5
>> var(x)ans =
4.6667
>> std(x)ans =
2.1602
최소값
최대값
전체 합
평균
분산
표준편차
33
MATLAB Programming
벡터 사용에 익숙해지기
[실습 4] 대전 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 여러가지 값들을 구해봅시다.• 6학년 1반의 성적
• 1) 각 과목 별 평균• 2) 각 학생 별 총점 및 평균• 3) 각 학생 별 최고점을 받은 과목의 점수• 4) 반 전체 점수 합계 및 평균
국어 수학 과학 체육
영희 98 83 89 89
철수 89 92 97 87
민수 78 86 91 96
34
MATLAB Programming
벡터 사용에 익숙해지기
[실습 4] 대전 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 여러 가지값들을 구해봅시다.
• 1) 각 과목 별 평균
• 2) 각 학생 별 총점 및 평균
• 3) 각 학생 별 최고점을 받은 과목의 점수
• 4) 반 전체 점수 합계 및 평균
국어 수학 과학 체육
영희 98 83 89 89
철수 89 92 97 87
민수 78 86 91 96
>> s1 = [98 83 89 89];>> s2 = [89 92 97 87];>> s3 = [78 86 91 96];
>> (s1+s2+s3)/3
>> sum(s1)>> mean(s1)…
>> sum(s1+s2+s3)>> sum(s1+s2+s3) / 12>> (mean(s1)+mean(s2)+mean(s3))/3
>> max(s1)
35
MATLAB Programming
벡터 자유자재로 다루기
벡터의 일부 원소들을 가져오는 방법• 벡터 x가 아래와 같이 10개의 원소를 가진다고 하자
• 3~6번째에 위치한 (연속된) 원소들만을 가져오고 싶을 때
• 1, 5, 7번째에 위치한 (떨어진) 원소들만을 뽑아내고 싶을 때
• 3, 7~9 번째에 위치한 원소들을 뽑아내고 싶을 때
>> x = linspace(1,100,10)x =
1 12 23 34 45 56 67 78 89 100
>> x(3:6)x =
23 34 45 56
>> x([1 5 7])x =
1 45 67
Colon Operator
>> x([3 7:9])x =
23 67 78 89
36
MATLAB Programming
벡터 자유자재로 다루기
벡터의 일부 원소들을 변경하는 방법• 벡터 x가 아래와 같이 10개의 원소를 가진다고 하자
• 3번째에 위치한 원소의 값을 10으로 바꾸고 싶을 때
• 5:7번째에 위치한 원소들의 값을 -5로 바꾸고 싶을 때
• 3, 7~9 번째에 위치한 원소들의 값을 105로 바꾸고 싶을 때
• 6~8번째 위치한 원소들의 값을 각각 100, 200, 300 으로 바꾸고 싶을 때
>> x = linspace(1,100,10)x =
1 12 23 34 45 56 67 78 89 100
>> x(3) = 10x =
1 12 10 34 45 56 67 78 89 100
>> x(5:7) = -5x =
1 12 10 34 -5 -5 -5 78 89 100
>> x([3 7:9]) = 105x =
1 12 105 34 -5 -5 105 105 105 100
>> x(6:8) = [100 200 300]x =
1 12 105 34 -5 100 200 300 105 100
주의할 점!
• 들어갈자리의개수와, 바꿀값의개수가동일해야함
37
MATLAB Programming
벡터 자유자재로 다루기
[실습 5] 1부터 10까지 10개의 연속된 숫자를 가진 벡터 x가 있을 때, 벡터 x의 짝수를 벡터 x의 최대값에서 자기 자신을 뺀 값으로 대체하여봅시다.
• 즉,• x = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 벡터가 주어졌을 때, 2는 10-2, 4는 10-4,…
10은 10-10 을 계산하여, 최종적으로 (1, 8, 3, 6, 5, 4, 7, 2, 9, 0)이 결과로나오게 만들어 봅시다.
• 힌트: Colon operator, max 함수, 스칼라와 벡터의 차, 벡터의 일부 원소 변경
38
MATLAB Programming
벡터 자유자재로 다루기
[실습 5] 1부터 10까지 10개의 연속된 숫자를 가진 벡터 x가 있을 때, 벡터 x의 짝수를 벡터 x의 최대값에서 자기 자신을 뺀 값으로 대체하여봅시다.
• 즉,• x = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 벡터가 주어졌을 때, 2는 10-2, 4는 10-4,…
10은 10-10 을 계산하여, 최종적으로 (1, 8, 3, 6, 5, 4, 7, 2, 9, 0)이 결과로나오게 만들어 봅시다.
• 힌트: Colon operator, max 함수, 스칼라와 벡터의 차, 벡터의 일부 원소 변경
>> x = 1:10x =
1 2 3 4 5 6 7 8 9 10>> x(2:2:10) = max(x) – x(2:2:10)x =
1 8 3 6 5 4 7 2 9 0
39
MATLAB Programming
벡터 자유자재로 다루기
여러 행벡터 합치기• x = [1 2 3], y = [4 5], z = [6 7] 일 때, 직접 타이핑 하지 않고 쉽고 빠르게 [1 2 3 4 5 6
7] 벡터를 생성하는 방법은?
• [실습 6] MATLAB 프롬프트에 [x y x] 를 입력했을 때 어떠한 결과가 나오는지확인해봅시다. [x y’]를 입력했을 때 어떠한 결과가 나오는지 확인해 봅시다.
여러 열벡터 합치기• 세미콜론을 사용하면, 열벡터를 열(column) 방향으로 병합한다.
>> x = [1 2 3];>> y = [4 5];>> z = [6 7];>> [x y z]ans =
1 2 3 4 5 6 7
주의할 점!
• 벡터를합칠때, 둘다열벡터이거나행벡터이어야함
>> x = [1; 2; 3];>> y = [4; 5];>> [x; y]ans =
12345
40
MATLAB Programming
행렬 다루기
41
MATLAB Programming
행렬 (Matrix)
행렬이란?• 숫자를 네모꼴로 배열한 것
• 벡터와 행렬과의 관계– 행벡터: 1 x n 행렬– 열벡터: n x 1 행렬
• 지금까지배운벡터의연산에관한내용들이사실은모두행렬연산
42
MATLAB Programming
2차원 행렬 만들기
행 순으로 원소를 나열하고, 다음 행의 원소를 나열하기 전 세미콜론(;)을 적어줌
• 𝑴𝑴 = 𝟐𝟐 𝟏𝟏 𝟒𝟒𝟔𝟔 𝟑𝟑 𝟓𝟓 행렬 생성하기 (2 x 3 행렬)
• 𝑴𝑴 =𝟐𝟐 𝟑𝟑𝟒𝟒 𝟔𝟔𝟓𝟓 𝟏𝟏
행렬 생성하기 (3 x 2 행렬)
>> M = [2 1 4; 6 3 5]
M =2 1 46 3 5
>> M = [2 3; 4 6; 5 1]
M =2 34 65 1
43
MATLAB Programming
다양한 2차원 행렬 생성 방법
행렬 𝑴𝑴 =𝟐𝟐 𝟏𝟏 𝟒𝟒𝟔𝟔𝟕𝟕
𝟑𝟑𝟑𝟑
𝟓𝟓𝟗𝟗
를 생성
<방법 1>>> M = [2 1 4]M =
2 1 4
>> M = [M; 6 3 5]M =
2 1 46 3 5
>> M = [A; 7 3 9]M =
2 1 46 3 57 3 9
<방법 2>>> M = [ [2 1 4]; [6 3 5]; [7 3 9] ]
<방법 3>>> r1 = [2 1 4]; >> r2 = [6 3 5];>> r3 = [7 3 9];>> M = [ r1; r2; r3 ] 44
MATLAB Programming
특수 목적의 행렬 생성 함수
zeros, ones, eye, rand, randn
[실습 7] 아래 행렬 생성 함수들을 직접 입력해보고, m과 n값을바꿔가며 행렬을 다양하게 생성해봅시다.
>> zeros(4, 3)
>> ones(5, 3)
>> eye(6)
>> rand(3,5)
>> randn(5,7)
zeros( m, n ) 모든원소가 0인 m x n 행렬생성
ones( m, n ) 모든원소가 1인 m x n 행렬생성
eye( m ) 대각선원소가 1로구성된 m x m 정방행렬생성
rand( m, n ) 0~1 사이의 uniform 분포를가지는 m x n 행렬생성
randn( m, n ) 0~1 사이의 normal 분포를가지는 m x n 행렬생성
magic( m ) 가로의합과세로의합이모두동일한 m x m 정방행렬
45
MATLAB Programming
행렬 원소에 접근하기
행렬 원소는 변수명(열번호,행번호)로 접근 가능
• 𝑀𝑀 =1 2 3 45 6 7 89 10 11 12
의 경우,
– M(1, 1) = 1, M(2,3) = 7, M(3,2) = 10, …
– 각 인덱스는 1부터 시작
>> M = [1 2 3 4; 5 6 7 8; 9 10 11 12]M =
1 2 3 45 6 7 89 10 11 12
>> M(2,3)ans =
7
46
MATLAB Programming
행렬의 여러 원소에 접근하기
Colon Operator를 이용하여 행렬의 일부 원소 그룹에 접근 가능
• 𝑀𝑀 =1 2 3 45 6 7 89 10 11 12
행렬이 주어져 있을 때,
M 또는 M( :, : ) 행렬 M 전체를가리킴 (콜론( : )은 “전체”를 의미
M( :, k ) 행렬 M의 k번째열의모든원소를가져옴
M( k, : ) 행렬 M의 k번째행의모든원소를가져옴
M( m:n, : ) 행렬 M의 m~n번째행의모든원소를가져옴
M( :, m:n ) 행렬 M의 m~n번째열의모든원소를가져옴
M( m:n, p:q ) 행렬 M의 m~n번째행, p~q번째열에해당하는원소를가져옴
47
MATLAB Programming
“end” 인덱스 기호 사용한 행렬 원소 접근
“end”는 마지막 행 또는 마지막 열을 가리키는 인덱스
• 𝑀𝑀 =1 2 3 45 6 7 89 10 11 12
행렬이 주어져 있을 때,
M( :, end ) 행렬 M의마지막열의모든원소를가져옴
M( end, : ) 행렬 M의마지막행의모든원소를가져옴
M( k, end ) 행렬 M의 k번째행, 마지막열의원소를가져옴
M( end, k ) 행렬 M의마지막행, k번째열의원소를가져옴
M( :, m:end ) 행렬 M의 m번째~마지막 열의모든원소를가져옴
M( m:end, : ) 행렬 M의 m번째~마지막 행의모든원소를가져옴
48
MATLAB Programming
행렬을 배열처럼 접근하기
n차원 행렬을 1개의 접근 인덱스로 접근 가능
• 𝑀𝑀 =1 2 3 45 6 7 89 10 11 12
• M(1) = 1, M(2) = 5, M(3) = 9, …, M(10) = 4, M(11) = 8, M(12) = 12• M(end) = 12
행렬의 벡터 변환• 콜론(:)을 사용하면 행렬의 전체 원소가 선택됨• 위와 동일한 방법으로 행렬의 개별 원소들이 순차적으로 접근되고, 이들원소들을 벡터로 나열
>> M( : )M =
159 2610...
49
MATLAB Programming
행렬 원소 가져오기
• 𝑀𝑀 =1 4 72 5 83 6 9
10 1311 1412 15
• 행렬 M에서 1번째, 3번째 열들만을 가져오기
• 동일 열들을 여러 번 가져오기
>> M = [1 4 7 10 13; 2 5 8 11 14; 3 6 9 12 15];
>> M(: , [1,3])ans =
1 72 83 9
>> M = [1 4 7 10 13; 2 5 8 11 14; 3 6 9 12 15];
>> M(: , [1,3, 1, 3])ans =
1 7 1 72 8 2 83 9 3 9
50
MATLAB Programming
행렬 원소 가져오기
• 𝑀𝑀 =1 4 72 5 83 6 9
10 1311 1412 15
• Bit Mask를 이용하여 선택된 열 가져오기
>> M = [1 4 7 10 13; 2 5 8 11 14; 3 6 9 12 15];>> B = logical([ 1 0 0 1 0 ]);>> M(: , B)ans =
1 102 113 12
𝑀𝑀 =1 4 72 5 83 6 9
10 1311 1412 15
𝐵𝐵 = 1 0 0 1 0
51
MATLAB Programming
행렬 원소 가져오기
[실습 8] 10 x 10 magic 행렬을 생성에서 짝수 행, 짝수 열인 원소들을가져와서 5 x 5 행렬을 만들어 보세요.
M =
92 99 1 8 15 67 74 51 58 4098 80 7 14 16 73 55 57 64 414 81 88 20 22 54 56 63 70 4785 87 19 21 3 60 62 69 71 2886 93 25 2 9 61 68 75 52 3417 24 76 83 90 42 49 26 33 6523 5 82 89 91 48 30 32 39 6679 6 13 95 97 29 31 38 45 7210 12 94 96 78 35 37 44 46 5311 18 100 77 84 36 43 50 27 59
ans =
80 14 73 57 4187 21 60 69 2824 83 42 26 656 95 29 38 7218 77 36 50 59
52
MATLAB Programming
행렬 원소 가져오기
[실습 8] 10 x 10 magic 행렬을 생성에서 짝수 행, 짝수 열인 원소들을가져와서 5 x 5 행렬을 만들어 보세요.
M =
92 99 1 8 15 67 74 51 58 4098 80 7 14 16 73 55 57 64 414 81 88 20 22 54 56 63 70 4785 87 19 21 3 60 62 69 71 2886 93 25 2 9 61 68 75 52 3417 24 76 83 90 42 49 26 33 6523 5 82 89 91 48 30 32 39 6679 6 13 95 97 29 31 38 45 7210 12 94 96 78 35 37 44 46 5311 18 100 77 84 36 43 50 27 59
ans =
80 14 73 57 4187 21 60 69 2824 83 42 26 656 95 29 38 7218 77 36 50 59
>> M = magic( 10 );
>> M(2:2:end, 2:2:end)
53
MATLAB Programming
행렬 원소 고치기
𝑀𝑀 =1 4 72 5 83 6 9
10 1311 1412 15
• 선택된 행과 열들을 우변의 스칼라 값으로 대체– M(행인덱스:열인덱스) = 스칼라
• 선택된 행과 열을 우변의 행렬 값으로 대체– M(행 인덱스:열 인덱스 = 행렬
>> M = [1 4 7 10 13; 2 5 8 11 14; 3 6 9 12 15];
>> M( [1,3], [2,4] ) = -1
M =1 -1 7 -1 132 5 8 11 143 -1 9 -1 15
>> M( [1,3], [2,4] ) = [-5, -6; -7, -8];
M =1 -5 7 -6 132 5 8 11 143 -7 9 -8 15 54
MATLAB Programming
행렬 원소 가져오기
[실습 9] 10 x 10 magic 행렬을 생성에서 짝수 행, 홀수 열인 원소들의값을 5 x 5 magic 행렬 값으로 대체하세요.
M =
92 99 1 8 15 67 74 51 58 4098 80 7 14 16 73 55 57 64 414 81 88 20 22 54 56 63 70 4785 87 19 21 3 60 62 69 71 2886 93 25 2 9 61 68 75 52 3417 24 76 83 90 42 49 26 33 6523 5 82 89 91 48 30 32 39 6679 6 13 95 97 29 31 38 45 7210 12 94 96 78 35 37 44 46 5311 18 100 77 84 36 43 50 27 59
M =
92 99 1 8 15 67 74 51 58 4017 80 24 14 1 73 8 57 15 414 81 88 20 22 54 56 63 70 4723 87 5 21 7 60 14 69 16 2886 93 25 2 9 61 68 75 52 344 24 6 83 13 42 20 26 22 6523 5 82 89 91 48 30 32 39 6610 6 12 95 19 29 21 38 3 7210 12 94 96 78 35 37 44 46 5311 18 18 77 25 36 2 50 9 59
55
MATLAB Programming
행렬 원소 가져오기
[실습 9] 10 x 10 magic 행렬을 생성에서 짝수 행, 홀수 열인 원소들의값을 5 x 5 magic 행렬 값으로 대체하세요.
M =
92 99 1 8 15 67 74 51 58 4098 80 7 14 16 73 55 57 64 414 81 88 20 22 54 56 63 70 4785 87 19 21 3 60 62 69 71 2886 93 25 2 9 61 68 75 52 3417 24 76 83 90 42 49 26 33 6523 5 82 89 91 48 30 32 39 6679 6 13 95 97 29 31 38 45 7210 12 94 96 78 35 37 44 46 5311 18 100 77 84 36 43 50 27 59
M =
92 99 1 8 15 67 74 51 58 4017 80 24 14 1 73 8 57 15 414 81 88 20 22 54 56 63 70 4723 87 5 21 7 60 14 69 16 2886 93 25 2 9 61 68 75 52 344 24 6 83 13 42 20 26 22 6523 5 82 89 91 48 30 32 39 6610 6 12 95 19 29 21 38 3 7210 12 94 96 78 35 37 44 46 5311 18 18 77 25 36 2 50 9 59
>> M = magic( 10 );
>> M(2:2:end, 1:2:end) = magic(5)
56
MATLAB Programming
행렬 연산하기
각종 수학 함수• 행렬의 각 원소에 대해 적용
>> M = magic( 3 );>> exp(M)ans =
1.0e+03 *
2.9810 0.0027 0.40340.0201 0.1484 1.09660.0546 8.1031 0.0074
>> log(M)ans =
2.0794 0 1.79181.0986 1.6094 1.94591.3863 2.1972 0.6931
>> sqrt(M)ans =
2.8284 1.0000 2.44951.7321 2.2361 2.64582.0000 3.0000 1.4142
>> M = [-1.3 2.4; 4.3 -2.9]M =
-1.3000 2.40004.3000 -2.9000
>> abs(M)ans =
1.3000 2.40004.3000 2.9000
>> floor(M)ans =
-2 24 -3
>> ceil(M)ans =
-1 35 -2
절대값
올림
내림
57
MATLAB Programming
행렬과 스칼라 연산
• m x n 행렬 𝑀𝑀, 스칼라 변수 c가 있을 때,– 𝑀𝑀 + 𝑐𝑐 = 𝑐𝑐 + 𝑀𝑀– 𝑀𝑀 − 𝑐𝑐– 𝑐𝑐 − 𝑀𝑀– 𝑀𝑀 ∗ 𝑐𝑐 = 𝑐𝑐 ∗ 𝑀𝑀– 𝑀𝑀/𝑐𝑐– 𝑀𝑀 ./𝑐𝑐
>> M = magic(2);>> c = 5;
>> M + cans =
6 89 7
>> M – cans =
-4 -2-1 -3
>> c – aans =
4 21 3
>> a*cans =
5 1520 10
>> c*aans =
5 1520 10
>> a/cans =
0.2000 0.60000.8000 0.4000
>> c./aans =
5.0000 1.66671.2500 2.5000
58
MATLAB Programming
행렬 간 연산
차원이 동일한 두 벡터가 있을 때,
두 행렬의 합과 차
>> x = [1 2 3; 4 5 6]>> y = [0 1 -1; 3 2 4]
두 행렬의 각 원소간 곱셈
두 행렬의 각 원소간 나눗셈
행렬의 n-제곱근
>> x+yans =
1 3 27 7 10
>> x-yans =
1 1 41 3 2
>> x .* yans =
0 2 -312 10 24
>> x ./ yans =
Inf 2.0000 -3.00001.3333 2.5000 1.5000
>> x .^ 3ans =
1 8 2764 125 216
59
MATLAB Programming
행렬 연산하기
n x d 행렬과, d x m 행렬의 곱
• 𝐴𝐴 = 1 2 34 5 6 , 𝐵𝐵 =
3 25 61 3
>> A = [1 2 3; 4 5 6];>> B = [3 2; 5 6; 1 3];>> A * B
ans =
16 2343 56
60
MATLAB Programming
행렬 연산하기
[실습 10] 다음 방정식을 행렬로 표현하고, 방정식의 근을 행렬 연산을통해 계산해봅시다.
• -3x1 – x3 = -3• 2x1 + 5x2 – 7x3 = 1• -x1 + 4x2 + 8x3 = 2
• 힌트– 방정식의 근 구하는 방법
• Ax = b A-1Ax = x = A-1b
– m x m 정방 행렬이 M일 때, M의 역행렬을 구하는 함수: inv(M)
61
MATLAB Programming
행렬 연산하기
[실습 10] 다음 방정식을 행렬로 표현하고, 방정식의 근을 행렬 연산을통해 계산해봅시다.
• -3x1 – x3 = -3• 2x1 + 5x2 – 7x3 = 1• -x1 + 4x2 + 8x3 = 2
>> A = [-3 0 -1; 2 5 -7; -1 4 8]A =
-3 0 -12 5 -7-1 4 8
>> b = [-3 1 2]‘b =
-312
>> x = inv(A) * bx =
0.91240.20280.2627
62
MATLAB Programming
행렬과 통계량
행렬이 주어졌을 때, 행렬의 통계량을 계산
• 행렬의 열 단위로 계산
>> M = [5 3 8; 2 4 3];>> min(M)ans =
2 3 3
>> max(M)ans =
5 4 8
>> sum(M)ans =
7 7 11
>> mean(M)ans =
3.5000 3.5000 5.5000
>> var(M)ans =
4.5000 0.5000 12.5000
>> std(M)ans =
2.1213 0.7071 3.5355
최소값
최대값
전체 합
평균
분산
표준편차
63
MATLAB Programming
행렬 사용에 익숙해지기
[실습 11] 대전 초등학교 6학년 1반의 성적이 다음과 같다고 할 때, 여러 가지값들을 구해봅시다.
• 6학년 1반의 성적
• 1) 각 과목 별 평균, 분산, 최고점 및 최저점• 2) 각 학생 별 총점 및 평균• 3) 각 학생 별 최고점을 받은 과목의 점수• 4) 반 전체 점수 합계 및 평균
[실습 12] 6학년 1반의 성적이 행렬로 주어져 있을 때, 채점 오류로 모든 학생의체육 점수를 3점 올리고, 과학 점수를 2점씩 내리는 작업을 행렬 연산을 통해수행해봅시다.
국어 수학 과학 체육
영희 98 83 89 89
철수 89 92 97 87
민수 78 86 91 96
64