2016-12-22 2 views
0

Ich möchte überprüfen, ob eine Matrix positiv definit ist oder nicht. Ich habe im Internet gesucht, wie man es mit Matlab überprüft. Ich interessiere mich für die Verwendung der chol Möglichkeit zur Überprüfung (nicht die Eigenwerte eins überprüfen). Im Folgenden sind die Codes:Bestimmen einer Matrix als positiv definit

[~, r] = chol(A); 
r == 0 && rank(A) == size(A,1) 

Ich weiß, dass, wenn A nicht positiv definit ist, dann r positiv ist. Was ist jedoch der Zweck der Überprüfung rank(A)==size(A,1)? Es scheint, dass es funktioniert immer noch, wenn ich nur die folgenden Codes verwenden:

[~, r] = chol(A); 
r == 0 % check if r>0 

Ich frage mich, ob A positive semi-definite Matrix ist, r==0. Wenn ich jedoch A=[1,0;0,0] als Beispiel verwende, unter Verwendung der obigen Codes zur Überprüfung, r = 2 > 0. Das macht es mir unangenehm, den Rang zu überprüfen.

Ich fand diesen Code here.

+0

In Ihrem Fall, ich denke einfach, dass r nicht gleich Null ist, weil ‚Chol‘, heißt es, dass „wenn A positiv definit ist“ nicht nur semidefinit . – marcoresk

+0

Rank-defiziente Matrizen sind definitionsgemäß nicht positiv definit. Deshalb gibt dein Beispiel 'A'' r> 0' an - positiv * semi * -definite wird von 'chol' einfach nicht als speziell angesehen. Sie haben Recht, dass die explizite Rangprüfung überflüssig ist –

Antwort

0

Warum nicht die 1-output variant of chol verwenden? Dies führt zu einem Fehler, wenn A nicht positiv ist.

können Sie diese Tatsache wie folgt verwenden:

function itis = isPositiveDefinite(A) 

    % Input checks 
    errId = @(str) [mfilename ':' str]; 

    assert(isnumeric(A) && ~isempty(A),... 
      errId('invalid_argument'),... 
      'Input argument must be a non-empty numeric matrix.'); 

    % Initialize 
    itis = true; 

    % Trivial cases 
    if ~isequal(A.', A) || any(~isfinite(A(:))) || any(~isreal(A(:))) 
     itis = false; 

    % Less trivial cases -- use chol() 
    else 
     try 
      [~] = chol(double(A)); 
     catch ME 
      if strcmp(ME.identifier, 'MATLAB:posdef') 
       itis = false; 
      else 
       baseME = MException(errId('chol_failure'), [... 
            'Failed to determine whether matrix is ',... 
            'positive definite.']); 

       throw(addCause(baseME, ME)); 
      end 
     end 
    end 

end 
Verwandte Themen