coneprog
背景下的代码生成
什么是代码生成?
代码生成指使用 MATLAB® Coder™ 将 MATLAB 代码转换为 C/C++ 代码。代码生成需要 MATLAB Coder 许可证。
通常,您使用代码生成在未运行 MATLAB 的硬件上部署代码。
有关示例,请参阅 为 coneprog 生成代码。有关其他优化求解器中的代码生成示例,请参阅 为 fmincon 生成代码、为 fsolve 生成代码 或 为 lsqcurvefit 或 lsqnonlin 生成代码。
代码生成要求
请注意以下为 coneprog
生成代码的具体要求:
coneprog
支持使用codegen
(MATLAB Coder) 函数或 MATLAB Coder 生成代码。您必须拥有 MATLAB Coder 许可证才能生成代码。目标硬件必须支持标准双精度浮点计算。
代码生成目标与 MATLAB 求解器不使用相同的数学核心函数库。因此,代码生成解可能不同于求解器解,尤其是对于病态问题。
在生成代码时,
coneprog
不支持problem
参量。[x,fval] = coneprog(problem) % Not supported
所有
coneprog
输入矩阵,如A
、Aeq
、secondordercone
输入、lb
和ub
,均可为全矩阵或稀疏矩阵。要使用稀疏输入,必须启用动态内存分配。请参阅Code Generation Limitations (MATLAB Coder)。当非零项的占比很小时,求解器在使用稀疏输入的情况下表现良好。将锥约束作为
SecondOrderConeConstraint
对象的元胞数组传递,而不是作为这些对象的数组传递。如果没有锥约束,请传递一个空数组{}
。参量
lb
和ub
的条目数必须与问题变量的数目相同,或者必须为空[]
。如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
。对于涉及嵌入式处理器的高级代码优化,您还需要 Embedded Coder® 许可证。
代码生成支持
optimoptions
的以下选项:ConstraintTolerance
Display
LinearSolver
MaxIterations
OptimalityTolerance
生成的代码只会对选项进行有限的错误检查。更新选项的推荐方法是使用点符号,而不是
optimoptions
。opts = optimoptions("coneprog",ConstraintTolerance=1e-4); opts = optimoptions(opts,MaxIterations=1e4); % Not preferred opts.MaxIterations = 1e4; % Recommended
coneprog
支持传递给求解器的选项,而不仅仅是在代码中创建的选项。如果您指定了不受支持的选项,在代码生成过程中通常会忽略该选项。为了获得可靠的结果,请仅指定支持的选项。
生成的代码不是多线程的
默认情况下,在 MATLAB 环境之外使用的生成代码使用非多线程的线性代数库。因此,此类代码的运行速度可能比 MATLAB 环境中的代码慢得多。
如果您的目标硬件有多个核,您可以通过使用自定义的多线程 LAPACK 和 BLAS 库来获得更好的性能。有关将这些库纳入生成的代码中的详细信息,请参阅Speed Up Linear Algebra in Generated Standalone Code by Using LAPACK Calls (MATLAB Coder)。
另请参阅
coneprog
| codegen
(MATLAB Coder) | optimoptions
| optim.coder.infbound