벡터의 뜻
핵심 질문
벡터는 왜 숫자 두 개로 방향과 크기를 함께 나타낼 수 있을까?
교과서 설명
벡터는 방향이 있는 이동이다. 좌표평면에서 벡터는 보통 다음처럼 쓴다.
v=(a,b)
이 뜻은 오른쪽으로 a, 위로 b만큼 이동한다는 말이다. 두 벡터를 더하면 이동을 이어 붙인 것과 같다.
(a,b)+(c,d)=(a+c,b+d)
벡터에 숫자를 곱하면 이동의 길이가 바뀐다. 이것을 스칼라배라고 한다.
t(a,b)=(ta,tb)
t가 양수이면 같은 방향으로 길이만 바뀌고, t가 음수이면 반대 방향으로 뒤집힌다. 아무 움직임도 없는 벡터는 영벡터라고 한다.
0=(0,0)
좌표 (a,b)는 점으로도 볼 수 있고, 원점에서 그 점까지 가는 이동으로도 볼 수 있다. 벡터를 더하거나 늘릴 때는 “점”보다 “이동”으로 생각하는 편이 자연스럽다.
벡터 공간 관점
조금 더 엄밀하게 말하면, 평면 벡터는 R2의 원소다. R2는 실수 두 개를 순서 있게 모은 집합이다.
R2={(a,b)∣a,b∈R}
벡터 공간에서는 두 가지 연산이 중요하다. 하나는 벡터끼리 더하는 연산이고, 다른 하나는 실수 하나를 곱해 크기와 방향을 조절하는 스칼라배다.
(a,b)+(c,d)=(a+c,b+d),t(a,b)=(ta,tb)
이 두 연산이 잘 정의되기 때문에 복잡한 이동도 작은 기본 이동의 합으로 쪼갤 수 있다. 예를 들어 (a,b)는 기본 방향 벡터 (1,0)과 (0,1)의 조합이다.
(a,b)=a(1,0)+b(0,1)
이 관점은 배열에도 그대로 확장된다. 길이 N인 배열은 RN의 벡터이고, 각 칸은 하나의 좌표다. DFT는 이런 벡터를 다른 좌표계, 즉 주파수 좌표계로 바꾸어 읽는 변환으로 볼 수 있다.
길이 N인 배열 벡터의 크기도 같은 방식으로 정의한다.
∥x∥=x[0]2+x[1]2+⋯+x[N−1]2=n=0∑N−1x[n]2
이 값은 배열 전체가 원점에서 얼마나 멀리 떨어져 있는지를 나타낸다. 뒤에서 내적과 DFT 점수를 볼 때 “얼마나 강하게 남는가”를 비교하는 기준이 된다.
직관 비유
길 안내를 생각하자. “동쪽으로 3칸, 북쪽으로 2칸”은 벡터 (3,2)다. 이어서 “동쪽으로 1칸, 남쪽으로 1칸”을 더하면 전체 이동은 (4,1)이다.
예제
(2,1)+(1,3)=(3,4)
벡터의 길이는 피타고라스 정리로 구한다.
∣v∣=a2+b2
스칼라배 예시는 다음과 같다.
2(3,1)=(6,2),−1(3,1)=(−3,−1)
DFT에서는 신호값 x[n]이 회전 벡터의 길이를 키우거나, 값이 음수일 때 방향을 뒤집는 역할을 한다.
손풀이 체크
-
(2,−1)+(3,4)는?
답 보기
(5,3)
-
−2(1,3)은?
답 보기
(−2,−6)
-
벡터 (0,0)은 어떤 이동을 뜻할까?
답 보기
아무 방향으로도 움직이지 않는 이동이다.
다음으로 이어지는 생각
벡터와 배열은 여러 숫자를 순서대로 다룬다는 점에서 닮아 있다. 다음 장에서는 배열의 번호와 긴 덧셈 표기를 먼저 정리한다.
벡터 덧셈 v+w, 스칼라배 tv, 길이 ∣v∣ 계산하기
#include <cmath>
#include <iostream>
using namespace std;
struct Vec {
double x;
double y;
};
Vec add(Vec a, Vec b) {
return {a.x + b.x, a.y + b.y};
}
Vec scale(double t, Vec v) {
return {t * v.x, t * v.y};
}
double length(Vec v) {
return sqrt(v.x * v.x + v.y * v.y);
}
int main() {
Vec v{2, 1};
Vec w{1, 3};
Vec sum = add(v, w);
Vec twice = scale(2, v);
cout << "v+w = (" << sum.x << ", " << sum.y << ")\n";
cout << "2v = (" << twice.x << ", " << twice.y << ")\n";
cout << "|(3,4)| = " << length({3, 4}) << "\n";
}
연습: v와 w의 좌표를 바꿔서 합과 길이를 직접 예측해 보자.