2016-12-22 2 views
0

행렬이 양의 값인지 아닌지를 확인하고 싶습니다. 나는 그것을 matlab을 사용하여 확인하는 방법에 대한 인터넷 검색했다. 나는 확인을 위해 chol 방법을 사용하는 것에 관심이있다 (eigenvalues를 검사하지 않음). 아래 코드는 다음과 같습니다긍정적 인 명확한 행렬 결정

[~, 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가 0이 아니라고 생각 . – marcoresk

+0

랭크가 부족한 행렬은 정의에 의해 정의가 명확하지 않습니다. 그래서 당신의 예제'A'는'r> 0'을줍니다 - 긍정 * semi * -deffinite는 단순히'chol'에 의해 특별한 것으로 간주되지 않습니다. 명백한 서열 검사가 불필요하다는 것은 맞습니다. –

답변

0

1-output variant of chol을 사용하지 않으시겠습니까? A이 양의 값이 아닌 경우 오류가 발생합니다.

이 같은 사실을 사용할 수 있습니다 : '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 
관련 문제