Julia: isposdef() 不正确

创建于 2017-01-12  ·  3评论  ·  资料来源: JuliaLang/julia

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)
doc linear algebra

最有用的评论

Cholesky 分解计算期间的舍入可能会导致这种情况。 通常,不可能可靠地测试浮点矩阵的奇异性。 您提供的矩阵在其二进制浮点表示中实际上不是奇异的

julia> det(big(A))
2.13162820728030047872728228063319445882714347172137703267935663215914838016073e-16

行列式在数值计算中通常非常不可靠,因为这些项增长得如此之快,因此西尔弗斯特的标准并不实用。 在数值计算中,通过 Cholesky 进行的测试在大多数情况下都是您想要的,而且它相当便宜,所以我认为我们不会改变它。 但是,扩展文档以解释该方法可能是一个好主意,也可以使用此处的示例来显示限制。 我会将文档标签添加到问题中。

所有3条评论

Cholesky 分解计算期间的舍入可能会导致这种情况。 通常,不可能可靠地测试浮点矩阵的奇异性。 您提供的矩阵在其二进制浮点表示中实际上不是奇异的

julia> det(big(A))
2.13162820728030047872728228063319445882714347172137703267935663215914838016073e-16

行列式在数值计算中通常非常不可靠,因为这些项增长得如此之快,因此西尔弗斯特的标准并不实用。 在数值计算中,通过 Cholesky 进行的测试在大多数情况下都是您想要的,而且它相当便宜,所以我认为我们不会改变它。 但是,扩展文档以解释该方法可能是一个好主意,也可以使用此处的示例来显示限制。 我会将文档标签添加到问题中。

@andreasnoack这可以是这里情况的摘要。 批准后,我会将其与示例一起添加到文档中。
isposdef(A) → 布尔型
使用 Cholesky 分解测试矩阵是否为正定矩阵,因为 Sylvester 的标准变得不切实际,因为大数的行列式计算不可靠。 在奇异(不可逆)正半定浮点矩阵的情况下,由于 Cholesky 因式分解和矩阵的非奇异二进制浮点表示中涉及舍入,该函数可能无法按预期工作。

我认为没有必要提及西尔维斯特的标准。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mbauman picture mbauman  ·  276评论

StefanKarpinski picture StefanKarpinski  ·  113评论

StefanKarpinski picture StefanKarpinski  ·  249评论

juliohm picture juliohm  ·  146评论

StefanKarpinski picture StefanKarpinski  ·  138评论