在超平面上检查正定性

计算科学 线性代数 二次规划
2021-12-14 19:11:00

有没有更快的方法来检查是否ARn×n是肯定的b:={xRn:xb=0}

function foo(A,b)
    N = null(b);
    e = eig(N'*A*N);
    return all(e>0);
end
1个回答

代替e = eig(N'*A*N);,您可以使用[R,p]=chol(N'*A*N);,并测试p==0Matlab 函数chol返回cholesky 因子R和如果是正定的p则为零。如果矩阵不是正定的,则​​为正整数。N'*A*Np

通常choleig. 例如,使用 dimension n=2000,我发现它chol(N'*A*N)eig(N'*A*N)(使用 Octave 而不是 Matlab 测试)快大约 10 倍。

矩阵乘积N'*A*N的计算成本相对较高。使用稀疏基可能会N更快b: 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