🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

벡터와 벡터 연산 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 11. 28. · 103 Views

벡터와 벡터 연산 완벽 가이드

게임 개발부터 머신러닝까지, 프로그래밍의 수학적 기초가 되는 벡터의 개념과 연산을 초급자도 이해할 수 있도록 쉽게 설명합니다. 실제 코드 예제와 함께 벡터의 모든 것을 배워봅니다.


목차

  1. 벡터란 무엇인가
  2. 스칼라, 벡터, 행렬 구분
  3. 벡터의 덧셈과 뺄셈
  4. 스칼라 곱
  5. 벡터의 크기 (노름)
  6. 단위 벡터

1. 벡터란 무엇인가

김개발 씨는 첫 게임 프로젝트에 투입되었습니다. 캐릭터를 화면에서 움직이게 만들어야 하는데, 선배가 건넨 코드에는 온통 벡터라는 단어가 가득했습니다.

"벡터가 대체 뭐길래 이렇게 많이 쓰이는 걸까요?"

벡터는 한마디로 크기와 방향을 동시에 가진 양입니다. 마치 "동쪽으로 3km"라고 말하는 것처럼, 단순한 숫자가 아니라 어디로 얼마나 가는지를 함께 표현합니다.

프로그래밍에서는 이것을 숫자들의 순서 있는 목록으로 나타냅니다.

다음 코드를 살펴봅시다.

# 2차원 벡터: 위치나 방향을 표현합니다
position = [3, 4]  # x축으로 3, y축으로 4

# 3차원 벡터: 입체 공간에서의 위치
point_3d = [1, 2, 5]  # x, y, z 좌표

# NumPy를 사용한 벡터 생성
import numpy as np
velocity = np.array([2.5, -1.0])  # 속도 벡터
print(f"속도 벡터: {velocity}")

# 벡터의 각 요소에 접근하기
x_component = velocity[0]  # 2.5
y_component = velocity[1]  # -1.0

김개발 씨는 입사 2주 차 신입 개발자입니다. 오늘 처음으로 게임 개발 팀에 배정되었는데, 코드 곳곳에서 벡터라는 단어가 눈에 들어왔습니다.

대학교 때 수학 시간에 배운 것 같기도 한데, 정확히 기억이 나지 않습니다. 선배 개발자 박시니어 씨가 옆에 앉으며 말했습니다.

"벡터 때문에 고민이구나? 사실 벡터는 생각보다 단순해.

친구한테 약속 장소 알려줄 때 어떻게 말해?" 김개발 씨가 대답했습니다. "음, 여기서 동쪽으로 500미터 가면 있어, 이런 식으로요?" "바로 그거야!

그게 벡터야." 박시니어 씨의 설명은 계속되었습니다. 벡터는 마치 길 안내와 같습니다.

단순히 "500미터"라고만 하면 어느 방향인지 알 수 없습니다. 하지만 "동쪽으로 500미터"라고 하면 크기(500미터)와 방향(동쪽)이 모두 담겨 있습니다.

이것이 바로 벡터의 핵심입니다. 그렇다면 프로그래밍에서는 이 벡터를 어떻게 표현할까요?

컴퓨터는 "동쪽"이나 "북서쪽" 같은 말을 이해하지 못합니다. 대신 숫자를 좋아합니다.

그래서 우리는 좌표계를 사용합니다. 2차원 평면에서는 x축과 y축을, 3차원 공간에서는 x, y, z축을 사용하여 방향과 크기를 숫자로 표현합니다.

예를 들어 [3, 4]라는 벡터가 있다면, 이것은 "x축 방향으로 3만큼, y축 방향으로 4만큼"이라는 의미입니다. 이 두 숫자가 합쳐져서 하나의 방향과 크기를 나타내는 것입니다.

위의 코드를 살펴보겠습니다. 먼저 position = [3, 4]는 가장 기본적인 2차원 벡터입니다.

파이썬의 리스트를 사용해서 간단하게 표현했습니다. 게임에서 캐릭터의 위치를 나타낼 때 이런 식으로 사용합니다.

3차원 벡터인 point_3d = [1, 2, 5]는 입체 공간에서의 한 점을 나타냅니다. 3D 게임이나 시뮬레이션에서는 이렇게 세 개의 숫자가 필요합니다.

실무에서는 NumPy 라이브러리를 많이 사용합니다. np.array()로 만든 벡터는 단순 리스트보다 훨씬 빠른 수학 연산을 지원합니다.

특히 대량의 벡터를 다룰 때 성능 차이가 확연하게 드러납니다. 벡터가 없던 시절의 코드를 상상해 보겠습니다.

캐릭터의 위치를 다루려면 x와 y를 따로따로 변수로 만들어야 했습니다. 캐릭터가 100개라면 변수가 200개가 되는 셈입니다.

벡터를 사용하면 이 모든 것을 깔끔하게 하나로 묶을 수 있습니다. 주의할 점도 있습니다.

벡터의 차원을 잘 맞춰야 합니다. 2차원 벡터와 3차원 벡터를 섞어서 연산하면 오류가 발생합니다.

마치 사과와 오렌지를 더하는 것처럼 말이 되지 않는 것입니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

박시니어 씨의 설명을 들은 후 김개발 씨는 코드가 훨씬 명확하게 보이기 시작했습니다. 캐릭터의 위치, 이동 방향, 속도가 모두 벡터로 표현되어 있었던 것입니다.

실전 팁

💡 - 벡터의 차원은 항상 일관성 있게 유지하세요

  • 실무에서는 리스트보다 NumPy 배열을 사용하는 것이 효율적입니다

2. 스칼라, 벡터, 행렬 구분

다음 날, 김개발 씨는 머신러닝 관련 코드를 살펴보다가 혼란에 빠졌습니다. 어제 배운 벡터 외에도 스칼라, 행렬이라는 용어가 계속 등장했습니다.

"이것들은 다 뭐가 다른 건가요?"

스칼라는 단일 숫자, 벡터는 숫자들의 1차원 배열, 행렬은 숫자들의 2차원 배열입니다. 마치 점, 선, 면의 관계처럼 차원이 하나씩 늘어나는 것입니다.

이 세 가지를 구분하는 것이 선형대수의 첫걸음입니다.

다음 코드를 살펴봅시다.

import numpy as np

# 스칼라: 단일 숫자 (0차원)
temperature = 36.5
learning_rate = 0.001

# 벡터: 숫자의 1차원 배열
scores = np.array([85, 92, 78, 95])  # 4차원 벡터
rgb_color = np.array([255, 128, 0])  # 3차원 벡터 (주황색)

# 행렬: 숫자의 2차원 배열
grades = np.array([
    [85, 90, 88],  # 1번 학생의 국어, 영어, 수학
    [92, 85, 95],  # 2번 학생의 점수
    [78, 82, 80]   # 3번 학생의 점수
])
print(f"행렬의 형태: {grades.shape}")  # (3, 3)

김개발 씨가 머신러닝 튜토리얼을 따라하던 중이었습니다. 코드에는 weight_vector, bias_scalar, transformation_matrix 같은 변수명이 가득했습니다.

벡터는 어제 배웠지만, 스칼라와 행렬은 처음 보는 개념이었습니다. 박시니어 씨가 화이트보드 앞으로 김개발 씨를 불렀습니다.

"자, 이건 건물에 비유하면 이해하기 쉬워." 스칼라는 건물의 한 층에 있는 방 하나입니다. 그냥 숫자 하나.

온도 36.5도, 가격 15000원처럼 단일한 값입니다. 수학에서 우리가 평소에 쓰는 그 숫자가 바로 스칼라입니다.

벡터는 한 층에 일렬로 늘어선 방들입니다. 호실 번호가 101, 102, 103, 104인 것처럼 순서가 있는 숫자들의 나열입니다.

어제 배운 것처럼 방향과 크기를 표현하거나, 여러 개의 관련된 값을 묶어서 표현할 때 사용합니다. 행렬은 여러 층으로 이루어진 건물 전체입니다.

1층에도 방이 있고, 2층에도, 3층에도 있습니다. 행(가로줄)과 열(세로줄)로 이루어진 2차원 구조입니다.

엑셀 스프레드시트를 떠올리면 됩니다. 위의 코드를 하나씩 살펴보겠습니다.

temperature = 36.5는 스칼라입니다. 그냥 하나의 숫자입니다.

머신러닝에서 학습률(learning_rate)도 스칼라입니다. scores = np.array([85, 92, 78, 95])는 벡터입니다.

네 개의 시험 점수를 하나로 묶었습니다. 순서가 중요합니다.

첫 번째가 국어, 두 번째가 영어처럼 각 위치에 의미가 있습니다. grades 변수는 행렬입니다.

세 명의 학생이 세 과목씩 점수를 받았습니다. 가로로 읽으면 한 학생의 모든 과목 점수이고, 세로로 읽으면 한 과목의 모든 학생 점수입니다.

이 구분이 왜 중요할까요? 프로그램에서 데이터를 다룰 때 형태가 맞아야 연산이 가능합니다.

스칼라와 벡터를 곱하는 것은 가능하지만, 크기가 다른 행렬끼리 곱하려면 특별한 규칙을 따라야 합니다. 형태를 모르면 오류의 원인을 찾기 어렵습니다.

실무에서 이미지 데이터를 다룬다고 가정해 봅시다. 흑백 이미지는 2차원 행렬입니다.

각 픽셀의 밝기 값이 행렬의 원소가 됩니다. 컬러 이미지는 빨강, 초록, 파랑 세 개의 행렬이 겹쳐진 3차원 구조입니다.

이렇게 차원이 늘어나면 텐서라고 부르기도 합니다. 김개발 씨는 이제 코드가 달라 보이기 시작했습니다.

변수명에 vector, matrix, scalar가 들어있으면 그 데이터의 형태를 바로 알 수 있게 되었습니다.

실전 팁

💡 - NumPy에서 .shape 속성을 사용하면 배열의 차원을 바로 확인할 수 있습니다

  • 연산 오류가 나면 먼저 양쪽 데이터의 shape를 확인해 보세요

3. 벡터의 덧셈과 뺄셈

김개발 씨는 드디어 게임 캐릭터를 움직이는 코드를 작성하게 되었습니다. 현재 위치에서 이동 방향으로 움직이려면 어떻게 해야 할까요?

박시니어 씨가 힌트를 주었습니다. "벡터 덧셈을 써봐."

벡터의 덧셈과 뺄셈은 같은 위치의 원소끼리 더하거나 빼는 것입니다. 마치 두 개의 힘이 합쳐져서 하나의 결과를 만들어내는 것과 같습니다.

위치에 속도를 더하면 새로운 위치가 되고, 두 점의 위치를 빼면 그 사이의 거리와 방향이 나옵니다.

다음 코드를 살펴봅시다.

import numpy as np

# 현재 위치와 이동 벡터
current_pos = np.array([10, 20])
movement = np.array([5, -3])

# 벡터 덧셈: 새로운 위치 계산
new_pos = current_pos + movement  # [15, 17]
print(f"이동 후 위치: {new_pos}")

# 벡터 뺄셈: 두 점 사이의 방향 벡터
point_a = np.array([3, 4])
point_b = np.array([7, 1])
direction = point_b - point_a  # [4, -3]
print(f"A에서 B로의 방향: {direction}")

# 여러 힘의 합성
force1 = np.array([10, 0])   # 오른쪽으로 10
force2 = np.array([0, 5])    # 위로 5
total_force = force1 + force2  # [10, 5]

드디어 김개발 씨에게 첫 번째 실제 업무가 주어졌습니다. 게임 캐릭터가 화면에서 움직이도록 만드는 것이었습니다.

캐릭터의 현재 위치는 알고 있고, 매 프레임마다 얼마나 이동해야 하는지도 알고 있습니다. 문제는 이 둘을 어떻게 합치느냐였습니다.

박시니어 씨가 간단한 예를 들었습니다. "지금 너 위치가 어디야?" "사무실이요." "집에 가려면?" "음, 동쪽으로 2km, 북쪽으로 3km요." "그럼 집 위치는 사무실 위치 더하기 이동 거리지?" 바로 이것이 벡터 덧셈의 핵심입니다.

현재 위치 벡터에 이동 벡터를 더하면 새로운 위치가 됩니다. 복잡하게 생각할 것 없이, 각 요소를 그냥 더하면 됩니다.

코드를 보면 current_pos가 [10, 20]이고 movement가 [5, -3]입니다. 이 둘을 더하면 [10+5, 20+(-3)] = [15, 17]이 됩니다.

x좌표는 x좌표끼리, y좌표는 y좌표끼리 더한 것입니다. 벡터 뺄셈도 마찬가지입니다.

같은 위치의 원소끼리 빼면 됩니다. 그런데 뺄셈은 특별한 의미가 있습니다.

두 점 A와 B가 있을 때, B - A를 하면 A에서 B로 가는 방향 벡터가 나옵니다. 예를 들어 친구가 (3, 4) 위치에 있고 내가 (7, 1) 위치에 있다면, 친구에서 나에게로 오는 방향은 [7-3, 1-4] = [4, -3]입니다.

오른쪽으로 4, 아래로 3만큼 이동하면 되는 것입니다. 물리 시뮬레이션에서는 힘의 합성에 벡터 덧셈을 사용합니다.

오른쪽으로 미는 힘과 위로 당기는 힘이 동시에 작용하면, 물체는 어떻게 움직일까요? 두 힘 벡터를 더하면 됩니다.

[10, 0] + [0, 5] = [10, 5], 즉 오른쪽 위 대각선 방향으로 움직입니다. 주의할 점이 있습니다.

벡터 덧셈과 뺄셈은 차원이 같은 벡터끼리만 가능합니다. 2차원 벡터와 3차원 벡터는 더할 수 없습니다.

NumPy에서 이런 연산을 시도하면 broadcasting error가 발생합니다. 김개발 씨는 캐릭터 이동 코드를 금방 완성했습니다.

매 프레임마다 위치 벡터에 속도 벡터를 더해주니, 캐릭터가 부드럽게 화면을 가로질러 이동했습니다.

실전 팁

💡 - 이동을 구현할 때는 현재위치 + 속도 * 시간 공식을 기억하세요

  • 두 점 사이의 방향을 알고 싶으면 목표점 - 시작점으로 계산합니다

4. 스칼라 곱

캐릭터 이동은 성공했지만, 새로운 문제가 생겼습니다. 달리기 버튼을 누르면 속도가 2배가 되어야 합니다.

김개발 씨는 속도 벡터의 x와 y를 각각 2배로 만드는 코드를 작성했는데, 박시니어 씨가 더 우아한 방법을 알려주었습니다.

스칼라 곱은 벡터의 모든 원소에 같은 숫자(스칼라)를 곱하는 연산입니다. 마치 레시피의 양을 2인분에서 4인분으로 늘릴 때 모든 재료를 2배로 하는 것과 같습니다.

벡터의 방향은 그대로 유지하면서 크기만 늘리거나 줄일 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np

# 기본 속도 벡터
base_velocity = np.array([3, 4])

# 스칼라 곱: 속도 2배로 증가
sprint_velocity = 2 * base_velocity  # [6, 8]
print(f"달리기 속도: {sprint_velocity}")

# 스칼라 곱: 속도 절반으로 감소
slow_velocity = 0.5 * base_velocity  # [1.5, 2]
print(f"느린 속도: {slow_velocity}")

# 음수 스칼라: 방향 반전
reverse_velocity = -1 * base_velocity  # [-3, -4]
print(f"후진 속도: {reverse_velocity}")

# 실무 예시: 정규화 후 원하는 크기로 조절
direction = np.array([3, 4])
desired_speed = 10
normalized = direction / np.linalg.norm(direction)  # 단위 벡터
final_velocity = desired_speed * normalized  # [6, 8]

김개발 씨의 게임 캐릭터에는 여러 가지 이동 모드가 필요했습니다. 걷기, 달리기, 살금살금 걷기, 그리고 후진까지.

처음에는 각 모드마다 새로운 속도 벡터를 만들려고 했습니다. 박시니어 씨가 말했습니다.

"기본 속도 하나만 만들고, 필요할 때 스칼라 곱을 해. 훨씬 깔끔해질 거야." 스칼라 곱은 단순합니다.

벡터에 숫자 하나를 곱하면, 벡터의 모든 원소가 그 숫자만큼 곱해집니다. [3, 4]에 2를 곱하면 [6, 8]이 됩니다.

마치 확대 복사기를 사용하는 것과 같습니다. 요리에 비유하면 더 쉽게 이해됩니다.

케이크 레시피가 밀가루 200g, 설탕 100g이라면 2배 양을 만들 때는 모든 재료를 2배로 합니다. 밀가루 400g, 설탕 200g.

벡터 [200, 100]에 스칼라 2를 곱한 것과 같습니다. 스칼라 곱의 중요한 특징은 방향은 유지된다는 것입니다.

2를 곱하면 같은 방향으로 2배 멀리 가고, 0.5를 곱하면 같은 방향으로 절반만 갑니다. 방향이 바뀌지 않습니다.

하지만 음수를 곱하면 이야기가 달라집니다. -1을 곱하면 벡터의 방향이 완전히 반대가 됩니다.

[3, 4]가 [-3, -4]가 됩니다. 이것이 게임에서 후진을 구현하는 가장 간단한 방법입니다.

전진 속도에 -1을 곱하면 후진 속도가 됩니다. 0을 곱하면 어떻게 될까요?

모든 원소가 0이 되어 영벡터 [0, 0]이 됩니다. 크기도 0이고, 방향도 정의되지 않습니다.

캐릭터가 멈춰 있는 상태를 나타낼 때 유용합니다. 코드의 마지막 부분은 실무에서 자주 쓰이는 패턴입니다.

먼저 벡터를 정규화(단위 벡터로 만들기)한 다음, 원하는 속도를 곱합니다. 이렇게 하면 방향은 원래대로 유지하면서 정확히 원하는 속도를 얻을 수 있습니다.

김개발 씨는 이 방법으로 코드를 깔끔하게 정리했습니다. base_velocity 변수 하나만 유지하고, 상황에 따라 다른 스칼라를 곱해주니 관리가 훨씬 쉬워졌습니다.

실전 팁

💡 - 음수 스칼라를 곱하면 벡터 방향이 반전됩니다

  • 방향은 유지하고 속도만 바꾸고 싶을 때 스칼라 곱을 활용하세요

5. 벡터의 크기 (노름)

새로운 요구사항이 들어왔습니다. 두 캐릭터 사이의 거리가 일정 범위 안에 들어오면 상호작용이 가능해야 합니다.

김개발 씨는 두 위치 벡터를 빼서 방향 벡터를 구했는데, 그 다음이 막혔습니다. "벡터의 길이는 어떻게 구하죠?"

벡터의 크기(또는 노름, norm)는 벡터가 나타내는 실제 길이입니다. 2차원에서는 피타고라스 정리를 사용하여 구합니다.

[3, 4] 벡터의 크기는 루트(3제곱 + 4제곱) = 5입니다. 이것은 거리 계산, 충돌 감지, 정규화 등 다양한 곳에서 활용됩니다.

다음 코드를 살펴봅시다.

import numpy as np

# 벡터의 크기(노름) 계산
vector = np.array([3, 4])

# 방법 1: NumPy 함수 사용
magnitude = np.linalg.norm(vector)  # 5.0
print(f"벡터의 크기: {magnitude}")

# 방법 2: 수식으로 직접 계산
magnitude_manual = np.sqrt(vector[0]**2 + vector[1]**2)  # 5.0

# 두 점 사이의 거리 계산
player_pos = np.array([10, 20])
enemy_pos = np.array([13, 24])
distance = np.linalg.norm(enemy_pos - player_pos)  # 5.0
print(f"플레이어와 적 사이 거리: {distance}")

# 충돌 감지 예시
interaction_range = 10
if distance < interaction_range:
    print("상호작용 가능!")

김개발 씨는 게임에서 플레이어가 NPC에게 가까이 가면 대화가 시작되도록 만들어야 했습니다. 두 캐릭터의 위치 벡터는 알고 있습니다.

플레이어는 [10, 20], NPC는 [13, 24]. 문제는 이 둘 사이의 실제 거리를 어떻게 구하느냐였습니다.

박시니어 씨가 종이에 그림을 그렸습니다. "중학교 때 배운 피타고라스 정리 기억나?" 직각삼각형의 빗변 길이를 구하는 공식입니다.

가로 길이의 제곱과 세로 길이의 제곱을 더한 후 제곱근을 구하면 됩니다. 벡터 [3, 4]를 좌표 평면에 그려보면, 원점에서 (3, 4) 점까지의 화살표입니다.

이 화살표의 실제 길이가 벡터의 크기 또는 노름입니다. 가로로 3, 세로로 4 이동했으니, 빗변의 길이는 루트(9 + 16) = 루트(25) = 5입니다.

두 점 사이의 거리를 구하는 것도 같은 원리입니다. 먼저 두 위치를 빼서 방향 벡터를 구합니다.

enemy_pos - player_pos = [13-10, 24-20] = [3, 4]. 그 다음 이 벡터의 크기를 구하면 거리가 나옵니다.

NumPy에서는 np.linalg.norm() 함수가 이 모든 계산을 해줍니다. linalg는 linear algebra(선형대수)의 줄임말이고, norm은 노름입니다.

이 함수는 몇 차원 벡터든 상관없이 크기를 계산해줍니다. 3차원 벡터 [1, 2, 2]의 크기는 루트(1 + 4 + 4) = 루트(9) = 3입니다.

차원이 늘어나도 원리는 같습니다. 각 요소를 제곱해서 다 더한 후 제곱근을 구합니다.

실무에서 거리 계산은 정말 많이 사용됩니다. 게임의 충돌 감지, 지도 앱의 현재 위치와 목적지 거리, 추천 시스템의 유사도 계산까지.

두 점(벡터) 사이의 거리를 구하는 것은 프로그래밍의 기본 중 기본입니다. 주의할 점이 있습니다.

거리를 자주 계산해야 한다면 성능을 고려해야 합니다. 제곱근 연산은 비용이 꽤 듭니다.

단순히 두 거리를 비교하는 것이라면 제곱근을 구하지 않고 제곱 상태로 비교해도 됩니다. 김개발 씨는 상호작용 범위 체크 기능을 완성했습니다.

플레이어와 NPC 사이 거리가 10 미만이면 대화창이 열립니다.

실전 팁

💡 - 거리 비교만 필요하다면 제곱 상태로 비교하는 것이 더 빠릅니다

  • 3차원 이상의 벡터도 같은 공식으로 크기를 구할 수 있습니다

6. 단위 벡터

김개발 씨의 게임에 새로운 기능이 필요해졌습니다. 총알이 적을 향해 일정한 속도로 날아가야 합니다.

문제는 적까지의 거리가 매번 다르다는 것입니다. 거리가 멀면 총알이 빨라지고, 가까우면 느려지는 버그가 생겼습니다.

단위 벡터는 크기가 정확히 1인 벡터입니다. 오직 방향만을 나타내며, 원래 벡터를 그 크기로 나누어서 구합니다.

이것을 정규화(normalization)라고 합니다. 단위 벡터에 원하는 속도를 곱하면, 방향은 유지하면서 일정한 속력을 얻을 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np

# 총알의 방향 벡터 (발사 위치에서 목표까지)
bullet_start = np.array([0, 0])
target_pos = np.array([30, 40])
direction = target_pos - bullet_start  # [30, 40]

# 단위 벡터로 정규화
magnitude = np.linalg.norm(direction)  # 50
unit_direction = direction / magnitude  # [0.6, 0.8]
print(f"단위 벡터: {unit_direction}")
print(f"단위 벡터의 크기: {np.linalg.norm(unit_direction)}")  # 1.0

# 원하는 속도로 총알 발사
bullet_speed = 10
bullet_velocity = bullet_speed * unit_direction  # [6, 8]
print(f"총알 속도 벡터: {bullet_velocity}")

# 매 프레임 총알 위치 업데이트
bullet_pos = bullet_start.copy()
for frame in range(5):
    bullet_pos = bullet_pos + bullet_velocity
    print(f"프레임 {frame+1}: {bullet_pos}")

김개발 씨의 버그는 이랬습니다. 총알 속도를 단순히 (목표위치 - 현재위치)로 설정했더니, 멀리 있는 적을 쏘면 총알이 번개처럼 빠르고, 가까운 적을 쏘면 거북이처럼 느렸습니다.

박시니어 씨가 문제를 바로 짚었습니다. "방향과 속도를 분리해야 해.

단위 벡터를 써봐." 단위 벡터는 크기가 정확히 1인 벡터입니다. 순수하게 방향만을 나타냅니다.

어떤 벡터든 단위 벡터로 만들 수 있는데, 이것을 정규화(normalization)라고 부릅니다. 정규화 방법은 간단합니다.

벡터를 자기 자신의 크기로 나눕니다. [30, 40] 벡터의 크기는 50입니다.

이것을 50으로 나누면 [0.6, 0.8]이 됩니다. 이 벡터의 크기를 계산해보면 루트(0.36 + 0.64) = 루트(1) = 1.

정확히 1입니다. 왜 크기가 1이어야 할까요?

크기가 1이면 곱셈의 기준점이 됩니다. 단위 벡터에 10을 곱하면 크기가 10인 벡터가 됩니다.

5를 곱하면 5가 됩니다. 방향은 그대로 유지하면서 원하는 크기를 정확하게 만들 수 있습니다.

이것을 일상에 비유하면 이렇습니다. "동쪽으로"와 "동쪽으로 10km"의 차이입니다.

단위 벡터는 "동쪽으로"처럼 순수한 방향만 나타냅니다. 여기에 거리를 곱하면 원하는 만큼의 이동이 됩니다.

위 코드에서 총알의 발사 방향은 [30, 40]이었습니다. 하지만 이대로 속도로 쓰면 너무 빠릅니다.

그래서 먼저 단위 벡터 [0.6, 0.8]로 정규화했습니다. 그 다음 원하는 속도 10을 곱해서 최종 속도 [6, 8]을 얻었습니다.

이제 목표가 [30, 40]에 있든 [3, 4]에 있든 총알 속도는 항상 10입니다. 방향만 달라질 뿐입니다.

머신러닝에서도 정규화는 핵심 개념입니다. 서로 다른 스케일의 데이터를 같은 기준으로 맞출 때 사용합니다.

키(cm)와 몸무게(kg)를 함께 사용한다면, 둘 다 정규화해서 공정하게 비교할 수 있게 만듭니다. 주의할 점이 있습니다.

영벡터 [0, 0]은 정규화할 수 없습니다. 크기가 0인 벡터를 0으로 나누면 오류가 발생합니다.

코드에서 이 경우를 처리해야 합니다. 김개발 씨는 버그를 완벽하게 수정했습니다.

이제 총알은 적이 어디에 있든 항상 일정한 속도로 날아갑니다.

실전 팁

💡 - 정규화 전에 벡터가 영벡터인지 확인하세요 (0으로 나누기 오류 방지)

  • 방향과 속도를 분리해서 관리하면 코드가 훨씬 유연해집니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#Vector#LinearAlgebra#NumPy#Mathematics#Math,Linear Algebra

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.