When studying the code of Lapacke, I found that DGESDD calls DBDSDC (
which does the divide and conquer of bidiagonal matrix. When DBDSDC handles
bidiagonal matrix, it first check if the diagonal value less than machine
epsilon (in line 403 - 407) and upscale the small values. My question is
that whether the upscale operation is needed.
My conjectures for this upscale operation is either speedup the program or
numerical stability reason. I've tried to debug for both reasons, but
cannot find evidence for either cases.
For speedup, originally I thought the upscale will produce many same value
of diagonal entries, and this can help deflation later. But in reality,
those upscaled values are so small that it's not even calculated in the
deflation part. Instead, those are considered to be singular value directly
in the program.
For numerical stability, I tried using broken arrow matrix A (so I can
control the singular values and condition number) and adding some noise
delta_A. I find that small noise won't affect the leading singular values
no matter I have the upscale or not. Noise only affects those small
singular values, but it didn't show instability if I turn off this upscale
operation. In addition, we found that in our application, if we comment the
upscale out, we can achieve higher accuracy, such that DGESDD is comparable
Thank you very much for any suggestion.
-------------- next part --------------
An HTML attachment was scrubbed...