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은 대소문자를 구분해요. A와 a는 서로 다른 변수입니다:
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 가변 인자
가변 인자를 위해서는 varargin과 varargout을 사용합니다:
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);
