有没有更快的方法来检查是否是肯定的比
function foo(A,b)
N = null(b);
e = eig(N'*A*N);
return all(e>0);
end
有没有更快的方法来检查是否是肯定的比
function foo(A,b)
N = null(b);
e = eig(N'*A*N);
return all(e>0);
end
代替e = eig(N'*A*N);
,您可以使用[R,p]=chol(N'*A*N);
,并测试p==0
。Matlab 函数chol
返回cholesky 因子R
和如果是正定的p
则为零。如果矩阵不是正定的,则为正整数。N'*A*N
p
通常chol
比eig
. 例如,使用 dimension n=2000
,我发现它chol(N'*A*N)
比eig(N'*A*N)
(使用 Octave 而不是 Matlab 测试)快大约 10 倍。
矩阵乘积N'*A*N
的计算成本相对较高。使用稀疏基可能会N
更快: Matlab/Octave 代码:
function r = foo2(A,b)
[dummy,p] = sort(abs(b),"descend");
A = A(p,p);
m = size(A,1);
b = b(p);
N = [b(2:m)/-b(1);speye(m-1,m-1)]; % now b*N = 0
[L,p] = chol(N'*A*N);
r = (p==0);
end