이제까지는 행렬 및 행렬 연산에 대해서 공부했습니다.
이제는 "벡터"에 대해서 배워보도록 하겠습니다.
벡터, Vector
- Vector를 이제부터는 행렬의 형태로 표현하도록 하겠습니다.
※ Vector의 정의
- 방향(Direction)을 가진다.
- 크기(Magnitude) 혹은 길이(Length)를 가진다.
예를 들어, 다음과 같이 벡터 a, 즉, [3,4]가 있다고 생각해 보겠습니다.
위 식은 열벡터(Column vector)로 표현한 것이지만, a = [3 4]와 같이 행벡터(Row vector)로도 표현할 수 있습니다.
이 벡터는 원점에서 [3,4]를 향하는 방향과 크기가 있습니다. 아래 그림과 같이 표현할 수 있겠습니다.
커다란 행렬을 통하여 열벡터(혹은 행벡터의 모음으로도 나타낼 수 있습니다.
가령,
K는 Column vectors의 집합이라면, 각 벡터는 두 개의 원소를 가집니다. (2차원 공간)
K가 만약, 행벡터의 집합이라면, K는 3차원 공간입니다.
따라서, K1 = [1, 0, 3], K2 = [-2, 1, 4]입니다.
벡터 모음과 관련된 부분은 크게 중요한 부분은 아니니 이해만 빠르게 하시고 넘어가셔도 좋을 것 같습니다.
벡터의 연산, Vector Operation
벡터 연산에서 다룰 내용은
'더하기, 빼기, 곱하기' 입니다.
1) 더하기 Addition
벡터 덧셈을 그래프로 표현해 보겠습니다.
먼저, a(-1,2) 끝 점에서 b의 크기와 방향인 (3,4)만큼 이동한것이 a+b의 끝점이 되겠습니다.
그래프로 나타내면 아래와 같습니다.
2) 빼기 Subtraction
빼기는 어떨까요?
a는 그대로 입니다. b의 경우 -b를 취합니다. 그리고, a와 -b를 더한 것과 같이 그래프의 끝을 이어주면 아래와 같이 나타낼 수 있습니다.
직접 그려보시면 아주 큰 도움이 되실 겁니다.
마지막으로,
3) 곱섹, Multiply
행렬의 곱셈에서는 내적(Dot Product)를 다루도록 하겠습니다.
결과적으로, 행렬 내적의 결과는 Scalar입니다.
위 연산은 행렬로 표현하면 아래와 같이 표현할 수 있습니다.
물론, b를 행벡터, a를 열벡터로 해도 결과는 같습니다.
추가.
이번 시간에는 3가지 그래프가 나왔죠. 파이썬 코드로 어떻게 구현했는지 공유 드리며 글을 마치도록 하겠습니다. 감사합니다.
1. Vector Graph
import matplotlib.pyplot as plt
# 원점에서 (3,4)를 향하는 벡터의 시작점과 끝점 좌표
start = (0, 0)
end = (3, 4)
# 벡터를 표현하기 위한 X, Y 좌표
X = [start[0], end[0]]
Y = [start[1], end[1]]
# 좌표 평면 그리기
fig, ax = plt.subplots(figsize=(6, 6))
# x축과 y축 그리기
ax.axhline(0, color='black',linewidth=0.5)
ax.axvline(0, color='black',linewidth=0.5)
# 원점에서 (3,4)를 향하는 벡터 그리기
ax.quiver(*start, *end, angles='xy', scale_units='xy', scale=1, color='b')
# X, Y 축 레이블 추가
ax.set_xlabel('X')
ax.set_ylabel('Y')
# 그래프 범위 설정
ax.set_xlim(-1, 4)
ax.set_ylim(-1, 5)
plt.grid() # 격자 표시
plt.title('Vector a') # 그래프 제목
plt.show()
2. 벡터의 덧셈
import matplotlib.pyplot as plt
import numpy as np
# 벡터 a와 벡터 b의 값
a = np.array([-1, 2])
b = np.array([3, 4])
# 벡터 a와 벡터 b의 시작점은 모두 원점 (0, 0)
start = np.array([0, 0])
# 벡터 a와 벡터 b의 끝점 계산
end_a = start + a
end_b = start + b
# 벡터 a와 벡터 b를 좌표 평면에 그리기
plt.figure(figsize=(6, 6))
# x축과 y축 그리기
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
# 벡터 a와 벡터 b 그리기
plt.quiver(*start, *a, angles='xy', scale_units='xy', scale=1, color='k', label='vector a')
plt.quiver(*start, *b, angles='xy', scale_units='xy', scale=1, color='k', label='vector b')
# 벡터 a의 끝점에서 시작하고 크기가 벡터 b와 같은 벡터 그리기
plt.quiver(*end_a, *b, angles='xy', scale_units='xy', scale=1, color='g', label='vector b')
plt.quiver(*start, *c, angles='xy', scale_units='xy', scale=1, color='r', label='a+b')
# 그래프 범위 설정
plt.xlim(-2, 4)
plt.ylim(-1, 6)
# 벡터 레이블 추가
plt.xlabel('X')
plt.ylabel('Y')
# 벡터 레이블 표시
plt.legend()
# 그래프 보여주기
plt.grid()
plt.title('Vector addition')
plt.show()
3. 벡터의 뺄셈
import matplotlib.pyplot as plt
import numpy as np
# 벡터 a와 벡터 b의 값
a = np.array([-1, 2])
b = np.array([3, 4])
# 벡터 a, 벡터 b, -b, a-b의 값 계산
neg_b = -b
a_minus_b = a - b
# 벡터 a, 벡터 b, -b, a-b의 시작점은 모두 원점 (0, 0)
start = np.array([0, 0])
# 벡터 a, 벡터 b, -b, a-b의 끝점 계산
end_a = start + a
end_b = start + b
end_neg_b = start + neg_b
end_a_minus_b = start + a_minus_b
# 벡터들을 좌표 평면에 그리기
plt.figure(figsize=(8, 8))
# x축과 y축 그리기
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
# 벡터 a, 벡터 b, -b, a-b 그리기
plt.quiver(*start, *a, angles='xy', scale_units='xy', scale=1, color='k', label='a')
plt.quiver(*start, *b, angles='xy', scale_units='xy', scale=1, color='k', label='b')
plt.quiver(*start, *neg_b, angles='xy', scale_units='xy', scale=1, color='r', label='-b')
plt.quiver(*start, *a_minus_b, angles='xy', scale_units='xy', scale=1, color='b', label='a-b [-4, -2]')
# 그래프 범위 설정
plt.xlim(-5, 5)
plt.ylim(-5, 5)
# 벡터 레이블 추가
plt.xlabel('X')
plt.ylabel('Y')
# 벡터 레이블 표시
plt.legend()
# 그래프 보여주기
plt.grid()
plt.title('Vector Subtraction')
plt.show()
'공부 > C++' 카테고리의 다른 글
백준 알고리즘 1004번, 어린왕자 (C++) (0) | 2024.01.08 |
---|---|
백준 1008번 (C++) (3) | 2024.01.01 |
C++ 백준 1002번 (1) | 2023.12.25 |
선형 대수 - 13. 선형 부분공간 (4) | 2023.11.02 |
C++과 Python의 차이, 컴파일 언어와 인터프리터 언어의 차이 (83) | 2023.09.07 |
C++, printf 이용하여 string 출력 (0) | 2022.12.08 |
C++, Vector Clear (내용 비우기) (0) | 2022.11.03 |
make: Nothing to be don for 'all' - 해결 방법 (0) | 2022.08.23 |