11

4x4 매트릭스를 반전시키고 싶습니다. 내 번호는 고정 소수점 형식으로 저장됩니다 (정확히 1.15.16).반전 4x4 매트릭스 - 가장 안정적인 수치의 솔루션이 필요합니다.

부동 소수점 산술을 사용하면 보통 adjoint 행렬을 만들고 행렬식으로 나누기 만하면됩니다 (예 : 솔루션에 무차별 대입). 지금까지는 저에게 효과적 이었지만, 고정 소수점 수를 다룰 때는 사용 된 곱셈으로 인해 용인 할 수없는 정밀도 손실이 발생했습니다.

참고 : 고정 소수점 연산에서 나는 항상 즉각적인 결과의 최하위 비트 중 일부를 버립니다.

매트릭스를 뒤집을 수있는 가장 안정적인 방법은 무엇입니까? 성능에 대해서는별로 신경 쓰지 않지만 단순히 부동 소수점으로가는 것은 타겟 아키텍처에서 느려지는 것입니다.

+0

은 매트릭스의 크기가 대략 비슷한 요소의 크기입니까? –

+0

아니요 - 안타깝게도 그들은 모두 제자리에 있습니다. –

+0

매트릭스에 대한 대략적인 조건 번호가 있습니까? 제 응답에서 인용 한 종이는 8x8 또는 32x32 행렬에 대한 것이기는하지만 몇 백개의 조건 수까지 성공했습니다. 따라서 이보다 더 잘할 수 있습니다. –

답변

5

이 답변은 매트릭스의 정확한 형태에 달려 있다고 생각합니다. 피벗 (필수)을 사용하는 표준 분해 방법 (LU, QR, Cholesky 등)은 특히 작은 4x4 매트릭스의 경우 고정 점에서 상당히 좋습니다. Press et al.의 'Numerical Recipes'책을 참조하십시오. 이러한 메서드에 대한 설명은

This paper은 유용한 알고리즘을 제공하지만 불행히도 유료화 벽 뒤에 있습니다. 여기에 나열하기에는 너무 복잡한 몇 가지 추가 기능이있는 (피벗 팅) 숄레 스키 분해를 권장합니다.

0

평범한 오래된 가우시안 제거가 잘 작동합니다.

사용중인 라이브러리/클래스/구조에 따라 다릅니다. GSL을 살펴볼 수 있습니다.

1

잘라 내기 오류 및 기타 불량을 최소화하려면 "피벗 팅"을 사용하십시오 (숫자 작성법의 행렬 반전에 관한 장 참조). 그들은 지금까지 찾은 최고의 설명을 가지고 있습니다.

14

메타 답변 : 정말 일반적인 4x4 매트릭스입니까? 행렬에 특별한 형식이있는 경우 반전을위한 직접 수식이 빠르며 작업 횟수를 줄입니다. 예를 들어

, 그것은 만약 표준 균질 같은 그래픽에서 변환 좌표

[ux vx wx tx] 
[uy vy wy ty] 
[uz vz wz tz] 
[ 0 0 0 1] 

이다

는 다음 easily-derivable direct formula을 거기 (회전, 스케일의 조성 변환 행렬을 가정)

[ux uy uz -dot(u,t)] 
[vx vy vz -dot(v,t)] 
[wx wy wz -dot(w,t)] 
[ 0 0 0  1 ] 

(ASCII 페이지는 링크 된 페이지에서 도난당했습니다.)

고정 소수점에서 정밀도가 떨어지면이 점을 이길 수 없을 것입니다.

매트릭스가 더 많은 구조를 가지고있는 일부 도메인에서 나온다면 쉬운 대답 일 가능성이 있습니다.

+3

스케일링 요인이 관련되어 있다면 이것이 작동하지 않는다고 생각합니까? – Alnitak

-2

행렬이 아핀 변환을 나타내는 경우 (배율 구성 요소를 도입하지 않는 한 4x4 행렬에서 여러 번 사용되는 경우가 많음) 역수는 단순히 마지막 열이 무효화 된 상위 3x3 회전 부분의 전치입니다 . 분명히 일반화 된 솔루션이 필요한 경우 가우스 제거를 조사하는 것이 가장 쉽습니다.

+0

이 답변은 사실이 아닙니다. 똑같은 방향으로 가고있는 Adrian의 anwer를보십시오. – Suma

1

일반적인 알고리즘을 수행하기 전에 1.31로 두 배가되는 것을 고려해보십시오.그것은 곱셈의 수를 두 배로 늘릴 것입니다. 그러나 여러분은 행렬을 거꾸로 처리하고 있습니다. 여러분이하는 일은 프로세서의 곱셈기에 꽤 연관 될 것입니다.

4x4 반전에 대한 방정식을 찾는 데 관심이있는 사용자는 기호식 수학 패키지를 사용하여 문제를 해결할 수 있습니다. TI-89는 몇 분이 걸릴지라도 그것을 수행 할 것입니다.

매트릭스 반전이 당신에게 어떤 영향을 미치는지, 그리고 나머지 처리 과정과 어떻게 다른지 생각해 보면 대안을 제안 할 수 있습니다. -Adam

+0

심볼릭 수학 프로그램을 사용하면 일반 매트릭스를 뒤집을 수 있으며 훨씬 더 쉽게 계산할 수있는 수식을 제공해야합니다. – Karl

2

나 다른 질문을 물어 보자 : 당신은 확실히 행렬을 반전해야합니까 (그것을 M 전화), 또는 다른 방정식을 해결하기 위해 매트릭스 역을 사용해야합니까? (예 : 알려진 M, b의 경우 Mx = b) 종종 역수를 명시 적으로 필요로하는이 작업을 수행하는 다른 방법이 있습니다. 또는 행렬 M이 시간의 함수라면 &은 천천히 변화합니다. 그리고 나서 역함수를 한번 계산하면 &을 반복적으로 업데이트 할 수 있습니다.

5

Jason S가 제기 한 질문에 두 번째 질문을 드리고 싶습니다. 매트릭스를 뒤집을 필요가 있습니까? 이것은 거의 필요하지 않습니다. 뿐만 아니라 종종 나쁜 생각입니다. Ax = b를 풀 필요가 있다면, 역수로 b를 곱하는 것보다 직접적으로 시스템을 푸는 것이 수치 적으로 안정합니다.

많은 b 값에 ​​대해 Ax = b를 계속해서 풀어야하는 경우에도 A를 반대로 변환하는 것은 좋은 생각이 아닙니다. 인수 A (예 : LU 인수 분해 또는 콜레 스키 인수 분해) 매번 그 작업을 다시하지는 ​​않겠지 만, 분해를 사용하여 매번 시스템을 풀 수 있습니다.