跳转至

Mat (C) — 实现

文件结构

mat/
├── tiny_mat.h        (39 行 — 声明 + 子模块包含)
└── tiny_mat.c        (47 行 — 实现,仅打印工具)

依赖:tiny_linalg.htiny_cfloat.htiny_decomp.htiny_eigen.htiny_modal.htiny_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 文件)。新的模块化结构保持每个关注点独立且可测试。