2012-11-18 11 views
5

मैं MATLAB में एक क्यूआर अपघटन एल्गोरिदम कोडिंग कर रहा हूं, यह सुनिश्चित करने के लिए कि मेरे पास यांत्रिकी सही है।गिवर रोटेशन का उपयोग कर क्यूआर अपघटन एल्गोरिदम

function [Q,R] = QRgivens(A) 
     n = length(A(:,1)); 
     Q = eye(n); 
     R = A; 

     for j = 1:(n-1) 
      for i = n:(-1):(j+1) 
       G = eye(n); 
       [c,s] = GivensRotation(A(i-1,j),A(i,j)); 
       G(i-1,(i-1):i) = [c s]; 
       G(i,(i-1):i) = [-s c]; 
       Q = Q*G'; 
       R = G*R; 
      end 
     end 
    end 

उप समारोह GivensRotation नीचे दिया गया है: यहाँ मुख्य कार्य के लिए कोड है

function [c,s] = GivensRotation(a,b) 
     if b == 0 
      c = 1; 
      s = 0; 
     else 
      if abs(b) > abs(a) 
       r = -a/b; 
       s = 1/sqrt(1 + r^2); 
       c = s*r; 
      else 
       r = -b/a; 
       c = 1/sqrt(1 + r^2); 
       s = c*r; 
      end 
     end 
    end 

मैं शोध किया है और मैं बहुत यकीन है कि यह सबसे सरल उपाय है कर रहा हूँ विशेष रूप से MATLAB में, इस अपघटन को लागू करने के लिए। लेकिन जब मैं इसे मैट्रिक्स ए पर परीक्षण करता हूं, तो आर उत्पादित त्रिकोणीय नहीं है जैसा कि होना चाहिए। क्यू ऑर्थोगोनल है, और क्यू * आर = ए, इसलिए एल्गोरिदम कुछ चीजें सही कर रहा है, लेकिन यह बिल्कुल सही कारक बनाने का उत्पादन नहीं कर रहा है। शायद मैं इस समस्या पर बहुत लंबे समय से देख रहा हूं, लेकिन जो कुछ मैंने अनदेखा किया है, उसकी कोई सराहना की जाएगी।

+0

विश्वास मैं त्रुटि पाया है। 'क्यू = क्यू * जी 'के बजाय; आर = जी * आर; 'मुझे लिखा जाना चाहिए' क्यू = क्यू * जी; आर = जी '* आर' matrices पर transposes उलटा करने में, मैंने प्रभावी दिशा में घूर्णन प्रभावी ढंग से किया, जिससे एक अलग कारक बनाने का उत्पादन किया। –

उत्तर

9

इस अधिक बग हो रहा है, क्या मैं देख रहा हूँ:

  1. आप बल्कि का उपयोग करना चाहिए [सी, एस] = GivensRotation (आर (i-1, जे), आर (i, j)) ; (नोट, ए के बजाय आर)
  2. मूल गुणक क्यू = क्यू * जी '; आर = जी * आर सही हैं।
  3. आर = ए/बी और आर = बी/ए (शून्य के बिना, यह सुनिश्चित नहीं है कि यह महत्वपूर्ण है)
  4. जी ([i-1, i], [i-1, i]) = [c -s ; एस सी];

यहां एक उदाहरण कोड है, काम करने लगता है।

पहले फ़ाइल,

% qrgivens.m 
function [Q,R] = qrgivens(A) 
    [m,n] = size(A); 
    Q = eye(m); 
    R = A; 

    for j = 1:n 
    for i = m:-1:(j+1) 
     G = eye(m); 
     [c,s] = givensrotation(R(i-1,j),R(i,j)); 
     G([i-1, i],[i-1, i]) = [c -s; s c]; 
     R = G'*R; 
     Q = Q*G; 
    end 
    end 

end 

और दूसरा

% givensrotation.m 
function [c,s] = givensrotation(a,b) 
    if b == 0 
    c = 1; 
    s = 0; 
    else 
    if abs(b) > abs(a) 
     r = a/b; 
     s = 1/sqrt(1 + r^2); 
     c = s*r; 
    else 
     r = b/a; 
     c = 1/sqrt(1 + r^2); 
     s = c*r; 
    end 
    end 

end 
संबंधित मुद्दे