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() << ") = " < &src_mat)
else break;
}
return;
+}
+
+// solve for x in form Ax = b. A is the original input matrix.
+// Note: b is modified in-place for row permutations
+void gctl::svd::solve(const array& b, array &x)
+{
+ if (b.empty())
+ {
+ throw domain_error("Invalid target vector. From gctl::svd::solve(...)");
+ }
+
+ x.resize(b.size());
+ array 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;