|
LMMC
Lamina Mathematic core
|
稠密矩阵求解器实现(行列式、逆、三角求解、右除、秩、幂)。 更多...
#include <float.h>#include <math.h>#include <string.h>#include "memory_bridge.h"#include "internal.h"#include "lmmc/config.h"#include "lmmc/dense.h"#include "lmmc/linear_algebra.h"#include "lmmc/eigen.h"函数 | |
| lmmc_status_t | lmmc_mat_det (const lmmc_mat_t *a, lmmc_real_t *out_det) |
| 通过 LU 分解计算方阵行列式。 | |
| lmmc_status_t | lmmc_mat_inv (const lmmc_mat_t *A, lmmc_mat_t *A_inv) |
| 计算方阵的逆矩阵。 | |
| lmmc_status_t | lmmc_solve_triangular (const lmmc_mat_t *T, int upper, int diag_unit, const lmmc_vec_t *b, lmmc_vec_t *x) |
| 求解三角系统 \(T x = b\)。 | |
| lmmc_status_t | lmmc_mat_rank (const lmmc_mat_t *a, lmmc_real_t tol, size_t *out_rank) |
| 通过 SVD 计算矩阵的数值秩。 | |
| lmmc_status_t | lmmc_mat_pow (const lmmc_mat_t *a, int n, lmmc_mat_t *out) |
| 计算方阵整数幂 \(\text{out} = A^n\)。 | |
| lmmc_status_t | lmmc_mat_rdiv (const lmmc_mat_t *B, const lmmc_mat_t *A, lmmc_mat_t *X) |
| 计算矩阵右除 \(X = B \cdot A^{-1}\)。 | |
稠密矩阵求解器实现(行列式、逆、三角求解、右除、秩、幂)。
在文件 dense_solvers.c 中定义.
| lmmc_status_t lmmc_mat_det | ( | const lmmc_mat_t * | a, |
| lmmc_real_t * | out_det ) |
通过 LU 分解计算方阵行列式。
使用临时工作空间,对 1x1 和 2x2 矩阵采用专用快速路径。 2x2 有限输入的乘积即使单独溢出,只要行列式可表示,相消结果仍按 binary64 输出;奇异矩阵的结果为零。
| [in] | a | 输入方阵,保持不变。 |
| [out] | out_det | 输出行列式,奇异矩阵返回 0。 |
在文件 dense_solvers.c 第 126 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_det(), lmmc_memory_alloc(), lmmc_memory_free(), LMMC_REAL_SET, LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_det() , 以及 lmmc_std_linalg_det().
| lmmc_status_t lmmc_mat_inv | ( | const lmmc_mat_t * | A, |
| lmmc_mat_t * | A_inv ) |
计算方阵的逆矩阵。
LU 分解后逐列求解 \(A \cdot \text{col}_i = e_i\)。 奇异矩阵返回 ::LMMC_STATUS_SINGULAR_MATRIX,且 A_inv 保持不变。
| [in] | A | 输入方阵。 |
| [out] | A_inv | 输出逆矩阵,须已创建且与 A 同维。 |
在文件 dense_solvers.c 第 200 行定义.
引用了 lmmc_mat_t::cols, lmmc_lu_decompose_inplace(), lmmc_mat_copy(), lmmc_mat_create(), lmmc_mat_destroy(), lmmc_mat_inv(), lmmc_memory_alloc_array(), lmmc_memory_free(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_mat_t::rows.
被这些函数引用 lmmc_mat_inv() , 以及 lmmc_std_linalg_inv().
| lmmc_status_t lmmc_solve_triangular | ( | const lmmc_mat_t * | T, |
| int | upper, | ||
| int | diag_unit, | ||
| const lmmc_vec_t * | b, | ||
| lmmc_vec_t * | x ) |
求解三角系统 \(T x = b\)。
仅使用指定的三角部分;单位对角模式不读取存储的对角元, 非活动半边也不读取。有限非零对角元正常相除,不使用绝对奇异阈值。
| [in] | T | 上三角或下三角矩阵。 |
| [in] | upper | 非零表示上三角,零表示下三角。 |
| [in] | diag_unit | 非零时将对角线视为 1。 |
| [in] | b | 右端向量。 |
| [out] | x | 解向量,须已创建且与 b 同长。 |
在文件 dense_solvers.c 第 286 行定义.
引用了 lmmc_mat_t::cols, lmmc_solve_triangular(), LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_solve_triangular().
| lmmc_status_t lmmc_mat_rank | ( | const lmmc_mat_t * | a, |
| lmmc_real_t | tol, | ||
| size_t * | out_rank ) |
通过 SVD 计算矩阵的数值秩。
用 lmmc_svd 统计大于 tol 的奇异值个数。 tol <= 0 时采用 max(rows, cols) * LMMC_REAL_EPSILON * sigma_0, 其中 sigma_0 为最大奇异值。
| [in] | a | 输入矩阵,保持不变。 |
| [in] | tol | 奇异值截断容差,<= 0 时使用默认值。 |
| [out] | out_rank | 输出秩值。 |
在文件 dense_solvers.c 第 310 行定义.
引用了 lmmc_mat_t::cols, lmmc_vec_t::data, lmmc_mat_rank(), LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_EPSILON, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_svd(), lmmc_svd_result_destroy(), lmmc_mat_t::rows, lmmc_svd_result_t::sigma , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_mat_rank().
| lmmc_status_t lmmc_mat_pow | ( | const lmmc_mat_t * | a, |
| int | n, | ||
| lmmc_mat_t * | out ) |
计算方阵整数幂 \(\text{out} = A^n\)。
二进制快速幂需要 O(log|n|) 次乘法。 n=0 生成单位矩阵,n=1 复制输入,n<0 对逆矩阵求 |n| 次幂。
| [in] | a | 输入方阵,保持不变。 |
| [in] | n | 整数指数,可为负、零或正。 |
| [out] | out | 输出矩阵,须已创建且与 a 同维(nxn),内容被覆写。 |
无符号幅值可表示 INT_MIN 的绝对值。
在文件 dense_solvers.c 第 437 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_copy(), lmmc_mat_destroy(), lmmc_mat_pow(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_mat_t::rows.
被这些函数引用 lmmc_mat_pow().
| lmmc_status_t lmmc_mat_rdiv | ( | const lmmc_mat_t * | B, |
| const lmmc_mat_t * | A, | ||
| lmmc_mat_t * | X ) |
计算矩阵右除 \(X = B \cdot A^{-1}\)。
对 A^T 进行 LU 分解,逐列求解 \(A^T \cdot X^T = B^T\)。
| [in] | B | 被除矩阵(mxn),列数须等于 A 的行数,保持不变。 |
| [in] | A | 除数方阵(nxn),保持不变。 |
| [out] | X | 输出矩阵(mxn),须已创建为 (B->rows x A->cols),内容被覆写。 |
在文件 dense_solvers.c 第 507 行定义.
引用了 lmmc_mat_t::cols, lmmc_lu_decompose_inplace(), lmmc_mat_create(), lmmc_mat_destroy(), lmmc_mat_rdiv(), lmmc_mat_transpose_to(), lmmc_memory_alloc(), lmmc_memory_free(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_mat_t::rows.
被这些函数引用 lmmc_mat_rdiv().