치환 행렬이 포함된 표현식
치환 행렬이 포함된 표현식 (Expressions Involving Permutation Matrices)
P*M처럼 치환 행렬과 일반 행렬을 곱하면 행과 열을 원하는 대로 뒤섞을 수 있어요. 이 표현식들이 어떻게 동작하는지, 그리고 어떤 연산이 효율적으로 처리되는지를 차근차근 살펴볼게요.
출처: 문서
본문
P가 치환 행렬이고 M이 일반 행렬일 때, 표현식 P*M은 M의 행을 치환해요. 마찬가지로 M*P는 열을 치환한 결과를 주고요. 행렬 나눗셈 P\M과 M/P는 역치환(inverse permutation)을 수행할 때 쓸 수 있어요.
앞에서 배운 치환 행렬 생성 문법은 사실 치환 행렬과 치환 벡터 사이의 연결을 이해하는 데 도움을 줘요. I = eye (n)을 단위 행렬이라고 하면 다음 식이 성립해요.
I(p,:) * M = (I*M) (p,:) = M(p,:)
마찬가지로,
M * I(:,p) = (M*I) (:,p) = M(:,p)
여기서 I(p,:)와 I(:,p)가 바로 치환 행렬이에요.
치환 행렬은 전치(transpose)하거나 켤레 전치(conjugate-transpose)할 수 있는데, 치환 행렬은 절대 복소수가 아니므로 둘은 동일해요. 이 연산은 치환을 뒤집어서, 행 치환 행렬을 열 치환 행렬로 바꿔 줍니다. 치환 행렬의 경우 전치는 역과 동일하므로 P\M은 P'*M과 같아요. 치환 행렬의 전치(또는 역)는 내부적으로 플래그만 뒤집는 상수 시간(constant-time) 연산이라서, 위의 두 동등 표현 중 어느 쪽을 쓰든 사용자 취향에 온전히 달려 있어요.
치환 행렬과의 곱셈·나눗셈은 희소 행렬과 결합할 때도 효율적으로 동작해요. 즉 P*S(여기서 P는 치환 행렬, S는 희소 행렬)는 희소 행렬의 행을 치환하면서 희소 행렬을 그대로 반환해요. S*P, P\S, S/P도 마찬가지로 동작합니다.
크기가 맞다면 두 치환 행렬은 곱하거나 나눌 수 있고, 이는 치환의 합성(composition)을 수행해요. 또한 치환 행렬을 치환 벡터(또는 두 벡터)로 인덱싱할 수 있는데, 그 결과 역시 치환 행렬이 돼요. 그 외의 연산은 일반적으로 치환 행렬을 만들지 않으므로 암묵적인 변환(implicit conversion)을 촉발해요.
더 알아보기
- 치환 행렬의 생성 문법은 치환 행렬 생성 항목을 참고하세요.
- 희소 행렬에서의 연산 동작도 함께 보면 좋아요.