// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_svd //! @{ template inline bool svd ( Col& S, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Mat A(X.get_ref()); const bool status = auxlib::svd_dc(S, A); if(status == false) { S.soft_reset(); arma_debug_warn_level(3, "svd(): decomposition failed"); } return status; } template arma_warn_unused inline Col svd ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; Col out; Mat A(X.get_ref()); const bool status = auxlib::svd_dc(out, A); if(status == false) { out.soft_reset(); arma_stop_runtime_error("svd(): decomposition failed"); } return out; } template inline bool svd ( Mat& U, Col& S, Mat& V, const Base& X, const char* method = "dc", const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; arma_debug_check ( ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ), "svd(): two or more output objects are the same object" ); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'd')), "svd(): unknown method specified" ); Mat A(X.get_ref()); const bool status = (sig == 'd') ? auxlib::svd_dc(U, S, V, A) : auxlib::svd(U, S, V, A); if(status == false) { U.soft_reset(); S.soft_reset(); V.soft_reset(); arma_debug_warn_level(3, "svd(): decomposition failed"); } return status; } template inline bool svd_econ ( Mat& U, Col& S, Mat& V, const Base& X, const char mode, const char* method = "dc", const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; arma_debug_check ( ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ), "svd_econ(): two or more output objects are the same object" ); arma_debug_check ( ( (mode != 'l') && (mode != 'r') && (mode != 'b') ), "svd_econ(): parameter 'mode' is incorrect" ); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'd')), "svd_econ(): unknown method specified" ); Mat A(X.get_ref()); const bool status = ((mode == 'b') && (sig == 'd')) ? auxlib::svd_dc_econ(U, S, V, A) : auxlib::svd_econ(U, S, V, A, mode); if(status == false) { U.soft_reset(); S.soft_reset(); V.soft_reset(); arma_debug_warn_level(3, "svd_econ(): decomposition failed"); } return status; } template inline bool svd_econ ( Mat& U, Col& S, Mat& V, const Base& X, const char* mode = "both", const char* method = "dc", const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return svd_econ(U, S, V, X, ((mode != nullptr) ? mode[0] : char(0)), method); } //! @}