isposdef() 声称某些(尽管不是全部)半正定矩阵在不是正定矩阵时是正定矩阵:
julia> A = [1.69 2.21; 2.21 2.89]
2×2 Array{Float64,2}:
1.69 2.21
2.21 2.89
julia> det(A)
0.0
julia> isposdef(A)
true
julia> isposdef(ones(2,2))
false
我不确定是什么导致了这种行为——看起来 isposdef() 试图对矩阵进行 Cholesky 分解,并且所有正半定矩阵都有 Cholesky 分解(尽管 IIRC 没有找到它们的通用算法) . 在我看来,用类似的东西来实现 Sylvestor 的标准会更简单
sylvestor(A) = issymmetric(A) & all([det(A[1:j, 1:j]) > 0 for j = 1:size(A)[1]])
版本信息:
julia> versioninfo()
Julia Version 0.5.0
Commit 3c9d753 (2016-09-19 18:14 UTC)
Platform Info:
System: NT (x86_64-w64-mingw32)
CPU: Intel(R) Xeon(R) CPU E3-1240 v3 @ 3.40GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
LAPACK: libopenblas64_
LIBM: libopenlibm
LLVM: libLLVM-3.7.1 (ORCJIT, haswell)
Cholesky 分解计算期间的舍入可能会导致这种情况。 通常,不可能可靠地测试浮点矩阵的奇异性。 您提供的矩阵在其二进制浮点表示中实际上不是奇异的
julia> det(big(A))
2.13162820728030047872728228063319445882714347172137703267935663215914838016073e-16
行列式在数值计算中通常非常不可靠,因为这些项增长得如此之快,因此西尔弗斯特的标准并不实用。 在数值计算中,通过 Cholesky 进行的测试在大多数情况下都是您想要的,而且它相当便宜,所以我认为我们不会改变它。 但是,扩展文档以解释该方法可能是一个好主意,也可以使用此处的示例来显示限制。 我会将文档标签添加到问题中。
@andreasnoack这可以是这里情况的摘要。 批准后,我会将其与示例一起添加到文档中。
isposdef(A) → 布尔型
使用 Cholesky 分解测试矩阵是否为正定矩阵,因为 Sylvester 的标准变得不切实际,因为大数的行列式计算不可靠。 在奇异(不可逆)正半定浮点矩阵的情况下,由于 Cholesky 因式分解和矩阵的非奇异二进制浮点表示中涉及舍入,该函数可能无法按预期工作。
我认为没有必要提及西尔维斯特的标准。
最有用的评论
Cholesky 分解计算期间的舍入可能会导致这种情况。 通常,不可能可靠地测试浮点矩阵的奇异性。 您提供的矩阵在其二进制浮点表示中实际上不是奇异的
行列式在数值计算中通常非常不可靠,因为这些项增长得如此之快,因此西尔弗斯特的标准并不实用。 在数值计算中,通过 Cholesky 进行的测试在大多数情况下都是您想要的,而且它相当便宜,所以我认为我们不会改变它。 但是,扩展文档以解释该方法可能是一个好主意,也可以使用此处的示例来显示限制。 我会将文档标签添加到问题中。