确定矩阵是正定的

时间:2016-12-22 06:55:01

标签: matlab matrix linear-algebra

我想检查矩阵是否为正定。我在互联网上搜索了如何使用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

1 个答案:

答案 0 :(得分: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