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的一个问题。