행렬 0x09: 벡터의 노름 (Norm)

벡터의 노름 (Norm)

노름은 벡터의 크기를 측정하는데 사용된다. 노름은 다양한 유형이 존재하고, 각각은 용도와 특성이 다르다.

정의

$ R^n $공간에서 벡터 $ X = (x_1, x_2, …, x_n) $의 노름 $ ∥X∥ $은 다음과 같은 성질을 만족한다.

  1. 비음성 조건: $ ∥X∥ ≥ 0 $이다. 음이 아닌 값으로 사상(mapping)하고, 복소수 요소의 벡터라도 노름은 음이 아닌 실수이다.

  2. 삼각 부등식: 벡터 $ X, Y $에 대해 $ ∥X + Y∥ ≤ ∥X∥ + ∥Y∥ $이다.

  3. 동차성: 스칼라 값 $ 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;
}

Categories:

Updated:

Leave a comment