|
LMMC
Lamina Mathematic core
|
#include <string.h>#include <math.h>#include "memory_bridge.h"#include "internal.h"#include "lmmc/sparse.h"#include "sparse_direct_internal.h"函数 | |
| lmmc_status_t | lmmc_sparse_lu_symbolic (const lmmc_sparse_mat_t *a, lmmc_sparse_lu_t **out_lu) |
| 稀疏 LU 符号分析:去重简单图与贪心残余度重排序。 | |
| lmmc_status_t | lmmc_sparse_lu_numeric (const lmmc_sparse_mat_t *a, lmmc_sparse_lu_t *lu) |
| 稀疏 LU 数值分解:稠密列工作区左看算法与部分主元法。 | |
| lmmc_status_t | lmmc_sparse_lu_solve (const lmmc_sparse_lu_t *lu, const lmmc_vec_t *b, lmmc_vec_t *x) |
| 使用残余度排序的 LU 因子求解 A*x = b。 | |
| void | lmmc_sparse_lu_destroy (lmmc_sparse_lu_t *lu) |
| 销毁稀疏 LU 上下文。 | |
| lmmc_status_t lmmc_sparse_lu_symbolic | ( | const lmmc_sparse_mat_t * | a, |
| lmmc_sparse_lu_t ** | out_lu ) |
稀疏 LU 符号分析:去重简单图与贪心残余度重排序。
分析矩阵的稀疏结构,计算确定性的度数/原索引顺序,并预分配 L/U 因子的存储空间。矩阵结构不变、仅数值变化时可复用分析结果。
| [in] | a | 输入方阵,rows 须等于 cols。 |
| [out] | out_lu | 返回的 LU 上下文句柄,调用方需配对调用 lmmc_sparse_lu_destroy 释放。 |
在文件 sparse_lu.c 第 49 行定义.
引用了 lmmc_sparse_lu_t::col_perm, lmmc_sparse_mat_t::cols, lmmc_sparse_lu_t::L_nnz, lmmc_memory_alloc(), lmmc_sparse_destroy(), lmmc_sparse_direct_csc(), lmmc_sparse_lu_destroy(), lmmc_sparse_lu_symbolic(), lmmc_sparse_residual_reorder(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_sparse_lu_t::n, lmmc_sparse_mat_t::nnz, lmmc_sparse_mat_t::rows , 以及 lmmc_sparse_lu_t::U_nnz.
被这些函数引用 lmmc_sparse_lu_symbolic().
| lmmc_status_t lmmc_sparse_lu_numeric | ( | const lmmc_sparse_mat_t * | a, |
| lmmc_sparse_lu_t * | lu ) |
稀疏 LU 数值分解:稠密列工作区左看算法与部分主元法。
每列散布到稠密工作区并由已有 L 列更新;矩阵数值变化但结构不变时可复用 lu。
| [in] | a | 输入方阵,维度须与符号分析时一致。 |
| [in,out] | lu | 已完成符号分析的 LU 上下文,数值因子被覆写。 |
稠密列工作区与逆行置换。
在文件 sparse_lu.c 第 284 行定义.
引用了 lmmc_sparse_mat_t::cols, lmmc_memory_alloc_array(), lmmc_memory_free(), lmmc_sparse_destroy(), lmmc_sparse_direct_csc(), lmmc_sparse_lu_numeric(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_sparse_lu_t::n , 以及 lmmc_sparse_mat_t::rows.
被这些函数引用 lmmc_sparse_lu_numeric().
| lmmc_status_t lmmc_sparse_lu_solve | ( | const lmmc_sparse_lu_t * | lu, |
| const lmmc_vec_t * | b, | ||
| lmmc_vec_t * | x ) |
使用残余度排序的 LU 因子求解 A*x = b。
使用已分解的稀疏 LU 因子求解 A*x = b。
分解满足 P*A*Q = L*U,其中 P 为部分主元行置换,Q 为残余度列置换。
使用残余度排序的 LU 因子求解 A*x = b。
求解公式:x = Q * U^{-1} * L^{-1} * P * b,其中 P 为行置换,Q 为残余度列置换。 lu 必须已完成 符号分析与数值分解两阶段。
| [in] | lu | LU 上下文。 |
| [in] | b | 右端向量,长度须等于 lu->n。 |
| [out] | x | 解向量,长度须等于 lu->n,覆写原内容。 |
应用行置换:work = P * b。
还原列置换:x = Q * y。
col_perm[k] 为置换后第 k 列的原列索引。
在文件 sparse_lu.c 第 380 行定义.
引用了 lmmc_sparse_lu_t::col_perm, lmmc_vec_t::data, lmmc_memory_alloc_array(), lmmc_memory_free(), lmmc_sparse_lu_solve(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_sparse_lu_t::n, lmmc_sparse_lu_t::row_perm , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_sparse_lu_solve().
| void lmmc_sparse_lu_destroy | ( | lmmc_sparse_lu_t * | lu | ) |
销毁稀疏 LU 上下文。
在文件 sparse_lu.c 第 426 行定义.
引用了 lmmc_sparse_lu_t::col_perm, lmmc_sparse_lu_t::L_col_ptr, lmmc_sparse_lu_t::L_row_idx, lmmc_sparse_lu_t::L_values, lmmc_memory_free(), lmmc_sparse_lu_destroy(), lmmc_sparse_lu_t::row_perm, lmmc_sparse_lu_t::U_col_ptr, lmmc_sparse_lu_t::U_row_idx , 以及 lmmc_sparse_lu_t::U_values.
被这些函数引用 lmmc_sparse_lu_destroy() , 以及 lmmc_sparse_lu_symbolic().