LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{matrix_decomposition_qr.cpp} 命名空间参考

函数

Result< void > prove_exact_full_column_rank_qr_support (const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context, const std::string &operation)
static bool qr_decomposition_impl (const std::shared_ptr< SymbolicExpr > &A, std::shared_ptr< SymbolicExpr > &Q, std::shared_ptr< SymbolicExpr > &R)

函数说明

◆ prove_exact_full_column_rank_qr_support()

Result< void > LMCAS::anonymous_namespace{matrix_decomposition_qr.cpp}::prove_exact_full_column_rank_qr_support ( const std::shared_ptr< const MatrixNode > & matrix,
ComputationContext & context,
const std::string & operation )

在文件 matrix_decomposition_qr.cpp 第 11 行定义.

14 {
15 auto values = exact_rational_matrix(matrix, context);
16 if (!values) {
19 "QR input is outside the exact rational full-column-rank support domain",
20 operation);
21 }
22 const size_t rows = values->size();
23 const size_t cols = rows == 0 ? 0 : (*values)[0].size();
24 if (rows < cols) {
27 "QR decomposition requires at least as many rows as columns in the supported domain",
28 operation);
29 }
30 std::vector<std::vector<Rational>> gram(
31 cols, std::vector<Rational>(cols, Rational(0)));
32 for (size_t i = 0; i < cols; ++i) {
33 for (size_t j = 0; j < cols; ++j) {
34 Rational sum(0);
35 for (size_t row = 0; row < rows; ++row) {
36 sum = sum + (*values)[row][i] * (*values)[row][j];
37 }
38 gram[i][j] = sum;
39 }
40 }
41 for (size_t order = 1; order <= cols; ++order) {
42 std::vector<Rational> leading;
43 leading.reserve(order * order);
44 for (size_t row = 0; row < order; ++row) {
45 for (size_t col = 0; col < order; ++col) {
46 leading.push_back(gram[row][col]);
47 }
48 }
49 auto determinant = detail::rational_determinant_exact(
50 order, std::move(leading), context, operation);
51 if (!determinant) return Result<void>::failure(determinant.error());
52 if (determinant.value() <= Rational(0)) {
55 "QR decomposition requires proven full column rank",
56 operation);
57 }
58 }
59 return Result<void>::success();
60}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
std::optional< std::vector< std::vector< Rational > > > exact_rational_matrix(const std::shared_ptr< const MatrixNode > &matrix, ComputationContext &context)
Result< Rational > rational_determinant_exact(std::size_t dimension, std::vector< Rational > values, ComputationContext &context, const std::string &operation)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::vector< FGLMPoly > const MonomialOrder & order
@ Rational
Rational numbers

引用了 LMCAS::context, LMCAS::detail::matrix_decomposition::exact_rational_matrix(), LMCAS::Result< T >::failure(), LMCAS::Inconclusive, LMCAS::order, prove_exact_full_column_rank_qr_support(), LMCAS::detail::rational_determinant_exact() , 以及 LMCAS::Result< T >::success().

被这些函数引用 prove_exact_full_column_rank_qr_support().

函数调用图:
这是这个函数的调用关系图:

◆ qr_decomposition_impl()

bool LMCAS::anonymous_namespace{matrix_decomposition_qr.cpp}::qr_decomposition_impl ( const std::shared_ptr< SymbolicExpr > & A,
std::shared_ptr< SymbolicExpr > & Q,
std::shared_ptr< SymbolicExpr > & R )
static

在文件 matrix_decomposition_qr.cpp 第 61 行定义.

64 {
65 auto mat = std::dynamic_pointer_cast<const MatrixNode>(LMCAS::detail::node(A));
66 if (!mat) return false;
67 size_t m = mat->rows();
68 size_t n = mat->cols();
69
70 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> Q_grid(m, std::vector<std::shared_ptr<SymbolicExpr>>(n, SymbolicExpr::number(0)));
71 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> R_grid(n, std::vector<std::shared_ptr<SymbolicExpr>>(n, SymbolicExpr::number(0)));
72
73 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> A_cols(n, std::vector<std::shared_ptr<SymbolicExpr>>(m));
74 for (size_t j = 0; j < n; j++) {
75 for (size_t i = 0; i < m; i++) A_cols[j][i] = LMCAS::detail::make_expression_ptr(mat->get(i, j));
76 }
77
78 for (size_t j = 0; j < n; j++) {
79 std::vector<std::shared_ptr<SymbolicExpr>> u_j = A_cols[j];
80 for (size_t i = 0; i < j; i++) {
81 auto dot = SymbolicExpr::number(0);
82 for (size_t k = 0; k < m; k++) dot = SymbolicExpr::add(dot, SymbolicExpr::multiply(Q_grid[k][i], A_cols[j][k]));
83 R_grid[i][j] = dot;
84
85 for (size_t k = 0; k < m; k++) {
86 u_j[k] = SymbolicExpr::add(u_j[k], SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::multiply(R_grid[i][j], Q_grid[k][i])));
87 }
88 }
89
90 auto norm_sq = SymbolicExpr::number(0);
91 for (size_t k = 0; k < m; k++) norm_sq = SymbolicExpr::add(norm_sq, SymbolicExpr::multiply(u_j[k], u_j[k]));
92 R_grid[j][j] = SymbolicExpr::sqrt(norm_sq);
93
94 for (size_t k = 0; k < m; k++) Q_grid[k][j] = SymbolicExpr::divide(u_j[k], R_grid[j][j]);
95 }
96
97 Q = SymbolicExpr::matrix(Q_grid);
98 R = SymbolicExpr::matrix(R_grid);
99 return true;
100}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node() , 以及 qr_decomposition_impl().

被这些函数引用 qr_decomposition_impl().

函数调用图:
这是这个函数的调用关系图: