LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
matrix_decomposition_svd.cpp
浏览该文件的文档.
1
#include "
internal/matrix_decomposition_support.hpp
"
2
3
#include <algorithm>
4
#include <new>
5
6
namespace
LMCAS
{
7
using namespace
detail::matrix_decomposition
;
8
SVDDecompositionResult
svd_decomposition_checked
(
9
const
std::shared_ptr<SymbolicExpr>& A,
10
ComputationContext
&
context
)
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);
35
auto
S =
rectangular_diagonal_expr
(
36
matrix.value()->rows(), matrix.value()->cols(), magnitudes);
37
auto
V =
identity_matrix_expr
(matrix.value()->cols());
38
return
SVDDecompositionResult::success
(
SVDDecomposition
{U, S, V});
39
}
40
return
SVDDecompositionResult::failure
(
41
CasErrc::Inconclusive
,
42
"exact non-diagonal SVD requires a complete proved singular basis"
,
43
operation);
44
}
45
46
SVDDecompositionResult
svd_decomposition_checked
(
47
const
std::shared_ptr<SymbolicExpr>& A)
48
{
49
ComputationContext
context
;
50
return
svd_decomposition_checked
(A,
context
);
51
}
52
53
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Result< SVDDecomposition >::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::Result< SVDDecomposition >::success
static Result success(SVDDecomposition value)
定义
result.hpp:48
matrix_decomposition_support.hpp
LMCAS::detail::matrix_decomposition
定义
matrix_decomposition_support.hpp:9
LMCAS::detail::matrix_decomposition::identity_matrix_expr
std::shared_ptr< SymbolicExpr > identity_matrix_expr(std::size_t n)
LMCAS::detail::matrix_decomposition::rectangular_diagonal_expr
std::shared_ptr< SymbolicExpr > rectangular_diagonal_expr(std::size_t rows, std::size_t cols, const std::vector< Rational > &diagonal)
LMCAS::detail::matrix_decomposition::validate_decomposition_matrix
Result< std::shared_ptr< const MatrixNode > > validate_decomposition_matrix(const std::shared_ptr< SymbolicExpr > &A, bool require_square, ComputationContext &context, const std::string &operation)
定义
matrix_decomposition_support.cpp:6
LMCAS::detail::matrix_decomposition::exact_rectangular_diagonal_entries
std::optional< std::vector< Rational > > exact_rectangular_diagonal_entries(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
定义
matrix_decomposition_support.cpp:150
LMCAS
定义
assumption.hpp:11
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::CasErrc::Inconclusive
@ Inconclusive
定义
result.hpp:24
LMCAS::svd_decomposition_checked
SVDDecompositionResult svd_decomposition_checked(const std::shared_ptr< SymbolicExpr > &A, ComputationContext &context)
定义
matrix_decomposition_svd.cpp:8
LMCAS::SVDDecompositionResult
Result< SVDDecomposition > SVDDecompositionResult
定义
matrix_decomposition.hpp:44
LMCAS::SVDDecomposition
定义
matrix_decomposition.hpp:30
src
matrix_decomposition_svd.cpp
生成于
, 为 LMCAS使用
1.18.0