
MATLAB = MATrix LABoratory. 즉 행렬이 이 언어의 존재 이유이다.
그만큼 MATLAB에서 행렬이 중요하다.
% 행 벡터 (1×N) — 열은 공백 또는 쉼표로 구분한다
row = [1 2 3 4 5];
row = [1, 2, 3, 4, 5]; % 동일
% 열 벡터 (N×1) — 행은 세미콜론으로 구분한다
col = [1; 2; 3; 4; 5];
size(row) % [1, 5]
size(col) % [5, 1]
동일한 간격의 요소로 이루어진 벡터를 생성하는 방법이다.
% ── 콜론 연산자 활용 -> 시작값:증가값:끝값 (증가값은 생략 가능. 증가값 생략시 시작값 부터 시작해서 1씩 증가)──
a = 1:5 % [1 2 3 4 5] 증가값 생략 → 1씩 증가
b = 0:2:10 % [0 2 4 6 8 10] 2씩 증가
c = 10:-3:1 % [10 7 4 1] 감소도 가능
d = 0:0.5:2 % [0 0.5 1.0 1.5 2.0] 소수도 OK
% ── linspace(시작값, 끝값, 개수) ──
e = linspace(0, 1, 5) % [0 0.25 0.5 0.75 1] ← 0~1을 5개의 수로 균등 분할
f = linspace(0, 2*pi, 100) % 0~2π를 100개로 → 그래프 그릴 때 자주!
% ── logspace(시작값, 끝값, 개수) ──
g = logspace(0, 3, 4) % [1 10 100 1000] ← 10^0 ~ 10^3 을 4개의 수로 균등 분할
row = [1 2 3];
row' % 전치 + 켤레복소수 (Hermitian transpose)
% → [1; 2; 3] (실수면 그냥 전치와 동일)
row.' % 단순 전치만 (복소수일 때 차이남)
% → [1; 2; 3]
% 복소수에서 차이
z = [1+2i, 3+4i];
z' % [1-2i; 3-4i] ← 켤레까지!
z.' % [1+2i; 3+4i] ← 전치만
💡 실수만 다룰 때는 '와 .' 결과가 같음. 복소수 쓸 때만 주의!
A = [1 2 3; 4 5 6; 7 8 9]
% 1 2 3
% 4 5 6
% 7 8 9
% 세미콜론(;) = 줄 바꿈!
% 각 행의 원소 개수가 같아야 함
% ── 0으로 채운 행렬 ──
zeros(3) % 3×3 영행렬
zeros(2, 4) % 2×4 영행렬
% ── 1로 채운 행렬 ──
ones(3) % 3×3 전부 1
ones(1, 5) % [1 1 1 1 1]
% ── 단위 행렬 (Identity) ──
eye(3) % 3×3 단위행렬
% 1 0 0
% 0 1 0
% 0 0 1
eye(2, 4) % 2×4 (직사각형도 가능)
% 1 0 0 0
% 0 1 0 0
% ── 난수 행렬 ──
rand(3) % 3×3 균일분포 난수 (0~1 사이)
rand(2, 5) % 2×5
randn(3) % 3×3 정규분포 난수 (평균 0, 분산 1)
randi(10, 3) % 3×3 정수 난수 (1~10 사이)
randi([5 20], 2, 4) % 2×4 정수 난수 (5~20 사이)
% ── 대각 행렬 ──
diag([1 2 3]) % 대각에 1,2,3 배치
% 1 0 0
% 0 2 0
% 0 0 3
diag(A) % 행렬 A에서 대각 원소 추출 → [1; 5; 9]
% ── 반복/타일 ──
repmat([1 2], 3, 2)
% 1 2 1 2
% 1 2 1 2
% 1 2 1 2
% ── 형태 변경 ──
B = [1 2 3 4 5 6];
reshape(B, 2, 3) % 2×3 행렬로 변환 (열 우선 채움!)
% 1 3 5
% 2 4 6 ← 위에서 아래로, 왼쪽에서 오른쪽으로!
reshape(B, 3, 2)
% 1 4
% 2 5
% 3 6
⚠️ reshape 주의: MATLAB은 열 우선(column-major) 순서이다.
A = [10 20 30;
40 50 60;
70 80 90];
A(2, 3) % 60 — 2행 3열
A(1, 1) % 10 — 1행 1열 (0이 아님!!)
% C++: arr[0][0] ← 0부터
% MATLAB: A(1, 1) ← 1부터!!!
A = [10 20 30 40;
50 60 70 80;
90 100 110 120];
% ── 콜론(:)으로 범위 지정 ──
A(1, :) % [10 20 30 40] — 1행 전체
A(:, 2) % [20; 60; 100] — 2열 전체
A(:, :) % 전체 행렬 — 모든 행, 모든 열
A(1:2, :) % 1~2행 전체
% 10 20 30 40
% 50 60 70 80
A(:, 2:3) % 2~3열 전체
% 20 30
% 60 70
% 100 110
A(2:3, 1:2) % 2~3행, 1~2열
% 50 60
% 90 100
A = [10 20 30 40 50];
A(end) % 50 — 마지막 원소
A(end-1) % 40 — 끝에서 두 번째
A(3:end) % [30 40 50] — 3번째~끝까지
B = [1 2 3; 4 5 6; 7 8 9];
B(end, :) % [7 8 9] — 마지막 행
B(:, end) % [3; 6; 9] — 마지막 열
MATLAB의 주요 기능으로, for문 없이 조건에 맞는 원소를 한 번에 뽑는다
x = [15 3 8 22 7 11 1 30];
% 1단계: 조건 → logical 배열 생성
x > 10 % [1 0 0 1 0 1 0 1]
% 2단계: logical 배열로 인덱싱
x(x > 10) % [15 22 11 30] ← 10보다 큰 것만!
% 한 줄로 조건 조합
x(x > 5 & x < 20) % [15 8 7 11] — 5~20 사이
% 조건 만족하는 원소 변경
x(x > 10) = 0 % [0 3 8 0 7 0 1 0] — 10 초과를 0으로!
% 실전 예시: 시험 점수 처리
scores = [85 42 91 67 73 38 95 55];
pass = scores(scores >= 60) % [85 91 67 73 95] 합격자 점수
fail_count = sum(scores < 60) % 3 불합격 인원수
scores(scores < 60) = 60; % 60점 미만 → 60점으로 상향
A = [10 20 30;
40 50 60;
70 80 90];
% 열 우선으로 인덱스 매김:
% (1)10 (4)20 (7)30
% (2)40 (5)50 (8)60
% (3)70 (6)80 (9)90
A(5) % 50 ← 5번째 원소
A(7) % 30
A([1 5 9]) % [10 50 90] ← 대각 원소
% sub2ind, ind2sub — 인덱스 변환
sub2ind(size(A), 2, 3) % 8 ← (2행,3열) → 선형 인덱스 8
[r, c] = ind2sub(size(A), 8) % r=2, c=3
A = [1 2; 3 4];
B = [5 6; 7 8];
% 행렬 곱 (선형대수)
A * B % [19 22; 43 50]
% (2×2) * (2×2) = (2×2) ← 내부 차원 일치 필요
% 요소별 곱
A .* B % [5 12; 21 32]
행렬 곱 규칙: 앞에꺼의 열 개수가 뒤에꺼의 행 개수와 같아야함
요소별 곱: 두 행렬의 크기가 같아야함
A = [1 2; 3 4];
% ── 기본 ──
A' % 전치 [1 3; 2 4]
inv(A) % 역행렬 [-2 1; 1.5 -0.5]
det(A) % 행렬식 -2
% ── 분석 ──
rank(A) % 랭크 2
trace(A) % 대각합 5 (= 1+4)
eig(A) % 고유값 [-0.3723; 5.3723]
[V, D] = eig(A) % V: 고유벡터, D: 고유값 대각행렬
% ── 노름/조건수 ──
norm(A) % 행렬 노름
cond(A) % 조건수 (클수록 불안정)
A = [1 2 3; 4 5 6]; % 2×3 행렬
size(A) % [2, 3] — [행, 열]
size(A, 1) % 2 — 행 수
size(A, 2) % 3 — 열 수
length(A) % 3 — 가장 긴 차원 (max(2,3))
numel(A) % 6 — 전체 원소 개수
% ⚠️ length는 벡터에서만 쓰는 게 안전!
v = [1 2 3 4 5];
length(v) % 5 ← 벡터 길이
length() 함수는 행렬 X의 행 개수와 열 개수 중 더 큰 값을 반환한다
A = [1 2; 3 4];
B = [5 6; 7 8];
% 수평 연결 (옆으로 붙이기) — 행 수 같아야!
C = [A B] % [1 2 5 6; 3 4 7 8]
C = horzcat(A, B) % 동일
% 수직 연결 (아래로 붙이기) — 열 수 같아야!
D = [A; B] % [1 2; 3 4; 5 6; 7 8]
D = vertcat(A, B) % 동일
A = [1 2 3; 4 5 6; 7 8 9];
% ── 삭제: 빈 배열 [] 할당 ──
A(2, :) = [] % 2행 삭제 → [1 2 3; 7 8 9]
A(:, 1) = [] % 1열 삭제
% ── 추가: 연결 ──
A = [1 2; 3 4];
A = [A; 5 6] % 행 추가 → [1 2; 3 4; 5 6]
A = [A, [7; 8; 9]] % 열 추가
A = [3 1 4;
1 5 9;
2 6 5];
% ── 각 열별 연산 (기본 방향) ──
sum(A) % [6 12 18] 각 열의 합
mean(A) % [2 4 6] 각 열의 평균
max(A) % [3 6 9] 각 열의 최대
min(A) % [1 1 4] 각 열의 최소
sort(A) % 각 열 오름차순 정렬
% ── 각 행별 연산 (2번째 인자로 행 방향 합/평균 또는 열 방향 합/평균 지정) ──
sum(A, 2) % [8; 15; 13] 각 행의 합
mean(A, 2) % [2.67; 5; 4.33]
% ── 전체 ──
sum(A, 'all') % 36 모든 원소의 합 (R2018b+)
sum(A(:)) % 36 이것도 동일 (이전 버전 호환)
% ── 누적합 ──
cumsum([1 2 3 4]) % [1 3 6 10]
% ── 위치 찾기 ──
[val, idx] = max(A(:)) % val=9, idx=6 (선형 인덱스)
find(A > 4) % [5 6 8] — 4보다 큰 원소의 선형 인덱스
[r, c] = find(A > 4) % 행, 열 인덱스로 반환