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

稠密矩阵求解器实现(行列式、逆、三角求解、右除、秩、幂)。 更多...

#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"
dense_solvers.c 的引用(Include)关系图:

浏览该文件的源代码.

函数

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_mat_det()

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_mat_inv()

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 同维。
返回
LMMC_STATUS_OK 表示成功。

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

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 同长。
返回
LMMC_STATUS_OK 表示成功;非单位对角元为精确零时返回 ::LMMC_STATUS_SINGULAR_MATRIX;实际使用的矩阵元素、右端或运算结果 非有限时返回 ::LMMC_STATUS_NUMERICAL_FAILURE。

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

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输出秩值。
返回
注解
临时 SVD 工作空间在返回前释放。

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

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),内容被覆写。
返回
注解
迭代使用两个 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_mat_rdiv()

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().

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