gctl_optimization/lib/optimization/svd.h
2024-11-26 16:57:00 +08:00

79 lines
2.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************
* ██████╗ ██████╗████████╗██╗
* ██╔════╝ ██╔════╝╚══██╔══╝██║
* ██║ ███╗██║ ██║ ██║
* ██║ ██║██║ ██║ ██║
* ╚██████╔╝╚██████╗ ██║ ███████╗
* ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#ifndef _GCTL_SVD_H
#define _GCTL_SVD_H
#include "gctl/core.h"
#include "gctl/algorithm.h"
namespace gctl
{
/**
* @brief SVD奇异值分解
*
* A = U^T \cdot S \cdot V
* A 大小为M*N输入的二维数组
* K 待计算的奇异值与奇异向量的数量
* U 分解后的U矩阵大小为K*M
* S 分解后的对角S矩阵以向量的形式表示即前k个特征值大小1*K
* V 分解后的V矩阵大小为K*N
*
*/
class svd
{
public:
matrix<double> U, V;
array<double> S;
svd();
svd(const matrix<double> &src_mat);
virtual ~svd(){}
void reset();
void set_singular_number(int k);
void set_iteration(int t);
void set_epsilon(double e);
int get_singular_number(){return K;}
void decompose(const matrix<double> &src_mat);
/**
* @brief Solve for x in form Ax = b. A is the original input matrix.
*
* @param b Right hang term of the linear system.
* @param x Return solution.
*/
void solve(const array<double>& b, array<double> &x);
protected:
int maxi_iteration, K;
double epsilon;
};
}
#endif // _GCTL_SVD_H