主要内容

静态内存分配fmincon代码生成

这个例子展示了如何使用静态内存分配在代码生成,即使一些矩阵大小变化时计算。

这个问题是一个简单的非线性最小化一个非线性约束函数和线性约束。线性约束矩阵的大小变化在每一次迭代,导致内存需求增加在每个迭代。这个例子显示了如何使用coder.varsize命令来设置适当的变量大小静态内存分配。

nlp_for_loop.m文件包含目标函数、线性约束和非线性约束函数。将下面的代码复制到你的MATLAB上创建该文件®路径。

函数nlp_for_loop%的司机为例fmincon用例。添加约束增加了%最小和使用更多的内存。maxIneq = 4;%的数量线性不等式约束据nVar = 5;变量x %的数量问题一个= 0(0,据nVar);b = 0 (0, 1);%下一步是静态内存所需的支持。金宝app因为你连接%的约束在一个for循环,需要限制的尺寸%约束矩阵。%编码器。varsize (var的名字,[maxRows maxCols], [canRowsChange canColsChange]);coder.varsize (“一个”[maxIneq,据nVar],[真,假]);coder.varsize (“b”[maxIneq, 1],[真,假]);Aeq = [1, 0, 0, 0, 1];说真的= 0;磅= [];乌兰巴托= [];%初始点x0 = [2, 3, 0, 0; 2);选择= optimoptions (“fmincon”,“算法”,“sqp”,“显示”,“没有”);idx = 1: maxIneq%在每一次迭代时添加一个新的线性不等式约束一个=[一个;circshift ([1 1 0, 0, 0), idx-1)];b = [b;1);[x, fval exitflag] = fmincon (Aeq @rosenbrock_nd x0, A, b,说真的,磅,乌兰巴托,@circleconstr选项);%设置初始点发现点x0 = x;%打印fval,确保数据类型是一致的%相应流格式说明符流(' %我不等式约束;fval: % f;Exitflag: % \ n”,int32(元素个数(b))、fval int32 (exitflag));结束结束函数fval fval = rosenbrock_nd (x) = 100 *总和((x(2:结束)- x (1: end-1)。^ 2)。^ 2 + (1 - x (1: end-1)) ^ 2);结束函数测查[c] = circleconstr半径(x) = 2;测查= [];c = (x和。^ 2),半径^ 2;结束

从这个文件来生成代码使用静态内存分配,设置编码器配置如下。

cfg = coder.config (墨西哥人的);cfg。DynamicMemoryAllocation =“关闭”;%没有动态内存分配cfg。SaturateOnIntegerOverflow = false;%没有MATLAB整数饱和检查cfg。IntegrityChecks = false;%没有检查界外访问数组

生成的代码nlp_for_loop.m文件。

codegen配置cfgnlp_for_loop

运行生成的墨西哥人文件。

nlp_for_loop_mex
1不等式约束;fval: 542.688894;Exitflag: 1 2不等式约束;fval: 793.225322;Exitflag: 1 3不等式约束;fval: 1072.945843;Exitflag: 1 4不等式约束;fval: 1400.000000;Exitflag: 1

在每步迭代函数值增加,因为有更多的约束问题。

相关的话题