Mat (C) — 实现¶
文件结构¶
依赖:tiny_linalg.h、tiny_cfloat.h、tiny_decomp.h、tiny_eigen.h、tiny_modal.h、tiny_iterative.h。
实现¶
重构后,tiny_mat.c 仅包含两个函数:
void print_matrix(const char *name, const float *mat, int rows, int cols)
{
printf("%s =\n\r", name);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%10.6f ", mat[i * cols + j]);
printf("\n\r");
}
printf("\n\r");
}
- 假设 连续 存储(无 padding)
- 行顺序:
element(i, j) = mat[i * cols + j] - 精度:6 位小数,10 字符宽度
void print_matrix_padded(const char *name, const float *mat,
int rows, int cols, int step)
{
printf("%s =\n\r", name);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%10.6f ", mat[i * step + j]);
printf("\n\r");
}
printf("\n\r");
}
- 考虑行 padding:
element(i, j) = mat[i * step + j] step= 逻辑列数 + 每行 padding- Padding 元素在显示时跳过,但存在于内存中
包含图¶
tiny_mat.h
├── tiny_math_config.h
├── tiny_linalg.h (线性代数 API)
├── tiny_cfloat.h (复数 API)
├── tiny_decomp.h (分解 API)
├── tiny_eigen.h (特征值 API)
├── tiny_modal.h (模态分析 API)
└── tiny_iterative.h (迭代方法 API)
所有子模块头文件均有 #pragma once 保护,双重包含无害。统一头文件 tiny_math.h 也包含所有这些——没有冲突。
遗留代码¶
重构前(见 tiny_math 源码目录中的 PLAN.md),tiny_mat.c 包含:
- 逐元素算术 → linalg/
- 复数类型 → cfloat/
- MGS QR / HQR → decomp/
- Hessenberg / Francis QR / 模态 → eigen/
- Arnoldi / Lanczos / RSVD → iterative/
- 测试代码 → test/
旧的单体方法使维护困难(单个 1920 行的 C 文件)。新的模块化结构保持每个关注点独立且可测试。