LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
linear_algebra.h 文件参考

稠密矩阵直接分解接口(LU、Cholesky、QR)。 更多...

#include <stddef.h>
#include "lmmc/dense.h"
linear_algebra.h 的引用(Include)关系图:
此图展示该文件被哪些文件直接或间接地引用了:

浏览该文件的源代码.

函数

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)。

三组接口均采用 in-place + 辅助数据 的形式,先分解再求解, 与 LAPACK 风格一致;分解结果会覆盖输入矩阵。

在文件 linear_algebra.h 中定义.

函数说明

◆ lmmc_lu_decompose_inplace()

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。
返回
副作用
  • 就地覆写 a->data(原始矩阵内容丢失)。
  • 覆写 pivots 数组。无堆内存分配。
使用模式
lmmc_lu_decompose_inplace(&A, pivots, NULL);
lmmc_lu_solve(&A, pivots, &b, &x);
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_lu_decompose_inplace(lmmc_mat_t *a, size_t *pivots, size_t *out_swap_count)
就地 LU 分解(带部分主元选取):P*A = L*U。

在文件 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_lu_solve()

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]luLU 因子矩阵(来自 decompose_inplace,不被修改)。
[in]pivots置换数组(来自 decompose_inplace)。
[in]b右端向量,长度须等于 lu->rows。
[out]x解向量,长度须等于 lu->rows,内容被覆写。
返回
副作用
  • 覆写 x->data。无内存分配。lu 和 b 不被修改。

在文件 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_cholesky_decompose_inplace()

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(就地覆写)。
返回
副作用
  • 就地覆写 a->data(原始矩阵内容丢失)。无堆内存分配。

在文件 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_cholesky_solve()

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]lCholesky 下三角因子(来自 decompose_inplace,不被修改)。
[in]b右端向量。
[out]x解向量,内容被覆写。
返回
副作用
  • 覆写 x->data。无内存分配。

在文件 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_qr_decompose_inplace()

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]am×n 矩阵,输出为 QR 紧凑表示(就地覆写)。
[out]tauHouseholder 标量数组,长度至少 min(m,n)。
[in]tau_sizetau 数组的容量,必须 >= min(m,n)。
返回
副作用
  • 就地覆写 a->data 和 tau 数组。无堆内存分配。

在文件 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_qr_solve()

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]qrQR 紧凑表示矩阵(不被修改)。
[in]tauHouseholder 标量数组。
[in]b右端向量,长度须等于 qr->rows。
[out]x解向量,长度须等于 qr->cols,内容被覆写。
返回
副作用
  • 覆写 x->data。分配并释放长度为 m 的临时数组。

在文件 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().

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