행렬 0x09: 벡터의 노름 (Norm)
벡터의 노름 (Norm)
노름은 벡터의 크기를 측정하는데 사용된다. 노름은 다양한 유형이 존재하고, 각각은 용도와 특성이 다르다.
정의
$ R^n $공간에서 벡터 $ X = (x_1, x_2, …, x_n) $의 노름 $ ∥X∥ $은 다음과 같은 성질을 만족한다.
-
비음성 조건: $ ∥X∥ ≥ 0 $이다. 음이 아닌 값으로 사상(mapping)하고, 복소수 요소의 벡터라도 노름은 음이 아닌 실수이다.
-
삼각 부등식: 벡터 $ X, Y $에 대해 $ ∥X + Y∥ ≤ ∥X∥ + ∥Y∥ $이다.
-
동차성: 스칼라 값 $ a $와 벡터 $ X $에 대해 $ ∥aX∥ = ∣α∣∥Y∥ $이다.
$L^1$ 노름 (맨하탄 노름)
알고리즘 문제에 자주 등장하는 멘하탄 거리와 같은 의미이다. $L^1$ 노름은 모든 요소의 절대값 합으로 정의된다. 맨하탄 거리라고도 불린다.
$L^2$ 노름 (유클리드 노름)
$L^2$ 노름은 벡터의 각 요소의 제곱의 합의 제곱근으로 정의된다. 쉽게 설명하자면 원점으로부터의 유클리드 거리를 의미한다. $L^2$ 노름은 제곱근이 필요하기 때문에 컴퓨터 과학적인 측면에서 제곱근을 없앤 제곱$L^2$ 노름이 더 유리하다.
$L^∞$ 노름 (최대 노름)
$L^∞$ 노름은 벡터의 요소 중 절대값이 가장 큰 값으로 정의된다.
C++ 구현
template<class K, u64 N>
f32 Vector<K, N>::NormManhattan(const Vector& vector)
{
f32 res = f32();
for (int i = 0; i < N; ++i)
{
res = res + (vector[i] < 0 ? -vector[i] : vector[i]);
}
return res;
}
template<class K, u64 N>
f32 Vector<K, N>::NormEuclidean(const Vector& vector)
{
f32 res = f32();
for (int i = 0; i < N; ++i)
{
res = res + (vector[i] * vector[i]);
}
return tk3::sqrtf(res);
}
template<class K, u64 N>
f32 Vector<K, N>::NormSupremum(const Vector& vector)
{
f32 res = f32();
for (int i = 0; i < N; ++i)
{
res = (tk3::abs(vector[i]) > res) ? tk3::abs(vector[i]) : res);
}
return res;
}
Leave a comment