아다마르 곱
1. 개요
아다마르 곱은 같은 크기의 두 행렬에서 각 요소별로 곱셈을 수행하는 연산이다. 두 행렬의 아다마르 곱은 교환, 결합, 분배 법칙을 따르며, 모든 성분이 1인 행렬은 아다마르 곱의 항등원 역할을 한다. 아다마르 곱은 슈어-오펜하임 부등식과 같은 중요한 성질을 가지며, JPEG 압축, 이미지 처리, 기계 학습, 통계 분석 등 다양한 분야에 응용된다. 프로그래밍 언어에서는 다양한 방식으로 구현되며, MATLAB, 줄리아, 파이썬, C++, GAUSS, 포트란 등에서 지원된다.
| 이름 | 아다마르 곱 |
|---|---|
| 다른 이름 | Schur 곱 (Schur product) 요소별 곱 (element-wise product) 점별 곱 (pointwise product) 성분별 곱 (entrywise product) |
| 분야 | 선형대수학 |
| 정의 | 두 행렬의 같은 위치의 요소끼리 곱하는 연산 |
|---|---|
| 표기법 | A ∘ B A ⊙ B A ⊛ B A ◦ B |
| 조건 | 두 행렬의 크기가 같아야 함 |
| 예시 | 행렬 A와 B의 아다마르 곱은 다음과 같음. |
|---|
이미지 준비중입니다.
| 교환 법칙 | 성립 (A ∘ B = B ∘ A) |
|---|---|
| 결합 법칙 | 성립 (A ∘ (B ∘ C) = (A ∘ B) ∘ C) |
| 분배 법칙 | 성립 (A ∘ (B + C) = A ∘ B + A ∘ C) |
| 항등원 | 모든 성분이 1인 행렬 |
| 크로네커 곱과의 관계 | (A ⊗ B) ∘ (C ⊗ D) = (A ∘ C) ⊗ (B ∘ D) |
| 콤팩트 형식 | vec(A ∘ B) = Diag(vec(A)) vec(B) |
| 활용 분야 | 이미지 압축 손실 압축 알고리즘 신경망 |
|---|
| 주의사항 | 일반적인 행렬 곱셈과는 다름 |
|---|
-
이항연산 -
뺄셈
뺄셈은 두 수의 관계를 나타내는 연산으로, 덧셈의 역연산이며, 피감수에서 감수를 빼는 연산으로 차를 구하고, 반교환법칙과 결합 법칙은 성립하지 않으며, 다양한 계산 방법과 함께 여러 분야에서 활용된다. -
이항연산 -
나눗셈
나눗셈은 하나의 수를 다른 수로 나누어 몫과 나머지를 구하는 기본적인 산술 연산이다. -
행렬론 -
행렬식
행렬식은 정사각 행렬에 대해 정의되는 값으로, 선형 방정식의 해를 구하고 선형 독립성을 확인하며 기저의 방향과 부피를 계산하는 데 사용되며, 가우스 소거법 등의 계산 기법과 가역성 판단, 고유값 연관성 등의 성질을 갖는다. -
행렬론 -
행렬 분해
행렬 분해는 주어진 행렬을 특정 성질을 갖는 여러 행렬의 곱으로 표현하는 방법으로, 수치 해석에서 행렬 알고리즘 구현 및 선형 연립 방정식 해를 구하거나 행렬 특성 분석에 활용되며 LU 분해, QR 분해, 특잇값 분해 등이 있다. -
행렬 -
스핀 (물리학)
스핀은 양자역학적 각운동량으로, 양자화된 값을 가지며 자기 쌍극자 모멘트를 유발하여 다양한 분야에 응용되고 스핀트로닉스 기술 발전에 기여하지만, 전자의 스핀 기원은 아직 완전히 밝혀지지 않았다. -
행렬 -
파울리 행렬
파울리 행렬은 양자역학에서 스핀을 나타내는 데 사용되는 에르미트 행렬이자 유니타리 행렬로, 행렬식은 -1이고 대각합은 0이며, 리 대수의 생성원이자 파울리 벡터로 정의되어 다양한 물리학 분야에서 활용된다.
2. 정의
환의 성분을 갖는, 같은 크기 의 두 행렬 이 주어졌을 때, 과 의 아다마르 곱은 다음과 같이 정의된다.
:
즉, 두 행렬의 아다마르 곱은 각 성분별 곱으로 정의된다. 아다마르 곱은 (또는 )로 표기하며, 와 같이 나타낼 수 있다.
크기가 다른 두 행렬에 대해서는 아다마르 곱이 정의되지 않는다.
3. 성질
아다마르 곱은 교환 법칙, 결합 법칙, 덧셈에 대한 분배 법칙을 만족한다. 즉, 임의의 행렬 와 스칼라 에 대해 다음이 성립한다.
:
:
:
:
:
모든 성분이 1인 행렬은 아다마르 곱의 항등원이 된다. 이는 주 대각선의 요소만 1인 일반 행렬 곱셈에서의 항등 행렬과는 다르다. 행렬의 모든 성분이 가역원이라면, 아다마르 곱에 대한 역원을 갖는다.
두 대칭 행렬의 아다마르 곱은 대칭 행렬이 된다. 두 복소수 에르미트 행렬의 아다마르 곱은 에르미트 행렬이 된다. 아다마르 곱은 크로네커 곱의 주요 부분 행렬이다.
3.1. 슈어-오펜하임 부등식
두 양의 준정부호 에르미트 행렬이 주어졌을 때, 슈어-오펜하임 부등식(Schur–Oppenheim inequality영어)에 따르면 다음이 성립한다.
* 은 역시 양의 준정부호 에르미트 행렬이다.
*
두 양의 반정부호 행렬의 아다마르 곱은 양의 반정부호 행렬이다. 이는 러시아 수학자 이사히 슈어의 이름을 딴 슈어 곱 정리로 알려져 있다. 두 양의 반정부호 행렬 와 에 대해, 아다마르 곱의 행렬식이 각 행렬의 행렬식의 곱보다 크거나 같다는 것도 알려져 있다.
:
3.2. 벡터와의 관계
벡터 x와 y, 그리고 이 벡터들을 주 대각선으로 하는 해당 대각 행렬 및 에 대해 다음 항등식이 성립한다.
:
여기서 는 의 켤레 전치를 나타낸다. 특히, 1의 벡터를 사용하면, 아다마르 곱의 모든 요소의 합이 의 대각합임을 보여준다. 여기서 위첨자 T는 전치 행렬을 나타낸다. 즉,
:이다.
정사각 행렬 및 에 대한 관련 결과는 아다마르 곱의 행 합이 의 대각 요소라는 것이다.
:
마찬가지로,
:
또한 아다마르 행렬-벡터 곱은 다음과 같이 표현할 수 있다:
:
여기서 은 행렬 의 대각선에서 형성된 벡터이다.
두 벡터 와 의 아다마르 곱은 다른 벡터에 의한 한 벡터의 해당 대각 행렬의 행렬 곱셈과 동일하다.
:
벡터를 대각 행렬로 변환하는 연산자(operator)는 아다마르 곱을 사용하여 다음과 같이 표현할 수 있다.
:
여기서 은 요소가 인 상수 벡터이고 는 항등 행렬이다.
3.3. 다른 연산과의 관계
* 아다마르 곱은 (가환환에서 작업할 때) 교환 가능하고 결합적이며 덧셈에 대해 분배적이다. 즉, A, B, C가 동일한 크기의 행렬이고 k가 스칼라일 경우:
::
* 두 행렬의 아다마르 곱에 대한 항등 행렬은 모든 요소가 1인 행렬이다. 이는 주 대각선의 요소만 1인 일반 행렬 곱셈에서의 항등 행렬과 다르다. 또한 아다마르 곱에서 행렬은 요소 중 0이 아닌 경우에만 역행렬을 갖는다.
* 벡터 와 및 이러한 벡터를 주 대각선으로 하는 해당 대각 행렬 및 에 대해 다음 항등식이 성립한다.
::
: 여기서 는 의 켤레 전치를 나타낸다. 특히, 1의 벡터를 사용하여, 이는 아다마르 곱의 모든 요소의 합이 의 대각합임을 보여준다. 여기서 위첨자 T는 전치 행렬을 나타낸다. 즉,
:: 이다.
: 정사각 행렬 및 에 대한 관련 결과는 아다마르 곱의 행 합이 의 대각 요소라는 것이다.
::
: 마찬가지로,
::
: 또한 아다마르 행렬-벡터 곱은 다음과 같이 표현할 수 있다:
::
: 여기서 은 행렬 의 대각선에서 형성된 벡터이다.
* 아다마르 곱은 크로네커 곱의 주요 부분 행렬이다.
* 와 가 대각 행렬이면
::
* 두 벡터 와 의 아다마르 곱은 다른 벡터에 의한 한 벡터의 해당 대각 행렬의 행렬 곱셈과 동일하다.
::
* 벡터를 대각 행렬로 변환하는 연산자 는 아다마르 곱을 사용하여 다음과 같이 표현할 수 있다.
::
: 여기서 은 요소가 인 상수 벡터이고 는 항등 행렬이다.
아다마르 곱과 다른 행렬 곱 연산자와의 관계는 다음과 같다.
* 만약 가 크로네커 곱이고, 가 와, 가 와 같은 차원을 가진다고 가정하면, 다음이 성립한다.
::
* 만약 이 페이스-분할 곱이라면, 다음이 성립한다.
::
* 만약 가 열별 카트리-라오 곱이라면, 다음이 성립한다.
::
4. 프로그래밍 언어에서의 구현
MATLAB에서 아다마르 곱은 "점 곱"으로 표시되며, `a .* b` 또는 `times(a, b)` 함수 호출로 나타낸다. `a .^ b` 및 `a ./ b`와 같은 유사한 점 연산자도 사용 가능하다.
줄리아는 MATLAB과 유사하게 아다마르 곱을 `a .* b`로 표시하며, "브로드캐스트 곱셈"이라고 한다. 다른 연산자도 요소별로 정의되어, 아다마르 거듭제곱은 `a .^ b`를 사용한다.
파이썬은 기본 배열 지원이 없어 표기법이 일관되지 않다. NumPy 수치 라이브러리는 아다마르 곱을 `a*b` 또는 `a.multiply(b)`로 해석하고, 행렬 곱은 `a@b` 또는 `a.matmul(b)`를 사용한다. SymPy 기호 라이브러리에서는 `array` 객체의 곱셈이 `a*b` 또는 `a@b`로 행렬 곱을 생성하며, 아다마르 곱은 `a.multiply_elementwise(b)` 메서드 호출을 통해 얻을 수 있다.
C++에서는 Eigen 라이브러리가 `Matrix` 클래스에 대한 `cwiseProduct` 멤버 함수(`a.cwiseProduct(b)`)를 제공하며, Armadillo 라이브러리는 연산자 `%`를 사용해 `a % b`로 표현한다. (`a * b`는 행렬 곱)
GAUSS와 HP Prime에서는 이 연산을 배열 곱셈이라고 한다.
포트란, R, APL, J 및 울프람 언어 (Mathematica)에서 곱셈 연산자 `*` 또는 `×`는 아다마르 곱을 적용한다. 반면 행렬 곱은 각각 `matmul`, `%*%`, `+.×`, `+/ .*` 및 `.`을 사용하여 작성한다. R 패키지 [https://cran.r-project.org/web/packages/matrixcalc/matrixcalc.pdf matrixcalc]는 숫자 행렬 또는 벡터의 아다마르 곱에 대한 함수 `hadamard.prod()`를 제공한다.
| 프로그래밍 언어 | 아다마르 곱 표기 | 행렬 곱 표기 |
|---|---|---|
| MATLAB | `a .* b` 또는 `times(a, b)` | `a * b` |
| 줄리아 | `a .* b` | 해당사항 없음 |
| NumPy | `a*b` 또는 `a.multiply(b)` | `a@b` 또는 `a.matmul(b)` |
| SymPy | `a.multiply_elementwise(b)` | `a*b` 또는 `a@b` |
| Eigen (C++) | `a.cwiseProduct(b)` | 해당사항 없음 |
| Armadillo (C++) | `a % b` | `a * b` |
| GAUSS | 배열 곱셈 | 해당사항 없음 |
| HP Prime | 배열 곱셈 | 해당사항 없음 |
| 포트란 | `*` | `matmul` |
| R | `*` 또는 `hadamard.prod()` | `%*%` |
| APL | `×` | `+.×` |
| J | `*` | `+/ .*` |
| 울프람 언어 (Mathematica) | `*` 또는 `×` | `.` |
5. 응용
아다마르 곱은 JPEG와 같은 손실 압축 알고리즘에 사용된다. 디코딩 단계는 항목별 곱셈, 즉 아다마르 곱을 포함한다.
이미지 처리에서 아다마르 연산자는 이미지 영역을 향상시키거나, 억제하거나, 마스킹하는 데 사용할 수 있다. 하나의 행렬은 원본 이미지를 나타내고, 다른 행렬은 가중치 또는 마스킹 행렬 역할을 한다.
이는 기계 학습 문헌에서 GRU 또는 LSTM과 같은 순환 신경망의 아키텍처를 설명하는 데 사용된다.
또한 임의 벡터와 행렬의 통계적 특성을 연구하는 데 사용된다.
V. 슬류사르의 정의에 따르면, p×g 행렬 와 p×g 블록()을 가진 n차원 행렬 (n > 1)의 침투 면 곱은 다음과 같은 형태의 크기의 행렬이다:
: