StaticArrays.jl icon indicating copy to clipboard operation
StaticArrays.jl copied to clipboard

cholesky() behaves differently with static matrices

Open ojwoodford opened this issue 1 year ago • 0 comments

Below I create identical non-Hermitian matrices of types Matrix and SMatrix, then call cholesky() with check=false, i.e. don't throw errors.

using LinearAlgebra, StaticArrays
mat = randn(10, 10)
v = rand(10)
mat -= v * v'
smat = SMatrix{10, 10, Float64, 100}(mat)
using LinearAlgebra, StaticArrays
mat = randn(10, 10)
v = rand(10)
mat -= v * v'
smat = SMatrix{10, 10, Float64, 100}(mat)
display(issuccess(cholesky(mat; check=false)))  # No error
display(issuccess(StaticArrays._cholesky(Size(smat), smat, false)))  # No error
display(issuccess(cholesky(smat; check=false)))  # Error

The Base implementation throws no error, as expected. However, the StaticArrays implementation throws a PosDefException error.

There is an issue with line 4 of src/cholesky.jl. I believe it should be:

!check || ishermitian(A) || non_hermitian_error()

The penultimate line of my script suggests this will work. However, there should probably be a test case or two to confirm.

I would submit a PR request, but I haven't yet started building and developing Julia and the standard library locally yet, and don't think I'm ready to start quite yet.

ojwoodford avatar Sep 12 '23 20:09 ojwoodford