北太天元代码生成工具箱:从 M 脚本到独立运行的 C/C++ 程序

2026-11-03

北太天元代码生成工具箱将 M 脚本函数转换为标准 C / C++ 代码,在未安装北太天元软件的平台上编译运行,支撑模型算法部署到对实时性要求较高的硬件或资源受限平台。工具箱提供 C 和 C++ 两种生成方案,差异源于类型解析时机的选择:C 方案在生成阶段以静态分析确定全部类型推导、值推导与函数重载关系,以生成更多特化代码为代价,换取运行性能与高可以执性——总体运行性能较北太天元解释器提高 2-3 个数量级,部分代码经优化后提高约 4 个数量级;C++ 方案统一使用天元插件 SDK 中的动态类型,借助天元的动态库换取对复杂 M 脚本的广泛兼容,基本支持全部非面向对象的数据类型、语法与非 GUI 内建函数。前者服务于对实时性和自主可控要求较高的嵌入式与资源受限场景,后者服务于需要保留脚本灵活性、快速部署到桌面或服务器的场景。

一、生成流程

生成环节的全部操作为一条 codegen 命令:

% 生成 C 工程;缺省 -target 选项时生成 C++ 工程 
codegen SOC_estimate.m -outdir output -target C

输出目录包含 C / C++ 源码、CMakeLists.txt、include 与 src 文件夹及记录生成过程的 codegen.log,生成失败时可依据日志定位原因。生成带参数的入口函数时,可通过 -types 选项指定入参类型、-entry-args 选项给出示例输入,支持的类型覆盖单 / 双精度浮点、8~64 位有符号与无符号整型、字符、逻辑、复数及元胞、结构体等复合类型。编译环节使用 CMake 与 MSVC、GCC、Clang 等通用工具链,不引入专用构建工具;对已建立编译流程的团队,生成产物可作为源码直接并入现有工程。

二、支持范围与使用限制

由于 C++ 生成方案基本支持全部非面向对象的数据类型、语法与非 GUI 内建函数,这里主要对 C 生成方案的支持范围与使用限制进行说明。C 方案的支持清单收录于工具箱帮助文档《代码生成工具箱 C 代码生成支持的函数与算符》,共 230 个条目,其中函数 190 个、算符 40 个。190 个函数中,142 个属 builtin 命名空间,即 M 语言内建函数;其余 48 个分属 bair、c、internal 命名空间,为生成代码内部使用的中间表示与运行时函数。支持 C 生成的内建函数中,面向数值计算的常用为 134 个,按用途可分为九类。其中,类型判断与转换(33 个)与初等数学(29 个)两类合计 62 个,接近总量的一半,函数覆盖围绕实数域数值计算构成,与生成目标一致。数据类型覆盖单 / 双精度浮点、整型、字符、逻辑、复数及元胞、结构体等复合类型及其矩阵形式;40 种算符覆盖矩阵与元素级运算、关系与逻辑运算、数组索引与拼接、结构体字段访问、转置与冒号运算;语法支持条件分支、循环嵌套、函数定义、多脚本以及可变长度参数、函数句柄等常用形式。

注意,上述内建函数的部分用法尚未支持 C 生成,详见代码生成工具箱帮助文档中的具体说明。综合来看,代码生成工具箱的适用范围包括:算法主体为实数域数值计算的控制、滤波、状态估计类程序,C 方案可直接承接;大量使用复数矩阵运算或依赖 GUI 交互的代码,生成前需对照支持清单逐项评估。示例库随安装包发布,位于 examples/toolbox/CodeGeneration,共 164 个示例(C 侧 134 个、C++ 侧 30 个),每个示例为一个可独立生成的 M 文件,覆盖支持的语法与函数范围,可用于复现生成与编译过程。

三、案例:锂电池 SOC 估算的生成与跨平台部署

3.1 业务问题与算法结构

电池管理系统(BMS)无法直接测量电池荷电状态(SOC),需通过可测量的端电压与电流间接估计。案例算法在北太天元中以 M 脚本实现:安时积分法构建状态方程,OCV-SOC 查表插值构建观测方程,卡尔曼滤波完成状态预测与更新,在模拟城市驾驶的动态电流工况下运行 300 步。脚本包含电池参数定义、模拟工况、卡尔曼滤波完整迭代与误差评估,并自定义实现了含可变参数的插值函数 interp1。用户自定义函数与内建函数混用的结构,同时覆盖函数定义、可变参数传递与内建函数调用,可用于检验代码生成对复杂语法结构的处理能力。相关案例代码参考安装目录下:examples\toolbox\CodeGeneration\scripts_c\test60

3.2 生成、编译与运行

在北太天元中打开案例目录,执行如下命令:

% 生成 C 代码
codegen SOC_estimate.m -outdir output -target c -recursive

生成产物为标准 C 工程,可直接编译:

  • 入口源文件 SOC_estimate.c 涵盖 main 函数、SOC_estimate 与 interp1 两个 M 函数的完整实现及所调用内建函数的 C 版本;

  • src/ 为运行时支持源码,共 14 个源文件(数学库包装、字符与复数处理等),include/ 为配套头文件。

案例涉及的三类复杂语法结构在产物中均有对应实现:

检验点M 脚本中的写法生成的 C 代码
自定义函数调用interp1(v_ocv_soc, v_ocv_val, soc, 'linear', 'extrap')转换为独立 C 函数,4 处调用点全部正确改写
可变参数传递function yi = interp1(x, y, xi, varargin)varargin 转为结构体参数,随函数签名传递
多态函数重载同一内建函数接受不同类型输入按入出参类型哈希区分版本,如 find、max 各生成两个实现

C 工程的编译由目录中的 CMakeLists.txt 承接。该文件已针对 GCC、Clang 与 MSVC 三类编译器完成适配:统一采用 C99 标准,按编译器分别设置告警与优化选项,非 MSVC 平台自动链接数学库 m;Debug 构建固定随机数种子,Release 构建开启 -O3 优化并关闭矩阵尺寸与越界检查。打开Windows命令行,切换到output目录,依次执行如下命令:

cmake -B build -DCMAKE_BUILD_TYPE=Release 
cmake --build build

编译产物为独立可执行文件 SOC_estimate.exe,与 CMakeLists.txt 在相同目录,build/ 仅存放编译中间文件。双击运行后即在当前目录生成 simulation_data.txt,含 300 行仿真数据,每行包含步号、电流、真实 SOC 与估计 SOC 四列。

3.3 运行结果

北太天元中运行 gen_plot('output'),自动读取前一步生成的 simulation_data.txt 文件,完成结果图形绘制:上面为动态电流工况;中间为估计 SOC 曲线与真实 SOC 曲线保持重合,随工况演变同步变化;下面为估计误差曲线,全程峰值 2.1 个百分点,均值 0.63 个百分点,最终误差 0.66%,满足小于 1% 的工程要求。

3.4 性能验证

下图为六种平台与优化组合下,生成 C 代码相对北太天元解释器的加速情况:

解释器执行一次耗时 3.61 s,C 端取 100 次执行平均,六种组合的加速倍数为 892×~10,548×。

下载与试用

北太天元 2026 版本已正式发布,代码生成工具箱随版本提供,示例库位于安装目录 examples/toolbox/CodeGeneration。您可从以下链接下载试用:https://www.baltamatica.com/download

使用过程中如遇生成失败,可先查看输出目录中的 codegen.log 定位原因。

*代码生成工具箱需在已激活的许可下使用,社区版不包含该工具箱