14 lmmc_real_t tnm = d[hi - 1] * d[hi - 1] + emm * emm;
15 lmmc_real_t tnn = d[hi] * d[hi] + e[hi - 1] * e[hi - 1];
19 if (bb == 0.0 && cc == 0.0) {
23 lmmc_real_t denom = (bb >= 0.0) ? (bb + disc) : (bb - disc);
24 return tnn - cc / denom;
30 lmmc_real_t f = d[lo] * d[lo] - trailing_shift(d, e, lo, hi);
32 for (
size_t i = lo; i < hi; ++i) {
38 f = c * d[i] + s * e[i];
39 e[i] = c * e[i] - s * d[i];
41 d[i + 1] = c * d[i + 1];
46 f = c * e[i] + s * d[i + 1];
47 d[i + 1] = c * d[i + 1] - s * e[i];
50 e[i + 1] = c * e[i + 1];
60 (lmmc_abs(d[index - 1]) + lmmc_abs(d[index]));
61 if (lmmc_abs(e[index - 1]) <= threshold) {
73 for (
size_t i = k + 1; i <= hi; ++i) {
88 for (
size_t k = lo; k < hi; ++k) {
90 cancel_zero_diagonal(d, e, k, hi, u);
100 const size_t max_iter_total = 30 * n + 30;
104 while (hi > 0 && deflate_edge(d, e, hi)) {
111 while (lo > 0 && !deflate_edge(d, e, lo)) {
114 if (cancel_block_zero(d, e, lo, hi, u)) {
117 if (iter++ > max_iter_total) {
120 bidiag_qr_step(d, e, lo, hi, u, v);
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_EPSILON
既有算法的经验近似阈值,非机器 epsilon。
void givens_right(lmmc_mat_t *M, size_t rows, size_t p, size_t q, lmmc_real_t c, lmmc_real_t s)
void givens_compute(lmmc_real_t a, lmmc_real_t b, lmmc_real_t *c, lmmc_real_t *s, lmmc_real_t *r)
特征值 / SVD 模块内部共享的缩放、Householder 与 Givens 辅助接口(仅源文件可见)。
lmmc_status_t lmmc_svd_diagonalize(lmmc_real_t *d, lmmc_real_t *e, size_t n, lmmc_mat_t *u, lmmc_mat_t *v)
稠密矩阵直接分解接口(LU、Cholesky、QR)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_CONVERGENCE_FAILED