
score = 85;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
else
grade = 'F';
end % ← 반드시 end로 닫기!
disp(grade) % 'B'
구조:
if 조건1
실행문
elseif 조건2 ← 0개 이상, 원하는 만큼
실행문
else ← 생략 가능
실행문
end ← 필수!
C/C++과 다르게
(1) 조건을 적을때 괄호 안에 적지 않아도된다 (적어도 무방하다).
(2) else if가 아니라 elseif 로 사용한다
(3) 중괄호가 없고 마지막에 end로 조건문을 닫아준다.
age = 22;
is_student = true;
% ── 중첩 ──
if age >= 20
if is_student
disp('20세 이상 학생')
end
end
% ── 논리 연산으로 한 줄로 ──
if age >= 20 && is_student
disp('20세 이상 학생') % 이게 더 깔끔!
end
day = 'Mon';
switch day
case 'Mon'
disp('월요일')
case {'Tue', 'Wed', 'Thu'} % ← 여러 값 매칭 가능!
disp('화~목요일')
case 'Fri'
disp('금요일')
otherwise
disp('주말')
end
구조:
switch 변수
case 값1
실행문
case {값2, 값3} ← 여러 값 매칭 가능!
실행문
otherwise ← else 역할
실행문
end
C++과 다른 점:
(1) break 필요 없음! 자동으로 하나만 실행되고 빠져나감
(2) 문자열 비교 가능 (C++은 switch에서 문자열 못 씀)
(3) 여러 값 매칭 가능: case {값1, 값2}
% ── 기본 형태 ──
for i = 1:5
fprintf('i = %d\n', i);
end
% i = 1
% i = 2
% ...
% i = 5
% ── step 지정 ──
for i = 0:2:10
fprintf('%d ', i); % 0 2 4 6 8 10
end
% ── 역순 ──
for i = 5:-1:1
fprintf('%d ', i); % 5 4 3 2 1
end
% ── 벡터 직접 지정 ──
for val = [3 7 11 99]
fprintf('%d ', val); % 3 7 11 99
end
구조:
for 변수 = 벡터(또는 범위)
실행문
end
변수가 벡터의 원소를 하나씩 받으며 반복
A = [1 2 3; 4 5 6];
% 행렬을 넣으면 "열 벡터" 단위로 순회!
for col = A
disp(col) % 1번째: [1;4], 2번째: [2;5], 3번째: [3;6]
end
% ── 기본 형태 ──
n = 1;
while n <= 5
fprintf('%d ', n); % 1 2 3 4 5
n = n + 1; % 업데이트 빠뜨리면 무한루프!
end
% ── 실전 예시: 수렴할 때까지 반복 ──
x = 100;
iter = 0;
while x > 1
x = x / 2;
iter = iter + 1;
end
fprintf('%.4f에 도달, %d번 반복\n', x, iter);
% 0.7813에 도달, 7번 반복
% ── break: 반복문 즉시 탈출 ──
for i = 1:100
if i > 5
break; % i=6일 때 탈출
end
fprintf('%d ', i);
end
% 1 2 3 4 5
% ── continue: 이번 반복만 건너뛰기 ──
for i = 1:10
if mod(i, 3) == 0
continue; % 3의 배수 건너뜀
end
fprintf('%d ', i);
end
% 1 2 4 5 7 8 10
MATLAB에서 가장 중요한 코딩 스타일로,
for문대신행렬/벡터연산으로 대체하면 코드가 짧고, 빠르다.
for문을 쓰기 전에 "벡터화할 수 없나?"를 먼저 생각해보는 것이 중요하다.
% ════════════════════════════════════════
% 예시 1: 각 원소 제곱
% ════════════════════════════════════════
% ❌ for문 (느리고 김)
x = 1:1000;
y = zeros(1, 1000);
for i = 1:1000
y(i) = x(i)^2;
end
% ✅ 벡터화 (빠르고 짧음)
y = x .^ 2;
% ════════════════════════════════════════
% 예시 2: 조건부 처리
% ════════════════════════════════════════
data = randn(1, 1000); % 1000개 정규분포 난수
% ❌ for문
result = zeros(size(data));
for i = 1:length(data)
if data(i) > 0
result(i) = data(i);
else
result(i) = 0;
end
end
% ✅ 벡터화
result = max(data, 0); % 음수 → 0, 양수 → 그대로 (ReLU!)
% ════════════════════════════════════════
% 예시 3: 조건 카운트
% ════════════════════════════════════════
scores = [85 42 91 67 73 38 95 55];
% ❌ for문
count = 0;
for i = 1:length(scores)
if scores(i) >= 60
count = count + 1;
end
end
% ✅ 벡터화
count = sum(scores >= 60); % 논리배열의 합 = true 개수
% ── 파일명: circle_area.m ──
% ⚠️ 파일명과 함수명이 반드시 같아야함!
function area = circle_area(r)
% CIRCLE_AREA 원의 넓이를 계산
% area = circle_area(r) : 반지름 r의 원 넓이 반환
area = pi * r.^2; % .^ 쓰면 벡터 입력도 처리 가능!
end
% ── 사용 (Command Window 또는 다른 스크립트) ──
a = circle_area(5) % 78.5398
a = circle_area([1 2 3]) % [3.1416 12.5664 28.2743]
중요한 것은
(1) 파일명과 함수명이 반드시 일치해야한다
라는 것이다.
% ── 파일명: min_max.m ──
function [minVal, maxVal, avgVal] = min_max(data)
% MIN_MAX 최소, 최대, 평균 반환
minVal = min(data);
maxVal = max(data);
avgVal = mean(data);
end
% ── 사용 ──
[lo, hi, avg] = min_max([3 1 4 1 5 9 2 6])
% lo = 1, hi = 9, avg = 3.8750
% 일부만 받기도 가능
[lo, hi] = min_max([3 1 4 1 5]); % avgVal은 버림
lo = min_max([3 1 4 1 5]); % 첫 번째만 받음
% ── 파일명: my_script.m (또는 함수 파일) ──
% 메인 코드 (스크립트)
x = [1 2 3 4 5];
result = double_and_sum(x);
fprintf('결과: %d\n', result); % 결과: 30
% ── 로컬 함수 (파일 맨 아래에 정의) ──
function s = double_and_sum(v)
s = sum(v * 2);
end
% ⚠️ 로컬 함수는 해당 파일 안에서만 호출 가능!
% ⚠️ 스크립트 파일은 R2016b부터 로컬 함수 지원
function result = flexible_func(a, b, c)
fprintf('입력 %d개 받음\n', nargin);
if nargin < 2
b = 0; % 기본값 설정
end
if nargin < 3
c = 1; % 기본값 설정
end
result = (a + b) * c;
end
% ── 사용 ──
flexible_func(5) % 입력 1개 받음 → (5+0)*1 = 5
flexible_func(5, 3) % 입력 2개 받음 → (5+3)*1 = 8
flexible_func(5, 3, 2) % 입력 3개 받음 → (5+3)*2 = 16
% ── 기본 ──
f = @(x) x.^2 + 1;
f(3) % 10
f([1 2 3]) % [2 5 10]
% ── 다중 입력 ──
add = @(a, b) a + b;
add(3, 5) % 8
% ── 수학 함수 조합 ──
g = @(x) exp(-x.^2) .* sin(x);
x = linspace(-3, 3, 100);
% plot(x, g(x)) ← LEVEL 5에서 다룸!
% ── 기존 함수를 감싸기 ──
myNorm = @(v) sqrt(sum(v.^2));
myNorm([3 4]) % 5
구조:
함수핸들 = @(입력변수) 표현식;
특징:
- 한 줄 표현식만 가능
- 변수에 저장해서 전달 가능
- 다른 함수의 인자로 넘길 수 있음 (콜백 등)
abs(-5) % 5 절대값
sqrt(16) % 4 제곱근
exp(1) % 2.7183 자연상수 e^1
log(exp(3)) % 3 자연로그 (ln)
log2(8) % 3 밑이 2
log10(1000) % 3 상용로그
sin(pi/2) % 1 삼각함수 (라디안!)
cos(0) % 1
tan(pi/4) % 1
asin(1) % pi/2 역삼각
round(3.6) % 4 반올림
floor(3.9) % 3 내림
ceil(3.1) % 4 올림
fix(3.7) % 3 0 방향으로 자름 (양수면 내림)
mod(10, 3) % 1 나머지
x = [4 2 7 1 9 3 8 5];
sum(x) % 39 합계
prod(x) % 20160 곱
mean(x) % 4.875 평균
median(x) % 4.5 중앙값
std(x) % 2.8504 표준편차
var(x) % 8.125 분산
max(x) % 9 최대
min(x) % 1 최소
[val, idx] = max(x) % val=9, idx=5 (5번째 위치)
sort(x) % [1 2 3 4 5 7 8 9] 오름차순
sort(x, 'descend') % [9 8 7 5 4 3 2 1] 내림차순
cumsum(x) % [4 6 13 14 23 26 34 39] 누적합
cumprod([1 2 3 4]) % [1 2 6 24] 누적곱
diff([1 3 6 10]) % [2 3 4] 차분 (인접 차이)
x = [0 3 0 7 5 0 2];
find(x) % [2 4 5 7] — 0이 아닌 원소의 인덱스
find(x > 4) % [4 5] — 4보다 큰 원소의 인덱스
find(x == 0) % [1 3 6] — 0인 원소의 인덱스
any(x > 6) % true — 하나라도 6 초과?
all(x >= 0) % true — 전부 0 이상?
isnan([1 NaN 3]) % [0 1 0] — NaN 존재 여부
isinf([1 inf 3]) % [0 1 0] — Inf 존재 여부
isempty([]) % true — 빈 배열?