|
LMMC
Lamina Mathematic core
|
稠密 LU / Cholesky / QR 分解与求解实现。 更多...
#include <math.h>#include <string.h>#include "memory_bridge.h"#include "lmmc/config.h"#include "lmmc/numeric.h"#include "lmmc/linear_algebra.h"函数 | |
| lmmc_status_t | lmmc_lu_decompose_inplace (lmmc_mat_t *a, size_t *pivots, size_t *out_swap_count) |
| 就地 LU 分解(带部分主元选取):P*A = L*U。 | |
| lmmc_status_t | lmmc_lu_solve (const lmmc_mat_t *lu, const size_t *pivots, const lmmc_vec_t *b, lmmc_vec_t *x) |
| 利用 LU 分解结果求解线性系统 A*x = b。 | |
| lmmc_status_t | lmmc_cholesky_decompose_inplace (lmmc_mat_t *a) |
| 就地 Cholesky 分解:A = L*L^T,要求 A 对称正定。 | |
| lmmc_status_t | lmmc_cholesky_solve (const lmmc_mat_t *l, const lmmc_vec_t *b, lmmc_vec_t *x) |
| 利用 Cholesky 因子求解 A*x = b(A = L*L^T)。 | |
| lmmc_status_t | lmmc_qr_decompose_inplace (lmmc_mat_t *a, lmmc_real_t *tau, size_t tau_size) |
| 就地 Householder QR 分解。 | |
| lmmc_status_t | lmmc_qr_solve (const lmmc_mat_t *qr, const lmmc_real_t *tau, const lmmc_vec_t *b, lmmc_vec_t *x) |
| 利用 QR 分解结果求解线性系统或最小二乘问题。 | |
稠密 LU / Cholesky / QR 分解与求解实现。
在文件 linear_algebra.c 中定义.
| lmmc_status_t lmmc_lu_decompose_inplace | ( | lmmc_mat_t * | a, |
| size_t * | pivots, | ||
| size_t * | out_swap_count ) |
就地 LU 分解(带部分主元选取):P*A = L*U。
分解后 a 同时存储 L(严格下三角,单位对角线隐含)和 U(上三角含对角线)。 行交换记录在 pivots 数组中:pivots[k] 表示第 k 步与第 pivots[k] 行交换。 仅精确零主元判为奇异;有限非零的小主元正常参与运算,不作数值秩判定。
| [in,out] | a | 输入方阵 A,输出为 LU 因子(就地覆写)。 |
| [out] | pivots | 置换数组,长度至少为 a->rows。 |
| [out] | out_swap_count | 主元交换次数(用于行列式符号),可为 NULL。 |
在文件 linear_algebra.c 第 39 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_lu_decompose_inplace(), LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_DIV, LMMC_REAL_INIT, LMMC_REAL_IS_FINITE, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SUB, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_SINGULAR_MATRIX, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_lu_decompose_inplace(), lmmc_mat_inv(), lmmc_mat_rdiv() , 以及 lmmc_std_linalg_solve_left().
| lmmc_status_t lmmc_lu_solve | ( | const lmmc_mat_t * | lu, |
| const size_t * | pivots, | ||
| const lmmc_vec_t * | b, | ||
| lmmc_vec_t * | x ) |
利用 LU 分解结果求解线性系统 A*x = b。
lu 和 pivots 须来自同一次 lmmc_lu_decompose_inplace 调用。 内部执行前代(L)+ 回代(U)+ 行置换应用。 有限非零的 U 对角元正常相除,不使用绝对奇异阈值。
| [in] | lu | LU 因子矩阵(来自 decompose_inplace,不被修改)。 |
| [in] | pivots | 置换数组(来自 decompose_inplace)。 |
| [in] | b | 右端向量,长度须等于 lu->rows。 |
| [out] | x | 解向量,长度须等于 lu->rows,内容被覆写。 |
在文件 linear_algebra.c 第 166 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_vec_t::data, lmmc_lu_solve(), LMMC_REAL_CLEAR, LMMC_REAL_DIV, LMMC_REAL_INIT, LMMC_REAL_IS_FINITE, LMMC_REAL_MUL, LMMC_REAL_SUB, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_SINGULAR_MATRIX, lmmc_mat_t::rows, lmmc_vec_t::size , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_lu_solve().
| lmmc_status_t lmmc_cholesky_decompose_inplace | ( | lmmc_mat_t * | a | ) |
就地 Cholesky 分解:A = L*L^T,要求 A 对称正定。
分解后 a 的下三角(含对角线)存储 L,上三角内容未定义。 使用相对阈值检测非正定:若某步对角元 <= rel_tol * max_diag 则判定失败。
| [in,out] | a | 输入对称正定方阵,输出为下三角 L(就地覆写)。 |
在文件 linear_algebra.c 第 213 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_cholesky_decompose_inplace(), LMMC_DEFAULT_REL_TOL, LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_DIV, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_REAL_SQRT, LMMC_REAL_SUB, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NOT_POSITIVE_DEFINITE, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_cholesky_decompose_inplace().
| lmmc_status_t lmmc_cholesky_solve | ( | const lmmc_mat_t * | l, |
| const lmmc_vec_t * | b, | ||
| lmmc_vec_t * | x ) |
利用 Cholesky 因子求解 A*x = b(A = L*L^T)。
内部执行前代 L*y=b + 回代 L^T*x=y。
| [in] | l | Cholesky 下三角因子(来自 decompose_inplace,不被修改)。 |
| [in] | b | 右端向量。 |
| [out] | x | 解向量,内容被覆写。 |
在文件 linear_algebra.c 第 280 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_vec_t::data, lmmc_cholesky_solve(), LMMC_REAL_CLEAR, LMMC_REAL_DIV, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SUB, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows, lmmc_vec_t::size , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_cholesky_solve().
| lmmc_status_t lmmc_qr_decompose_inplace | ( | lmmc_mat_t * | a, |
| lmmc_real_t * | tau, | ||
| size_t | tau_size ) |
就地 Householder QR 分解。
分解后 a 的上三角存储 R,下三角(对角线以下)存储 Householder 反射子 v_k, tau[k] 存储对应的标量因子。
| [in,out] | a | m×n 矩阵,输出为 QR 紧凑表示(就地覆写)。 |
| [out] | tau | Householder 标量数组,长度至少 min(m,n)。 |
| [in] | tau_size | tau 数组的容量,必须 >= min(m,n)。 |
在文件 linear_algebra.c 第 403 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_qr_decompose_inplace(), LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_qr_decompose_inplace().
| lmmc_status_t lmmc_qr_solve | ( | const lmmc_mat_t * | qr, |
| const lmmc_real_t * | tau, | ||
| const lmmc_vec_t * | b, | ||
| lmmc_vec_t * | x ) |
利用 QR 分解结果求解线性系统或最小二乘问题。
对 m×n 矩阵(m>=n):求解 min||Ax-b||_2,即 R*x = Q^T*b 的前 n 行。 qr 和 tau 须来自同一次 lmmc_qr_decompose_inplace 调用。 有限非零的 R 对角元正常相除,不使用绝对奇异阈值或数值秩截断。 tau[k] 为零时跳过该反射子,不读取其存储在严格下三角的分量。
| [in] | qr | QR 紧凑表示矩阵(不被修改)。 |
| [in] | tau | Householder 标量数组。 |
| [in] | b | 右端向量,长度须等于 qr->rows。 |
| [out] | x | 解向量,长度须等于 qr->cols,内容被覆写。 |
在文件 linear_algebra.c 第 562 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_vec_t::data, lmmc_memory_alloc_array(), lmmc_memory_free(), lmmc_qr_solve(), LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_qr_solve().