Reading e.g. this paper: "New fast and accurate Jacobi SVD algorithm: I. LAPACK working note" by Drmac and Veselic, www.netlib.org/lapack/lawnspdf/lawn169.pdf Stuff worth considering: * TFA claims that QR preconditioning makes JacobiSVD converge faster, and that a second LQ applied to R helps even more. * Parallelization (block Jacobi SVD). However there is also lots of stuff that we DON'T want: * TFA claims that the second LQ does not need to be pivoting. But that will necessarily reduce the reliability of the algorithm. So if we do a LQ, either make it non-default or make it pivoting. * Large parts of TFA are about how working on the transposed matrix is more numerically stable: this is an artifact of them doing one-sided Jacobi SVD. Since our JacobiSVD is two-sided, we don't need to bother about this. The fact that they worry about this is quite a testament to how real the issues with one-sided Jacobi are!
One small change that I would suggest is to use a different stopping criterion. The Jacobi SVD can achieve higher relative accuracy than other Jacobi SVD methods, at least according to this paper: http://www.netlib.org/lapack/lawnspdf/lawn15.pdf In order to achieve this accuracy, however, I believe the stopping criterion of JacobiSVD would have to be changed. If I understand the code correctly, the current stopping criterion compares the off-diagonal values to the largest diagonal entry: n*eps*max[i](S[i,i]) >= max[i != j]( S[i,j] ) The aforementioned paper suggests a stopping criterion along the lines of: n*eps >= max[i != j]( |S[i,j]| / sqrt|S[i,i]*S[j,j]| ) The paper however only covers the symmetric case. Not sure how to generalize this to the non-symmetric case. My guess would be something like n*eps >= max[i != j]( max{|S[i,j]|,|S[j,i]|} / sqrt|S[i,i]*S[j,j]| )
-- GitLab Migration Automatic Message -- This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity. You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/101.