Inge Söderkvist (2009) có một bài viết hay về giải quyết vấn đề chuyển động cơ thể cứng nhắc bằng cách phân tách giá trị số ít (SVD).
Giả sử chúng ta đang trao 3D điểm rằng sau khi vị trí nhiễu loạn mất { y 1 , ... , y n } tương ứng. Chúng tôi tìm kiếm một "chuyển động" cứng nhắc, tức là xoay R và dịch d kết hợp, áp dụng cho các điểm x i để giảm thiểu tổng bình phương của "lỗi":{ x1, Lọ , xn}{ y1, ... , yn}RdxTôi
Σi = 1n| | R xTôi+ d- yTôi| |2
Hãy nghĩ đến những điểm như cột, và quay R như một 3 × 3 ma trận trực giao. Nói một cách chính xác, chúng tôi yêu cầu det ( R ) = 1 vì khi chuyển động liên tục, một vòng quay sẽ bảo toàn "hướng" của các điểm, tức là sẽ không liên quan đến việc phản xạ chúng.xTôi, yTôiR3 × 3tách ( R ) = 1
Bước đầu tiên là trừ đi các phương tiện tương ứng từ các điểm x i , y i , có tác dụng "loại bỏ" (hiện tại) bản dịch chưa biết . Đó là, vấn đề trở thành:x¯¯¯, y¯¯¯xTôi, yTôid
tối thiểuR ∈ SÔ ( 3 )| | RA-B | |F
nơi và . Ở đây biểu thị nhóm ma trận xoay trực giao đặc biệt trong 3D, chúng ta được phép chọn từ và định mức ma trận ở đây biểu thị định mức Frobenius , tức là căn bậc hai của tổng bình phương của các mục ma trận (như Euclide định mức, nhưng trên các mục ma trận).A = [ x1- x¯¯¯, Lọ , xn- x¯¯¯]S O ( 3 ) R FB = [ y1- y¯¯¯, ... , yn- y¯¯¯]SÔ ( 3 )RF
Bây giờ đều là ma trận . Giảm thiểu ở trên là một vấn đề Procrustes trực giao chỉ cho phép ma trận xoay. Giải pháp được đưa ra bằng cách lấy phân tách giá trị số ít của ma trận "hiệp phương sai" :3 × n R C = B A TA , B3 × nRC= B AT
C= USVT
Trong đó là ma trận trực giao và là ma trận đường chéo của các giá trị số ít . Các gói đại số tuyến tính số như Matlab và Octave sẽ tính toán SVD cho bạn.S = diag ( σ 1 , σ 2 , σ 3 ) σ 1 ≥ σ 2 ≥ σ 3 ≥ 0Bạn, VS= diag ( σ1, σ2, σ3)σ1≥ σ2≥ σ3≥ 0
Khi chúng ta có SVD, xác định trong đó dấu hiệu trong yếu tố giữa được chọn để tạo . Thông thường, một ứng dụng trong thế giới thực sẽ có det ( R ) = 1 det ( U V T ) = 1R = Udiag ( 1 , 1 , ± 1 ) VTtách ( R ) = 1det ( UVT) = 1 , và do đó, dấu hiệu được chọn sẽ là dương. Nếu không, điều đó có nghĩa là trực giao tốt nhất (bảo toàn khoảng cách) phù hợp với các điểm mới liên quan đến sự phản chiếu và nó gợi ý kiểm tra dữ liệu cho các lỗi.
Cuối cùng, chúng tôi xác định bản dịchd= y¯¯¯- R x¯¯¯ . Làm xong!
Biến thể của các vấn đề Procrustes trực giao trong đó chỉ cho phép quay cũng là chủ đề của một bài viết Wikipedia khác về thuật toán Kabsch . Ký hiệu trong các bài viết Wikipedia khác với chúng ta nhân với ở bên phải, thay vì (như ở đây) ở bên trái.R