// // Copyright (c) 2003 Toon Knapen, Karl Meerbergen, and Kresimir Fresl // Copyright (c) 2008 Thomas Klimpel and Rutger ter Borg // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // THIS FILE IS AUTOMATICALLY GENERATED // PLEASE DO NOT EDIT! // #ifndef BOOST_NUMERIC_BINDINGS_LAPACK_GELSD_HPP #define BOOST_NUMERIC_BINDINGS_LAPACK_GELSD_HPP #include namespace boost { namespace numeric { namespace bindings { namespace lapack { // // CGELSD computes the minimum-norm solution to a real linear least // squares problem: // minimize 2-norm(| b - A*x |) // using the singular value decomposition (SVD) of A. A is an M-by-N // matrix which may be rank-deficient. // // Several right hand side vectors b and solution vectors x can be // handled in a single call; they are stored as the columns of the // M-by-NRHS right hand side matrix B and the N-by-NRHS solution // matrix X. // // The problem is solved in three steps: // (1) Reduce the coefficient matrix A to bidiagonal form with // Householder tranformations, reducing the original problem // into a "bidiagonal least squares problem" (BLS) // (2) Solve the BLS using a divide and conquer approach. // (3) Apply back all the Householder tranformations to solve // the original least squares problem. // // The effective rank of A is determined by treating as zero those // singular values which are less than RCOND times the largest singular // value. // // The divide and conquer algorithm makes very mild assumptions about // floating point arithmetic. It will work on machines with a guard // digit in add/subtract, or on those binary machines without guard // digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or // Cray-2. It could conceivably fail on hexadecimal or decimal machines // without guard digits, but we know of none. // namespace detail { // inline overloads inline void gelsd( int const m, int const n, int const nrhs, fcomplex_t* a, int const lda, fcomplex_t* b, int const ldb, float* s, float const rcond, int* rank, fcomplex_t* work, int const lwork, float* rwork, int* iwork, int* info ) { LAPACK_CGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, rank, work, &lwork, rwork, iwork, info ); } inline void gelsd( int const m, int const n, int const nrhs, double const* a, int const lda, double* b, int const ldb, double* s, double const rcond, int* rank, double* work, int const lwork, int* iwork, int* info ) { LAPACK_DGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, rank, work, &lwork, iwork, info ); } inline void gelsd( int const m, int const n, int const nrhs, float const* a, int const lda, float* b, int const ldb, float* s, float const rcond, int* rank, float* work, int const lwork, int* iwork, int* info ) { LAPACK_SGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, rank, work, &lwork, iwork, info ); } inline void gelsd( int const m, int const n, int const nrhs, dcomplex_t const* a, int const lda, dcomplex_t* b, int const ldb, double* s, double const rcond, int* rank, dcomplex_t* work, int const lwork, double* rwork, int* iwork, int* info ) { LAPACK_ZGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, rank, work, &lwork, rwork, iwork, info ); } } }}}} // namespace boost::numeric::bindings::lapack #endif