LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
matrix_decomposition_svd.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <new>
5
6namespace LMCAS {
7using namespace detail::matrix_decomposition;
9 const std::shared_ptr<SymbolicExpr>& A,
11{
12 const std::string operation = "svd_decomposition";
13 auto matrix = validate_decomposition_matrix(A, false, context, operation);
14 if (!matrix) return SVDDecompositionResult::failure(matrix.error());
15 auto budget = context.consume_steps(matrix.value()->rows() * matrix.value()->cols() * 32 + 32,
16 operation);
17 if (!budget) return SVDDecompositionResult::failure(budget.error());
18 auto diagonal = exact_rectangular_diagonal_entries(matrix.value(), context);
19 if (diagonal) {
20 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> signs(
21 matrix.value()->rows(),
22 std::vector<std::shared_ptr<SymbolicExpr>>(
23 matrix.value()->rows(), SymbolicExpr::number(0)));
24 std::vector<Rational> magnitudes = *diagonal;
25 for (std::size_t row = 0; row < matrix.value()->rows(); ++row) {
26 signs[row][row] = SymbolicExpr::number(1);
27 }
28 for (std::size_t index = 0; index < magnitudes.size(); ++index) {
29 if (magnitudes[index] < Rational(0)) {
30 signs[index][index] = SymbolicExpr::number(-1);
31 magnitudes[index] = Rational(0) - magnitudes[index];
32 }
33 }
34 auto U = SymbolicExpr::matrix(signs);
36 matrix.value()->rows(), matrix.value()->cols(), magnitudes);
37 auto V = identity_matrix_expr(matrix.value()->cols());
39 }
42 "exact non-diagonal SVD requires a complete proved singular basis",
43 operation);
44}
45
47 const std::shared_ptr<SymbolicExpr>& A)
48{
51}
52
53}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(SVDDecomposition value)
std::shared_ptr< SymbolicExpr > identity_matrix_expr(std::size_t n)
std::shared_ptr< SymbolicExpr > rectangular_diagonal_expr(std::size_t rows, std::size_t cols, const std::vector< Rational > &diagonal)
Result< std::shared_ptr< const MatrixNode > > validate_decomposition_matrix(const std::shared_ptr< SymbolicExpr > &A, bool require_square, ComputationContext &context, const std::string &operation)
std::optional< std::vector< Rational > > exact_rectangular_diagonal_entries(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
SVDDecompositionResult svd_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
Result< SVDDecomposition > SVDDecompositionResult