跳转至

矩阵分解 — 实现

位于 middleware/tiny_math/decomp/。本页以 Core 工程的 tiny_decomp_mgs.c 与公共头文件为依据。

数据与内存契约

项目 当前 MGS 实现
输入 A m × k 行主序,元素 A[r*k+j],要求 m > 0、0 < k <= m
输出 Q 原地覆盖 A;要检查重建误差,应先保存原矩阵
输出 R 调用者分配 k × k,下三角清零
工作区 tiny_mgs_f32_workspace_size(m,k) 当前返回 0;不要据旧注释另行推算
错误返回 空指针、非法维度返回 TINY_ERR_INVALID_ARG

一列如何正交化

对第 j 列,逐个计算与已有 q_i 的内积,写入 R[i*k+j],并立即减去投影。随后计算范数,写入 R[j*k+j] 并归一化。按列访问时内存跨距为 k,不能误当连续列向量。

范数小于 1e-15f 时置为零;实现跳过除零,但不通过单独错误码报告秩亏。零对角与正交性残差需要由调用者解释。函数返回 TINY_OK 不等于输入满秩。

再正交化与验证

reorthogonalize != 0 时执行第二次投影,累加 R 的修正并重新归一化。它增加计算量,效果依赖矩阵条件数与浮点误差,不能固定承诺某个残差数量级。

tiny_mgs_check_orthogonality_f32(Q,m,k) 计算 ||QᵀQ-I||F。完整验证还应检查 ||A_original-QR||;只有正交性不能证明分解重建正确。该辅助函数对非法参数也返回 0,必须先保证参数合法。

与 Householder 实现一起阅读

tiny_decomp_hqr.c 是另一条 QR 路径。它的接口、工作区与布局应按 tiny_decomp.h 单独核对,不沿用 MGS 原地覆盖的契约。先看接口与矩阵测试,再用同一输入比较残差和工作区。

源码 / Source