Quick Flow
정규직교 기저는 서로 수직이고 각각 길이가 1인 기저입니다. Gram–Schmidt는 이미 만든 축의 성분을 빼고, 남은 벡터를 정규화합니다.
u₁ = a₁, q₁ = u₁ / ‖u₁‖
u₂ = a₂ - (q₁·a₂)q₁
q₂ = u₂ / ‖u₂‖
분모가 0이면 새 독립 방향을 얻지 못한 것이므로 정규화하지 않음두 벡터의 직교화
a₁=(1,1,0), a₂=(1,0,1)에서 시작합니다. 첫 벡터를 정규화하고, 둘째에서 첫 축으로의 투영을 제거합니다.
q₁ = (1,1,0)/√2
q₁·a₂ = 1/√2
u₂ = (1,0,1) - (1/√2)q₁
= (1/2,-1/2,1)
‖u₂‖ = √6/2
q₂ = (1,-1,2)/√6q₁·q₂=0이고 두 길이는 1입니다. 새 두 축은 원래 두 벡터가 만들던 평면을 그대로 생성합니다. 입력 순서를 바꾸면 얻는 기저는 달라질 수 있지만 생성 공간이 바뀌는 것은 아닙니다.
여러 축과 QR
k번째 입력에서 앞서 얻은 모든 qᵢ 방향의 투영을 뺍니다. uₖ=aₖ−Σ(qᵢ·aₖ)qᵢ를 계산한 뒤 정규화합니다. 중간 잔차가 0이면 입력 묶음이 독립이라는 전제가 깨집니다. 생성 공간의 기저를 찾는 목적이라면 그 종속 벡터를 제외하고 나머지 입력을 계속 처리합니다. 입력 전체가 독립이어야 하는 절차라면 조건 불충족으로 처리합니다. 부동소수점의 작은 잔차는 허용오차·입력 크기를 함께 고려합니다.
열로 모은 A를 Q와 R로 나타내면 A=QR입니다. Q의 열은 정규직교 벡터, R은 각 원래 열의 좌표를 담는 위삼각행렬입니다. 앞의 두 입력에서는 다음과 같습니다.
Q = [q₁ q₂]
R = [ √2 1/√2 ]
[ 0 √6/2 ]
A = QRQ가 3×2이면 QᵀQ=I₂이지만 QQᵀ는 3차원 전체의 단위행렬이 아닙니다. QQᵀ는 두 열이 만드는 평면으로의 직교 투영입니다. 정사각 직교행렬에서만 역행렬과 전치를 그대로 동일시하는 조건이 완성됩니다.
카메라 축과 방향
3차원에서 이미 얻은 정규직교 두 축에 외적을 사용해 세 번째 축을 만들 수 있습니다. 외적의 순서는 좌표계의 방향을 결정합니다. 기저를 직교화했다고 언제나 원래 원하던 앞·오른쪽·위 방향과 부호까지 자동으로 일치하지는 않습니다.
거의 평행한 입력은 투영 제거 후 아주 작은 벡터를 남깁니다. 이를 정규화하면 작은 입력 오차가 방향을 크게 바꿀 수 있습니다. 대체 up 방향을 선택하는 등의 그래픽스 정책과 수치적 안정성을 함께 고려합니다.
수치 알고리즘 선택
손 계산용 고전적 Gram–Schmidt와 컴퓨터에서 사용하는 안정적인 QR 구현을 구분합니다. 수정 Gram–Schmidt나 Householder 기반 QR 같은 방법은 반올림 오차의 누적을 다르게 다룹니다. 정규화만 반복해도 직교성이 항상 유지된다고 가정하지 않습니다.
수직 투영의 행렬은 직교 투영, QR로 푸는 근사 문제는 최소제곱, 기저가 숫자 표현을 바꾸는 관계는 기저와 좌표에 있습니다.
정규직교 축으로 구성하는 회전·반사와, 정규직교 고유기저가 보장되는 대칭행렬을 구분하면 축을 선택하는 목적이 더 분명해집니다.
참고 링크
2 sources