[MATLAB 기초 문법] 3. 제어문, 함수

YUN·2026년 2월 16일

MATLAB/Simulink

목록 보기
6/21
post-thumbnail

1.1 조건문 : if / elseif / else

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로 조건문을 닫아준다.

1.2 조건문 : if문 중첩

age = 22;
is_student = true;

% ── 중첩 ──
if age >= 20
    if is_student
        disp('20세 이상 학생')
    end
end

% ── 논리 연산으로 한 줄로 ──
if age >= 20 && is_student
    disp('20세 이상 학생')     % 이게 더 깔끔!
end

1.3 조건문 : switch / case

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}

2.1 반복문 : for문

% ── 기본 형태 ──
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

  변수가 벡터의 원소를 하나씩 받으며 반복

2.2 반복문 : for을 활용한 행렬 열 순회

A = [1 2 3; 4 5 6];

% 행렬을 넣으면 "열 벡터" 단위로 순회!
for col = A
    disp(col)    % 1번째: [1;4], 2번째: [2;5], 3번째: [3;6]
end

2.3 반복문 : while문

% ── 기본 형태 ──
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번 반복

2.4 break, continue

% ── 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
  • break : 반복문 즉시 탈출
  • continue : 이번 반복만 건너뛰기

3.1 반복문과 벡터화

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

4.1 함수 정의

% ── 파일명: 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) 파일명과 함수명이 반드시 일치해야한다

라는 것이다.

(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]);           % 첫 번째만 받음

(2) 로컬 함수 (같은 파일 안에 정의된 함수)

% ── 파일명: 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부터 로컬 함수 지원

(3) nargin/nargout - 입출력 개수 확인

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

(4) 익명 함수 (Anonymous Function)

% ── 기본 ──
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


구조:
  함수핸들 = @(입력변수) 표현식;

  특징:
  - 한 줄 표현식만 가능
  - 변수에 저장해서 전달 가능
  - 다른 함수의 인자로 넘길 수 있음 (콜백 등)

5.1 유용한 MATLAB 내장 함수

(1) 수학 함수

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          나머지

(2) 통계/집계 함수

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]               차분 (인접 차이)

(3) 찾기/판별 함수

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          — 빈 배열?
profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글