Matrix 检查给定秩的矩阵是半正定的(Julia)

Matrix 检查给定秩的矩阵是半正定的(Julia),matrix,julia,linear-algebra,numeric,Matrix,Julia,Linear Algebra,Numeric,我正在编写一个函数,用于检查矩阵X是否是具有给定秩k的半正定矩阵。为此,我计算了X的特征值,并检查其中k的特征值是否为正,其余的特征值是否为0。以下是我目前掌握的情况: using LinearAlgebra function ispossemdef(X::AbstractMatrix, k::Int, ϵ::Real = 1e-10) n = size(X, 1) # dim of X !issymmetric(X) &

我正在编写一个函数,用于检查矩阵
X
是否是具有给定秩
k
的半正定矩阵。为此,我计算了
X
的特征值,并检查其中
k
的特征值是否为正,其余的特征值是否为0。以下是我目前掌握的情况:

using LinearAlgebra    

function ispossemdef(X::AbstractMatrix, k::Int, ϵ::Real = 1e-10)

    n = size(X, 1)                   #  dim of X

    !issymmetric(X) && return false  #  short-circuit if X is asymmetric
    k > n && error("k > n")          #  throw error if k > n

    eigs = eigvals(X)                #  eigenvalues of X in ascending order

    z = eigs[1:(n - k)]              #  the values that should be zero
    p = eigs[(n - k + 1):end]        #  the values that should be positive

    n_minus_k_zero_eigenvalues = norm(z) < ϵ
    k_positive_eigenvalues     = all(p .> ϵ)

    return n_minus_k_zero_eigenvalues & k_positive_eigenvalues

end
使用线性代数
函数ispossemdef(X::AbstractMatrix,k::Int,ϵ::Real=1e-10)
n=尺寸(X,1)#X的尺寸
!issymmetric(X)&返回false#如果X不对称,则短路
k>n&&error(“k>n”)#如果k>n则抛出错误
eigs=eigvals(X)#X的特征值升序
z=eigs[1:(n-k)]#应为零的值
p=EIG[(n-k+1):结束]#应为正值的值
n_减去k_零特征值=范数(z)<ϵ
k_正特征值=all(p.>ϵ)
返回n_负k_零特征值和k_正特征值
结束
有没有更好的算法?更好可能意味着更快(避免计算特征值),或者在数值上更稳定(让我可以更严格地容忍错误)


例如,
isposdef
函数(这是我正在做的事情的
k=n
特例)通过尝试计算
X
的Cholesky因子,并报告是否可以。我能把这个过程推广到半定矩阵吗?如果是这样,它比检查特征值好吗?

它不会对所有矩阵都起作用,但是你看过了吗

using LinearAlgebra   # for julia 1+

help> isposdef

在isposdef()函数中?

当然可以。我试图将它推广到具有指定秩的半定矩阵。isposdef的工作原理是尝试计算矩阵的Cholesky因子,并报告其是否成功。不确定这个过程如何推广到半定矩阵。如果是这样,而且比我现在做的更好,那就是我想知道的事情。编辑问题以提及这一点。如果矩阵是
对称的
Hermitian的
,您已经在代码中确保了这一点,那么您不能使用
eigvals
,其值边界为
0
Inf
。如果存在负特征值,可以使用结果的
length
进行检查。如果矩阵根本不是PSD,那么这可能会运行得更快,因为不会计算负特征值。如果需要将矩阵复制到
对称
Hermitian
矩阵中,则可能需要使用,因为原始矩阵不会受到影响。这可能是Math StackExchange的一个问题。