|
LMMC
Lamina Mathematic core
|
奇异值分解、事务式伪逆与条件数计算。 更多...
#include <math.h>#include <string.h>#include "internal/eigen_svd_internal.h"#include "internal.h"#include "eigen_internal.h"#include "lmmc/linear_algebra.h"函数 | |
| lmmc_status_t | lmmc_svd (const lmmc_mat_t *a, lmmc_svd_result_t *out_result) |
| 计算奇异值分解:A = U * Σ * V^T. | |
| lmmc_status_t | lmmc_pinv (const lmmc_mat_t *a, lmmc_real_t tol, lmmc_mat_t *out_pinv) |
| 计算 Moore-Penrose 伪逆 A^+。 | |
| lmmc_status_t | lmmc_cond (const lmmc_mat_t *a, lmmc_real_t *out_cond) |
| 计算矩阵的 2-范数条件数:κ_2(A) = sigma_max / sigma_min. | |
| void | lmmc_svd_result_destroy (lmmc_svd_result_t *result) |
| 释放 lmmc_svd 输出结果. | |
奇异值分解、事务式伪逆与条件数计算。
在文件 eigen_svd.c 中定义.
| lmmc_status_t lmmc_svd | ( | const lmmc_mat_t * | a, |
| lmmc_svd_result_t * | out_result ) |
计算奇异值分解:A = U * Σ * V^T.
算法:Householder 双对角化 -> Golub-Kahan 隐式 QR 迭代. 奇异值按降序排列. 有限输入先按最大绝对元素缩放到安全范围,分解后再恢复奇异值尺度, 避免双对角化和 QR 位移中的平方发生中间溢出。
| [in] | a | mxn 矩阵(不被修改). |
| [out] | out_result | 输出 U(mxm),sigma(min(m,n)),Vt(nxn). 调用方需配对调用 lmmc_svd_result_destroy 释放. |
在文件 eigen_svd.c 第 75 行定义.
引用了 lmmc_mat_t::cols, lmmc_eigen_matrix_scale(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_svd(), lmmc_svd_result_destroy(), lmmc_svd_tall(), lmmc_mat_t::rows , 以及 lmmc_svd_result_t::sigma.
被这些函数引用 lmmc_cond(), lmmc_mat_rank(), lmmc_pinv(), lmmc_std_linalg_svd() , 以及 lmmc_svd().
| lmmc_status_t lmmc_pinv | ( | const lmmc_mat_t * | a, |
| lmmc_real_t | tol, | ||
| lmmc_mat_t * | out_pinv ) |
计算 Moore-Penrose 伪逆 A^+。
内部通过 SVD 实现:A^+ = V * Σ^{-1}_trunc * U^T, 仅保留严格大于截断阈值的奇异值,其余项截断为零。
| [in] | a | mxn 矩阵(不被修改)。 |
| [in] | tol | 奇异值截断阈值;<=0 时使用 max(m,n)*eps*sigma_max。 |
| [out] | out_pinv | nxm 输出矩阵,须已创建。 |
在文件 eigen_svd.c 第 203 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_create(), lmmc_mat_destroy(), lmmc_pinv(), LMMC_STATUS_OK, lmmc_svd(), lmmc_svd_result_destroy(), lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_pinv().
| lmmc_status_t lmmc_cond | ( | const lmmc_mat_t * | a, |
| lmmc_real_t * | out_cond ) |
计算矩阵的 2-范数条件数:κ_2(A) = sigma_max / sigma_min.
内部通过 SVD 计算.若 sigma_min ~= 0 则条件数为 Inf.
| [in] | a | 输入矩阵(不被修改). |
| [out] | out_cond | 输出条件数. |
在文件 eigen_svd.c 第 237 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_vec_t::data, lmmc_cond(), 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_cond().
| void lmmc_svd_result_destroy | ( | lmmc_svd_result_t * | result | ) |
释放 lmmc_svd 输出结果.
在文件 eigen_svd.c 第 262 行定义.
引用了 lmmc_mat_destroy(), lmmc_svd_result_destroy(), lmmc_vec_destroy(), lmmc_svd_result_t::sigma, lmmc_svd_result_t::U , 以及 lmmc_svd_result_t::Vt.
被这些函数引用 lmmc_cond(), lmmc_mat_rank(), lmmc_pinv(), lmmc_std_linalg_svd(), lmmc_std_linalg_svd_table(), lmmc_svd(), lmmc_svd_result_destroy() , 以及 lmmc_svd_tall().