有没有更快的方法来检查是否是肯定的比
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*Np
通常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