10static void accumulate_reflector(
lmmc_mat_t *factor,
size_t start,
14 if (tau == 0.0)
return;
15 for (
size_t row = 0; row < factor->
rows; ++row) {
17 for (
size_t i = 1; i < length; ++i) {
18 sum += vector[i] *
MAT_ELEM(factor, row, start + i);
22 for (
size_t i = 1; i < length; ++i) {
23 MAT_ELEM(factor, row, start + i) -= sum * vector[i];
31 const size_t length = work->
rows - k;
33 for (
size_t i = 0; i < length; ++i) {
34 vector[i] =
MAT_ELEM(work, k + i, k);
37 if (k + 1 < work->
cols) {
40 accumulate_reflector(u, k, length, vector, tau);
47 const size_t length = work->
cols - k - 1;
49 for (
size_t j = 0; j < length; ++j) {
50 vector[j] =
MAT_ELEM(work, k, k + 1 + j);
53 if (k + 1 < work->
rows) {
57 accumulate_reflector(v, k + 1, length, vector, tau);
69 for (
size_t i = 0; i < a->
rows; ++i) {
70 for (
size_t j = 0; j < a->
cols; ++j) {
74 lmmc_fill_identity_unchecked(u);
75 lmmc_fill_identity_unchecked(v);
81 for (
size_t k = 0; k < a->
cols; ++k) {
82 d[k] = reduce_column(&work, u, k, vector);
83 e[k] = (k + 1 < a->
cols) ? reduce_row(&work, v, k, vector) : 0.0;
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t lmmc_mat_create(size_t rows, size_t cols, lmmc_mat_t *out_mat)
创建 rows x cols 的零矩阵。
void lmmc_mat_destroy(lmmc_mat_t *mat)
销毁矩阵,释放其拥有的缓冲区并清零结构体字段。
void householder_apply_left(lmmc_mat_t *M, size_t i0, size_t len, size_t j0, size_t j1, const lmmc_real_t *v, lmmc_real_t tau)
void householder_make(lmmc_real_t *x, size_t len, lmmc_real_t *tau_out, lmmc_real_t *beta_out)
void householder_apply_right(lmmc_mat_t *M, size_t i0, size_t i1, size_t j0, size_t len, const lmmc_real_t *v, lmmc_real_t tau)
特征值 / SVD 模块内部共享的缩放、Householder 与 Givens 辅助接口(仅源文件可见)。
#define MAT_ELEM(mat, i, j)
lmmc_status_t lmmc_svd_bidiagonalize(const lmmc_mat_t *a, lmmc_real_t input_scale, lmmc_real_t *d, lmmc_real_t *e, lmmc_mat_t *u, lmmc_mat_t *v)
void * lmmc_memory_alloc_array(size_t count, size_t element_size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_ALLOCATION_FAILED