dcwuser / metanumerics

Meta.Numerics is library for advanced numerical computing on the .NET platform. It offers an object-oriented API for statistical analysis, advanced functions, Fourier transforms, numerical integration and optimization, and matrix algebra.
http://www.meta-numerics.net
101 stars 28 forks source link

RectangularMatrix.SingularValueDecomposition fails in certain cases #56

Open Alex-Konnen opened 5 years ago

Alex-Konnen commented 5 years ago

For the following matrix:

44.6667 -392.0000 -66.0000 -392.0000 3488.0000 504.0001 -66.0000 504.0001 216.0001

RectangularMatrix.SingularValueDecomposition throws: Meta.Numerics.NonconvergenceException : The algorithm did not converge within the allowed number of iterations.

For slightly different matrix: 44.6667 -391.9633 -66.0000 -391.9633 3487.4401 503.8801 -66.0000 503.8801 216.0001

it converges. Is it not so that a SVD exists for EACH matrix?

dcwuser commented 4 years ago

It is true that SVD exists for all matrices. It is also thinkable that our algorithm to compute it could fail with a NonconvergenceException, since the algorithm we use (which is quite standard) is iterative and relies on numerical convergence. However, for the values you quote, I am unable to reproduce the described behavior. The following code executes for me without any exception, and produces a working SVD:

        RectangularMatrix M = new RectangularMatrix(new double[,] {
            { 44.6667,  -392.0000, -66.0000 },
            { -392.0000, 3488.0000, 504.0001 },
            { -66.0000, 504.0001, 216.0001 }
        });
        //M = M.Transpose;
        SingularValueDecomposition S = M.SingularValueDecomposition();

Note that I also tried with the transpose, in case we disagreed about column vs row ordering.

dcwuser commented 4 years ago

If you can send me explicit code that fails, I would be happy to debug the behavior.

Alex-Konnen commented 4 years ago

Hi dcwuser, thanks for your reply. Unfortunately, it is a bit ago that I encountered the situation and, afaik, i implemented SVD from some different library at that place which behaved more robustly with these data. I cannot reproduce all of it right now, but I will try to when I am back in office.