Peder We have a fix for the hdf5 complex reader here if you want to give it a try https://gitlab.com/petsc/petsc/-/merge_requests/4044
Sorry it took so long and thank you for reporting the bug > On Apr 29, 2021, at 2:55 PM, Peder Jørgensgaard Olesen via petsc-users > <petsc-users@mcs.anl.gov> wrote: > > Thank you for your advice, Jose. > > I tried using a single column of the data matrix as a basis for left singular > vector space, and a row for the right one - and lo and behold, all singular > vectors become real. > > Somehow it did not occur to me that I was I was looking at was simply a > complex phase on U and V which would cancel upon computing UΣV*. In other > words, rather than an incorrect result it was a slightly inconvenient > representation of a correct result. > > Best regards > Peder > Fra: Jose E. Roman <jro...@dsic.upv.es> > Sendt: 29. april 2021 13:00:03 > Til: Peder Jørgensgaard Olesen > Cc: petsc-users@mcs.anl.gov > Emne: Re: [petsc-users] SLEPc: non-real singular vectors from SVD of real > matrix > > In complex scalars there is no way of knowing if the user-provided matrix is > real or not. If there was an option of MatSetOption() we could use it. > > If you set a real initial vector with SVDSetInitialSpaces(), then most > probably the computed singular vectors will be real. But still rounding > errors could introduce a nonzero imaginary part. > > In any case, you could normalize the computed singular vectors, as is done > for instance in FixSign() in this > examplehttps://slepc.upv.es/documentation/current/src/nep/tutorials/ex20.c.html > <https://slepc.upv.es/documentation/current/src/nep/tutorials/ex20.c.html> > > Jose > > > > El 29 abr 2021, a las 12:42, Peder Jørgensgaard Olesen via petsc-users > > <petsc-users@mcs.anl.gov> escribió: > > > > Hello > > > > I've noticed that doing a singular value decomposition of a real matrix > > appears to result in non-real singular vectors. This should not be the case > > - singular vectors of a real matrix must be real-valued. > > > > In the example attached I read a matrix from a binary file (also attached), > > perform the SVD, and write singular vectors to an HDF5 file which I > > subsequently inspect using h5dump, revealing non-zero imaginary parts of > > vector elements as highlighted below: > > [pjool@svol mwes]$ h5dump -d U0_sample_svd -c "5,2" sample_svecs.h5 > > HDF5 "sample_svecs.h5" { > > DATASET "U0_sample_svd" { > > DATATYPE H5T_IEEE_F64LE > > DATASPACE SIMPLE { ( 882, 2 ) / ( 882, 2 ) } > > SUBSET { > > START ( 0, 0 ); > > STRIDE ( 1, 1 ); > > COUNT ( 5, 2 ); > > BLOCK ( 1, 1 ); > > DATA { > > (0,0): 0.0226108, 0.0299595, > > (1,0): 0.035414, 0.0469237, > > (2,0): 0.0276317, 0.0366122, > > (3,0): 0.0145344, 0.0192581, > > (4,0): 0.0110376, 0.0146249 > > } > > } > > ATTRIBUTE "complex" { > > DATATYPE H5T_STD_I32LE > > DATASPACE SCALAR > > DATA { > > (0): 1 > > } > > } > > } > > } > > I also extract the imaginary part of the input matrix and print its norm to > > ensure that the matrix is indeed real. > > > > I'm running v3.14, but I don't believe that alone should cause the issue, > > since it what I'm trying to do appears like a rather common and basic task. > > > > What might be the reason behind this behavior, and what can be done to > > resolve it? > > > > > > Med venlig hilsen / Best Regards > > > > Peder Jørgensgaard Olesen > > PhD Student, Turbulence Research Lab > > Dept. of Mechanical Engineering > > Technical University of Denmark > > Niels Koppels Allé > > Bygning 403, Rum 105 > > DK-2800 Kgs. Lyngby > > <read_bin.c><sample_data>