diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 3b54ae2..713d264 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -18,4 +18,5 @@ add_example(ex5 ON) add_example(ex6 ON) add_example(ex7 ON) add_example(ex8 ON) -add_example(ex9 ON) \ No newline at end of file +add_example(ex9 ON) +add_example(ex10 ON) \ No newline at end of file diff --git a/example/ex10.cpp b/example/ex10.cpp new file mode 100644 index 0000000..f6dc1bf --- /dev/null +++ b/example/ex10.cpp @@ -0,0 +1,64 @@ +/******************************************************** + * ██████╗ ██████╗████████╗██╗ + * ██╔════╝ ██╔════╝╚══██╔══╝██║ + * ██║ ███╗██║ ██║ ██║ + * ██║ ██║██║ ██║ ██║ + * ╚██████╔╝╚██████╗ ██║ ███████╗ + * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ + * 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 . + * + * 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. + ******************************************************/ + +#include "gctl/core.h" +#include "gctl/algorithm.h" +#include "../lib/optimization.h" +#include "iostream" +#include "iomanip" + +using std::cout; +using std::endl; +using std::setw; + +int main(int argc, char const *argv[]) +{ + gctl::matrix A(4, 3); + for (int i = 0; i < A.row_size(); i++) + { + for (int j = 0; j < A.col_size(); j++) + { + A[i][j] = 3*(i+1) + j - 2; + } + } + A[3][1] = 1; + + gctl::array x(3), y(3), m(3); + x.random_float(-1.0, 1.0, gctl::RdUniform, 452); + gctl::matvec(y, A, x); + + cout<<"A(" << A.row_size() << ", " << A.col_size() << ") = " < t(K, 0.0); + + matvec(t, U, b, NoTrans); + + for (size_t i = 0; i < K; i++) + { + t[i] *= 1.0/S[i]; + } + + matvec(x, V, t, Trans); + return; } \ No newline at end of file diff --git a/lib/optimization/svd.h b/lib/optimization/svd.h index 1e51ff5..d37b322 100644 --- a/lib/optimization/svd.h +++ b/lib/optimization/svd.h @@ -62,6 +62,14 @@ namespace gctl void decompose(const matrix &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& b, array &x); + protected: int maxi_iteration, K; double epsilon;