quadprog
背景下的代码生成
什么是代码生成?
代码生成指使用 MATLAB® Coder™ 将 MATLAB 代码转换为 C/C++ 代码。代码生成需要 MATLAB Coder 许可证。
通常,您使用代码生成在未运行 MATLAB 的硬件上部署代码。
有关示例,请参阅为 quadprog 生成代码。有关其他优化求解器中的代码生成,请参阅为 fmincon 生成代码、为 lsqcurvefit 或 lsqnonlin 生成代码或为 fsolve 生成代码。
代码生成要求
quadprog
支持使用codegen
(MATLAB Coder) 函数或 MATLAB Coder 生成代码。您必须拥有 MATLAB Coder 许可证才能生成代码。目标硬件必须支持标准双精度浮点计算或标准单精度浮点计算。
代码生成目标与 MATLAB 求解器不使用相同的数学核心函数库。因此,代码生成解可能不同于求解器解,尤其是对于病态问题。
要在生成代码前在 MATLAB 中测试代码,请将
UseCodegenSolver
选项设置为true
。这样,求解器便可使用代码生成创建的相同代码。在生成代码时,
quadprog
不支持problem
参量。[x,fval] = quadprog(problem) % Not supported
所有
quadprog
输入矩阵(如A
、Aeq
、lb
和ub
)都必须是满矩阵,而不能是稀疏矩阵。您可以使用full
函数将稀疏矩阵转换为满矩阵。lb
和ub
参量的条目数必须与H
中的列数相同,或必须为空[]
。如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
。对于涉及嵌入式处理器的高级代码优化,您还需要 Embedded Coder® 许可证。
您必须包括适用于
quadprog
的选项,并使用optimoptions
指定这些选项。选项中必须包括Algorithm
并将其设置为'active-set'
。options = optimoptions("quadprog",Algorithm="active-set"); [x,fval,exitflag] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options);
代码生成支持以下选项:
Algorithm
- 必须为'active-set'
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
UseCodegenSolver
生成的代码只会对选项进行有限的错误检查。更新选项的推荐方法是使用
optimoptions
,而不是圆点表示法。opts = optimoptions('quadprog','Algorithm','active-set'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
不要从文件中加载选项。否则会导致代码生成失败。请在代码中创建选项。
如果您指定了不受支持的选项,在代码生成过程中通常会忽略该选项。为了获得可靠的结果,请仅指定支持的选项。
单精度代码生成
要为单精度浮点硬件生成代码,请遵循以下规范。
确保所有求解器输入都有单精度值。这些输入包括所有空值和无限值。例如,如果 3-D 问题的边界为
lb = [0,-Inf,0]
和ub = [1,100,Inf]
,则请按如下方式设置参数:lb = [single(0),-optim.coder.infbound("single"),single(0)]; ub = [single([1,100]),optim.coder.infbound("single")];
确保所有空的求解器参量都是单精度的。例如:
Aeq = single([]); % Or single.empty beq = single([]); % Or single.empty
有关单精度 quadprog
代码生成的示例,请参阅生成单精度 quadprog 代码。
生成的代码不是多线程的
默认情况下,在 MATLAB 环境之外使用的生成代码使用非多线程的线性代数库。因此,此类代码的运行速度可能比 MATLAB 环境中的代码慢得多。
如果您的目标硬件有多个核,您可以通过使用自定义的多线程 LAPACK 和 BLAS 库来获得更好的性能。有关将这些库纳入生成的代码中的详细信息,请参阅Speed Up Linear Algebra in Generated Standalone Code by Using LAPACK Calls (MATLAB Coder)。
另请参阅
quadprog
| codegen
(MATLAB Coder) | optimoptions
| optim.coder.infbound