我想检查矩阵是否为正定确定。我已经在Internet上搜索了如何使用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
。这使我对检查排名感到不舒服。
我在这里找到了此代码。
为什么不使用 chol
的1输出变体?当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