2016-12-22 55 views
0

我想檢查一個矩陣是否是正定的。我在網上搜索瞭如何使用matlab來檢查它。我有興趣使用chol的方式來檢查(不檢查特徵值之一)。下面是代碼:確定一個矩陣是肯定的

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

我知道,如果A不是正定的,則​​r爲正。但是,檢查rank(A)==size(A,1)有什麼意義?它似乎仍然有效,如果我只是使用下面的代碼:

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

不知A是半正定矩陣,r==0。但是,如果我使用A=[1,0;0,0]作爲示例,請使用上面的代碼進行檢查,r = 2 > 0。這讓我在檢查排名時感到不舒服。

我發現這個代碼here

+0

在你的情況,我簡單地認爲r不等於零,因爲「哲」指出,「如果A是正定」不僅半定。 – marcoresk

+0

根據定義,秩虧矩陣不是正定的。這就是爲什麼你的例子'A'給出'r> 0' - 正*半* -definite根本不被'chol'認爲是特殊的。你是對的,明確的排名檢查是多餘的 –

回答

0

爲什麼不使用1-output variant of chol?當A不是肯定的時,這會引發錯誤。

您可以使用這一事實是這樣的:

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