On Mon, Nov 23, 2015 at 9:37 AM, Jonas Ballani <jonas.ball...@epfl.ch> wrote:
> Dear all, > > I am relatively new to libmesh and would like to report a problem using > the SVD routine of the DenseMatrix class for rectangular matrices. My > example program looks as follows: > > #include <iostream> > #include <fstream> > #include <algorithm> > #include <math.h> > > #include "libmesh/libmesh.h" > #include "libmesh/dense_vector.h" > #include "libmesh/dense_matrix.h" > > #include <Eigen/SVD> > > using namespace libMesh; > > int main (int argc, char** argv) > { > LibMeshInit init (argc, argv); > > { > std::cout << "## Libmesh DenseMatrix SVD" << std::endl; > > DenseMatrix< Number > A( 3, 2 ); > DenseMatrix< Number > U, VT; > DenseVector< Number > sigma; > > A(0,0) = 2.0; > A(1,0) = 0.0; > A(2,0) = 0.0; > A(0,1) = 0.0; > A(1,1) = 1.0; > A(2,1) = 0.0; > > std::cout << "A = " << std::endl << A << std::endl; > > A.svd( sigma, U, VT ); > > std::cout << "U = " << std::endl << U << std::endl; > std::cout << "VT = " << std::endl << VT << std::endl; > std::cout << "sigma = " << std::endl << sigma << std::endl; > } > > { > std::cout << "## Eigen SVD" << std::endl; > > Eigen::MatrixXf A( 3, 2 ); > > A(0,0) = 2.0; > A(1,0) = 0.0; > A(2,0) = 0.0; > A(0,1) = 0.0; > A(1,1) = 1.0; > A(2,1) = 0.0; > > std::cout << "A = " << std::endl << A << std::endl << std::endl; > > Eigen::JacobiSVD< Eigen::MatrixXf > svd( A, Eigen::ComputeThinU | > Eigen::ComputeThinV ); > > std::cout << "U = " << std::endl << svd.matrixU() << std::endl << > std::endl; > std::cout << "VT = " << std::endl << svd.matrixV() << std::endl << > std::endl; > std::cout << "sigma = "<< std::endl << svd.singularValues() << > std::endl; > } > > return 0; > } > > The output I get is: > > ## Libmesh DenseMatrix SVD > A = > 2 0 > 0 1 > 0 0 > > U = > 1 0 > -0 1 > > VT = > 1 0 1 > 0 -0 0 > > sigma = > 2 > 1 > > ## Eigen SVD > A = > 2 0 > 0 1 > 0 0 > > U = > 1 0 > 0 1 > 0 0 > > VT = > 1 0 > 0 1 > > sigma = > 2 > 1 > > Obviously, the SVD from the DenseMatrix class is wrong, whereas Eigen > performs well. It would be interesting to hear whether this is a known > problem. > Thanks for the test code, we'll have to take a closer look. It looks like DenseMatrix::svd() calls Lapack's dgesvd, which I doubt is wrong in itself, but we might be calling it wrong. I wonder if we ever tested it on non-square matrices... -- John ------------------------------------------------------------------------------ Go from Idea to Many App Stores Faster with Intel(R) XDK Give your users amazing mobile app experiences with Intel(R) XDK. Use one codebase in this all-in-one HTML5 development environment. Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs. http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140 _______________________________________________ Libmesh-users mailing list Libmesh-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libmesh-users