2×3 被压平成 SVector<6>
Rust codegen 的单返回值路径把所有 `Matrix` 都格式化为 `nalgebra::SVector<scalar, rows × cols>`。这虽然保留了元素数量,却丢失二维形状:`Matrix23` 的函数签名和构造器都会变成 `SVector<f64, 6>`,调用方在 Rust 类型系统中再也看不到 2 行、3 列的矩阵语义。


面向机器人系统的高性能符号计算、代码生成与非线性优化库,将 Python 中的几何和符号模型转换为可部署的 C++、Rust 等运行时代码,并服务于 SLAM、计算机视觉、运动规划和自主系统。
生成代码不仅要保留数值,还必须把符号矩阵的行列结构带进目标语言的静态类型。
SVector<f64, 6>SMatrix<f64, 2, 3>Rust codegen 的单返回值路径把所有 `Matrix` 都格式化为 `nalgebra::SVector<scalar, rows × cols>`。这虽然保留了元素数量,却丢失二维形状:`Matrix23` 的函数签名和构造器都会变成 `SVector<f64, 6>`,调用方在 Rust 类型系统中再也看不到 2 行、3 列的矩阵语义。
元素数量相同不等于类型等价,`2×3`、`3×2` 与 `6×1` 必须拥有不同的静态形状。项目的多输出路径已经用 `format_typename` 正确区分向量和矩阵,因此单返回值不应另写一套压平规则;同时,返回签名与实际构造器必须复用同一个判断,否则生成代码仍会出现类型不一致。
在单返回值模板的两处关键位置——函数返回类型和返回值构造器——把 `format_vector` 统一替换为现有的 shape-aware `format_typename`。新增非方阵 `Matrix23` 回归,让 SymEngine 与 SymPy 两个后端都生成并编译 `SMatrix<f64, 2, 3>`;原有 `Matrix31` 则继续保持 `SVector<f64, 3>`。
`2×3` 等非方阵在生成的 Rust 签名与返回构造器中都保持 `SMatrix` 形状,列向量继续使用 `SVector`,两个符号后端不再产生类型分歧。回归覆盖 Python 3.10–3.14、GCC、Clang、macOS、x86_64 与 aarch64 构建。

图中间的 Codegen 把符号工具箱建立的几何与用户函数转换为运行时代码,再把残差和导数交给优化器。本次修复位于 Rust 后端的返回类型生成处:同时保留矩阵行列结构,才能让结果准确进入 nalgebra 的静态矩阵类型。