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