[MATLAB 기초 문법] 2. 행렬과 벡터

YUN·2026년 2월 16일

MATLAB/Simulink

목록 보기
5/21
post-thumbnail

Matlab에서 행렬이 가지는 의미

MATLAB = MATrix LABoratory. 즉 행렬이 이 언어의 존재 이유이다.

그만큼 MATLAB에서 행렬이 중요하다.

1. 벡터 생성

(1) 행 벡터 & 열 벡터

% 행 벡터 (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]

(2) 등간격 벡터 생성

동일한 간격의 요소로 이루어진 벡터를 생성하는 방법이다.

% ── 콜론 연산자 활용 -> 시작값:증가값:끝값 (증가값은 생략 가능. 증가값 생략시 시작값 부터 시작해서 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개의 수로 균등 분할

(3) 전치 (Transpose)

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]   ← 전치만

💡 실수만 다룰 때는 '와 .' 결과가 같음. 복소수 쓸 때만 주의!

2. 행렬 생성

(1) 일반적인 행렬 생성

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

% 세미콜론(;) = 줄 바꿈!
% 각 행의 원소 개수가 같아야 함

(2) 특수 행렬 생성

% ── 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 사이)

(3) 행렬 조작 함수

% ── 대각 행렬 ──
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) 순서이다.

3. 인덱싱 & 슬라이싱

(1) 기본 인덱싱 — C/C++과 다르게 인덱스가 1부터 시작

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부터!!!

(2) 범위 인덱싱 (슬라이싱)

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

(3) end 키워드

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]   — 마지막 열

(4) 논리 인덱싱 ⭐⭐⭐

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점으로 상향

(5) 선형 인덱싱 (Linear Indexing)

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

4. 행렬 연산

(1) 행렬 곱 vs 요소별 곱

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]

행렬 곱 규칙: 앞에꺼의 열 개수가 뒤에꺼의 행 개수와 같아야함

요소별 곱: 두 행렬의 크기가 같아야함

(2) 행렬 연산 함수

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)       % 조건수 (클수록 불안정)

(3) 크기 관련 함수

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의 행 개수와 열 개수 중 더 큰 값을 반환한다

(4) 행렬 연결 (Concatenation)

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)   % 동일

(5) 행렬 원소 삭제 & 추가

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]]  % 열 추가

(6) 유용한 집계 함수

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)    % 행, 열 인덱스로 반환
profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글