2013-04-17 64 views
13

Tôi tự hỏi tại sao có sự khác biệt về dấu hiệu trong kết quả cho tính toán SVD trong Matlab và OpenCV. Tôi nhập cùng một ma trậnKết quả tính toán SVD khác nhau trong Matlab và OpenCV

  3.65E+06 -2.09E+06 0 
YY = -2.09E+06 2.45E+06 0 
      0   0   0 

[U,S,V] = svd(YY);//Matlab 


     -0.798728902689475 0.601691066917623 0 
    V = 0.601691066917623 0.798728902689475 0 
     0     0     1 

cv::SVD::compute(YY, S, U, V);//opencv 

    0.798839 -0.601544 0 
V = 0.601544 0.798839 0 
    0   0   1 

Tôi biết rằng họ sử dụng cùng một bản ngã, tại sao có sự khác biệt về dấu hiệu? Cảm ơn

Trả lời

12

Bạn đang sử dụng phiên bản OpenCV nào?

Từ http://code.opencv.org/issues/1498 có vẻ như các phiên bản gần đây của OpenCV không còn sử dụng LAPACK để làm SVD (như được sử dụng bởi Matlab, tôi nghĩ). Giả thiết rằng thuật toán tương tự đang được sử dụng có thể không chính xác.

Tất nhiên YY = U S V '

Nếu bạn phủ nhận các cột đầu tiên của U và V:

U(:,1)=-U(:,1); 
V(:,1)=-V(:,1) 

Bạn sẽ tìm thấy U S V' vẫn bằng YY. Điều này phù hợp với trường hợp cụ thể của bạn vì YY là đối xứng (YY = YY ').

2

Giá trị số ít Phân hủy chỉ được xác định tối đa một dấu; các dấu hiệu của U và V là tùy ý, và nếu chúng khác nhau giữa MATLAB và OpenCV không chỉ ra một vấn đề.

3

Kết quả của SVD không cần phải là duy nhất. Ví dụ, I = UIV 'cho bất kỳ đơn vị V = U. Ví dụ bạn đưa ra ở trên đặc biệt là thiếu hụt cấp, vì vậy không có lý do để mong đợi tính duy nhất.

Các vấn đề liên quan