Learn in 10 minutes

Learn in 10 minutes

10분 만에 MATLAB 배우기

MATLAB(Matrix Laboratory)은 수치 계산, 알고리즘 개발, 데이터 시각화를 위해 설계된 고수준 프로그래밍 언어이자 환경입니다. 1970년대 후반에 개발된 MATLAB은 이제 공학, 과학, 수학에서 필수적인 도구가 되었죠.

이 튜토리얼에서는 MATLAB의 기초를 다루면서 이 강력한 컴퓨팅 환경을 시작할 수 있도록 도와드릴게요.

1. 첫 번째 MATLAB 프로그램

hello.m이라는 스크립트 파일을 만들거나 MATLAB 명령 창에 직접 명령을 입력하면 됩니다.

disp('Hello, World!')

또는 fprintf 함수를 사용할 수도 있어요:

fprintf('Hello, World!\n')

출력 결과는 다음과 같습니다:

Hello, World!

disp() 함수는 내용을 직접 출력하고, fprintf()는 C의 printf처럼 더 많은 서식 옵션을 제공해줘요.

2. 기본 문법

MATLAB은 대부분의 범용 프로그래밍 언어와 다른 고유한 문법 규칙을 가지고 있어요. 이 기초를 이해하면 깔끔하고 유지보수가 쉬운 코드를 작성할 수 있답니다.

2.1 주석

한 줄 주석은 % 기호로 시작합니다:

% 이것은 주석입니다
x = 10;  % x에 10을 할당합니다

여러 줄 주석은 %{%}를 사용합니다:

%{
이것은 여러 줄 주석입니다.
여러 줄에 걸쳐 작성할 수 있습니다.
%}

2.2 세미콜론

세미콜론 ;은 출력을 억제해요. 세미콜론이 없으면 MATLAB이 결과를 출력합니다:

x = 5     % 출력: x = 5
y = 10;   % 출력 없음, 하지만 y에 할당됨

2.3 대소문자 구분

MATLAB은 대소문자를 구분해요. Aa는 서로 다른 변수입니다:

A = 5;
a = 10;
disp(A)  % 출력: 5
disp(a)  % 출력: 10

2.4 변수 이름 규칙

변수 이름은 문자로 시작해야 하고, 그 다음에는 문자, 숫자 또는 밑줄이 올 수 있어요:

valid_name = 1;
another_valid_name_123 = 2;
% 123invalid = 3;  % 오류: 숫자로 시작할 수 없음

2.5 기본 연산

MATLAB은 행렬 연산에 특히 뛰어나요. 행렬을 만드는 것도 정말 간단해요:

A = [1 2 3; 4 5 6; 7 8 9]  % 3x3 행렬

출력:

A =

     1     2     3
     4     5     6
     7     8     9

3. 변수와 데이터 타입

MATLAB은 동적 타이핑을 사용해요. 변수는 할당될 때 생성되고 타입은 할당된 값에 의해 결정됩니다.

3.1 숫자 타입

MATLAB은 기본적으로 모든 숫자를 배정밀도 부동소수점으로 저장합니다:

% 정수
int_num = 42;

% 부동소수점
float_num = 3.14159;

% 지수 표기법
sci_num = 2.5e-3;  % 0.0025

3.2 문자열

문자열 변수는 작은따옴표를 사용합니다:

str = 'Hello, MATLAB';
str2 = "Hello, MATLAB";  % 문자열 배열 (R2016b 이상)

문자열 연결:

str1 = 'Hello';
str2 = 'World';
combined = [str1 ', ' str2];  % 'Hello, World'

3.3 논리(불리언)

논리값은 true 또는 false입니다:

flag = true;
result = false;

% 논리 연산
a = true;
b = false;
and_result = a && b;    % false
or_result = a || b;     % true
not_result = ~a;        % false

3.4 문자 배열과 문자열의 차이

MATLAB에는 문자 배열과 문자열 객체가 모두 있어요:

% 문자 배열 (이전 방식)
char_arr = 'Hello';

% 문자열 객체 (최신 방식, R2016b 이상)
str_obj = "Hello";

% 문자열 객체가 더 다루기 쉬워요
name = "Alice";
greeting = "Hello, " + name;  % 자연스럽게 작동함

4. 데이터 구조

MATLAB은 다양한 용도에 맞는 여러 데이터 구조를 제공합니다.

4.1 벡터

벡터는 1차원 배열입니다:

% 행 벡터
row_vec = [1 2 3 4 5];

% 열 벡터
col_vec = [1; 2; 3; 4; 5];

% 콜론 연산자 사용
range_vec = 1:5;        % [1 2 3 4 5]
step_vec = 0:2:10;      % [0 2 4 6 8 10]

% linspace로 고르게 분포된 값 생성
lin_vec = linspace(0, 10, 5);  % [0 2.5 5 7.5 10]

4.2 행렬

행렬은 MATLAB의 근간이죠:

% 직접 행렬 생성
A = [1 2 3; 4 5 6; 7 8 9];

% 요소 접근
element = A(2, 3);  % 6 반환 (2행 3열)

% 행렬 연산
B = A';            % 전치
C = A * B;         % 행렬 곱셈
D = A .* B;        % 요소별 곱셈

4.3 셀 배열

셀 배열은 서로 다른 타입의 데이터를 저장할 수 있어요:

% 셀 배열 생성
cell_arr = {1, 'hello', [1 2 3], true};

% 중괄호로 셀 내용 접근
data = cell_arr{2};  % 'hello' 반환

% 소괄호로 셀 접근
sub_cell = cell_arr(1:2);  % {1, 'hello'} 반환

4.4 구조체

구조체는 이름이 있는 필드를 가진 딕셔너리 같은 거예요:

% 구조체 생성
student.name = 'John';
student.age = 20;
student.major = 'Engineering';

% 필드 접근
disp(student.name);  % 출력: John

% 구조체 배열
students(1).name = 'Alice';
students(1).age = 21;
students(2).name = 'Bob';
students(2).age = 22;

4.5 테이블

테이블은 표 형태의 데이터에 적합합니다:

% 테이블 생성
Age = [25; 30; 35];
Name = {'Alice'; 'Bob'; 'Charlie'};
Salary = [50000; 60000; 70000];

T = table(Name, Age, Salary);

% 데이터 접근
disp(T.Age);
disp(T.Name{1});

5. 연산자

MATLAB은 산술, 비교, 논리 연산을 위한 다양한 연산자를 제공합니다.

5.1 산술 연산자

a = 10;
b = 3;

sum = a + b;           % 13
diff = a - b;          % 7
prod = a * b;          % 30
quot = a / b;          % 3.3333
int_div = floor(a/b);  % 3
mod = mod(a, b);       % 1 (나머지)
pow = a ^ b;           % 1000

5.2 요소별 연산자

요소별 연산자는 해당 요소들끼리 연산해요:

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

C = A .* B;  % 요소별: [4 10 18]
D = A.^2;    % 요소별 제곱: [1 4 9]

5.3 비교 연산자

x = 5;
y = 10;

eq = (x == y);    % false
neq = (x ~= y);   % true
gt = (x > y);     % false
lt = (x < y);     % true
ge = (x >= y);    % false
le = (x <= y);    % true

5.4 논리 연산자

a = true;
b = false;

and_op = a & b;     % false (요소별 AND)
or_op = a | b;      % true (요소별 OR)
not_op = ~a;        % false
and_short = a && b; % false (단락 평가 AND)
or_short = a || b;  % true (단락 평가 OR)

6. 제어 흐름

MATLAB은 표준 제어 흐름 구조를 제공하지만, 파이썬 같은 언어와는 다른 문법을 사용해요.

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

disp(grade)  % 출력: B

6.2 switch

switch 문은 하나의 표현식을 여러 케이스와 비교합니다:

day = 'Monday';

switch day
    case {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}
        disp('Weekday');
    case {'Saturday', 'Sunday'}
        disp('Weekend');
    otherwise
        disp('Invalid day');
end

6.3 for 루프

for 루프는 범위나 배열을 순회합니다:

% 범위 순회
for i = 1:5
    disp(i);
end

% 배열 순회
fruits = {'apple', 'banana', 'orange'};
for fruit = fruits
    disp(fruit{1});
end

% 행렬 연산을 위한 중첩 루프
A = [1 2; 3 4];
B = zeros(2, 2);
for i = 1:2
    for j = 1:2
        B(i, j) = A(i, j) * 2;
    end
end

6.4 while 루프

count = 0;
while count < 5
    disp(count);
    count = count + 1;
end

6.5 루프 제어

break 문은 루프를 종료하고, continue는 다음 반복으로 건너뜁니다:

% break 사용
for i = 1:10
    if i == 5
        break;
    end
    disp(i);
end
% 출력: 1 2 3 4

% continue 사용
for i = 1:5
    if mod(i, 2) == 0
        continue;  % 짝수 건너뛰기
    end
    disp(i);
end
% 출력: 1 3 5

7. 입출력

7.1 사용자 입력

input() 함수를用来获取用户输入:

% 숫자 입력 받기
num = input('Enter a number: ');

% 문자열 입력 받기
name = input('Enter your name: ', 's');

% 수식 입력 받기 (입력된 수식 계산)
expr = input('Enter an expression: ');

7.2 출력 표시

출력을 표시하는 여러 함수가 있어요:

% disp - 간단한 표시
disp('Hello');
disp([1 2 3]);

% fprintf - 서식이 있는 출력
name = 'Alice';
age = 25;
fprintf('Name: %s, Age: %d\n', name, age);

% sprintf - 서식 문자열 생성
str = sprintf('Value: %.2f', 3.14159);
disp(str);

7.3 서식 지정자

MATLAB의 일반적인 서식 지정자:

% %s - 문자열
% %d - 정수
% %f - 부동소수점
% %.2f - 소수점 2자리 부동소수점
% %e - 지수 표기법

fprintf('%d %.2f %e\n', 42, 3.14159, 1000)
% 출력: 42 3.14 1.000000e+03

8. 함수

MATLAB의 함수는 보통 별도의 파일에 정의하지만, 익명 함수를 사용하면 인라인 함수 생성도 가능해요.

8.1 익명 함수

익명 함수는 별도의 파일 없이 간단한 함수를 만들어줘요:

% 단일 입력
square = @(x) x^2;
disp(square(5));  % 출력: 25

% 다중 입력
add = @(x, y) x + y;
disp(add(3, 4));  % 출력: 7

% 다중 표현식
hypot = @(x, y) sqrt(x^2 + y^2);
disp(hypot(3, 4));  % 출력: 5

8.2 함수 파일

myfunc.m이라는 파일을 만드세요:

function y = myfunc(x)
    y = x^2 + 1;
end

함수 호출:

result = myfunc(5);  % 출력: 26

8.3 다중 출력 함수

function [sum, prod] = calc(x, y)
    sum = x + y;
    prod = x * y;
end

다중 출력으로 호출:

[s, p] = calc(3, 4);
disp(s);  % 7
disp(p);  % 12

8.4 가변 인자

가변 인자를 위해서는 vararginvarargout을 사용합니다:

function result = sum_all(varargin)
    result = 0;
    for i = 1:length(varargin)
        result = result + varargin{i};
    end
end

% 원하는 수만큼의 인자로 호출
total = sum_all(1, 2, 3, 4, 5);  % 출력: 15

9. 스크립트 파일

스크립트는 MATLAB 명령 시퀀스를 포함하는 .m 파일이에요. 워크스페이스의 데이터에서 작동합니다:

% myscript.m으로 저장
% 데이터셋에 대한 통계 계산
data = [1 2 3 4 5 6 7 8 9 10];

mean_val = mean(data);
std_val = std(data);
max_val = max(data);
min_val = min(data);

fprintf('Mean: %.2f\n', mean_val);
fprintf('Std: %.2f\n', std_val);
fprintf('Max: %d\n', max_val);
fprintf('Min: %d\n', min_val);

10. 오류 처리

오류 처리는 try-catch를 사용합니다:

try
    result = risky_operation();
catch ME
    fprintf('Error: %s\n', ME.message);
    % 오류 처리
    result = 0;
end

error()로 오류를 발생시키기:

function result = divide(a, b)
    if b == 0
        error('Division by zero is not allowed');
    end
    result = a / b;
end

11. 파일 연산

11.1 데이터 저장 및 로드

% 변수를 파일에 저장
x = [1 2 3];
y = 'hello';
save('data.mat', 'x', 'y');

% 파일에서 변수 로드
load('data.mat');

% 텍스트 파일에 저장
writematrix(x, 'data.txt');

% 텍스트 파일에서 읽기
data = readmatrix('data.txt');

11.2 텍스트 파일 연산

% 텍스트 파일에 쓰기
fid = fopen('output.txt', 'w');
fprintf(fid, 'Line 1\n');
fprintf(fid, 'Line 2\n');
fclose(fid);

% 텍스트 파일에서 읽기
fid = fopen('output.txt', 'r');
while ~feof(fid)
    line = fgetl(fid);
    if ischar(line)
        disp(line);
    end
end
fclose(fid);

textscan으로 구조화된 읽기:

fid = fopen('data.txt', 'r');
format = '%s %d %f';
C = textscan(fid, format);
fclose(fid);

name = C{1};
age = C{2};
score = C{3};

12. 플롯팅

MATLAB의 플롯팅 기능은 가장 강력한 기능 중 하나예요.

12.1 기본 2D 플롯팅

x = 0:0.1:2*pi;
y = sin(x);

plot(x, y);
xlabel('x');
ylabel('sin(x)');
title('Sine Wave');
grid on;

12.2 여러 플롯

x = 0:0.1:2*pi;

% 서브플롯
subplot(2, 1, 1);
plot(x, sin(x));
title('Sine');

subplot(2, 1, 2);
plot(x, cos(x));
title('Cosine');

12.3 플롯 커스터마이징

x = 0:0.1:10;
y1 = x;
y2 = x.^2;

plot(x, y1, 'b-', 'LineWidth', 2);  % 파란색 실선
hold on;
plot(x, y2, 'r--', 'LineWidth', 2); % 빨간색 점선
hold off;

xlabel('X');
ylabel('Y');
legend('Linear', 'Quadratic');
title('Linear vs Quadratic');
grid on;

12.4 다른 플롯 타입

% 막대 그래프
bar([1 2 3 4], [10 20 15 25]);

% 히스토그램
data = randn(1000, 1);
histogram(data, 30);

% 산점도
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y);