矩阵分解 — 实现¶
位于 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 原地覆盖的契约。先看接口与矩阵测试,再用同一输入比较残差和工作区。