我在s函数构建器中遇到了一个问题,我必须使用temp结构变量来将输入传输到扩展的C函数。
背景: csolve函数是由CVXGEN为我的QP问题生成的二次规划求解器,我已经在level-2 matlab s-fun中测试了该函数。现在我想使用s函数生成器来生成支持嵌入式代码生成的TLC文件。
我的问题: 1)我必须使用一个临时结构变量'params‘到输出面板中的inputs to csolve函数,您能帮我解决这个问题吗? 2)我发现在cvxgen文件夹中包含一个包含'tic’和'toc‘函数的头文件,如何在s函数生成器中使用这些函数?
params.Aeq=Aeq;
params.beq=beq;
params.Aineq=Aineq;
params.bineq=bineq;
params.Smat=Smat;
params.Wmat=Wmat;
params.alpha=alpha;
[vars, status] = csolve(params)
y0=vars.x;
converge=status.converge;



有关附件,请参阅here
发布于 2019-06-18 21:27:14
首先是一些你应该知道的背景信息:
Matlab和C的工作方式完全不同,使用的数据类型也不同。为了从Matlab中调用C代码,需要生成所谓的“mex函数”。Matlab使用一种名为mxArray的特殊数据类型在Matlab和这些用C语言编写的“mex函数”之间交换数据。
在C程序中,mxArray类型的元素(例如变量)表示任何数据类型的Matlab值。Matlab提供了一些函数(如mxGetData())来从C函数访问Matlab数据元素的实际数据:有一些函数用于检查mxArray表示的是浮点值还是字符串。如果元素具有浮点值,另一个函数允许您将值从mxArray转换为double。
变量,状态=csolve(参数)
这意味着你想从一个"S-function“调用一个"mex-function”。
从理论上讲,这是可能的,但并不像你想象的那么容易:
首先,在C代码中,这两种类型函数的入口点都被命名为mexFunction()。这意味着您不能简单地将这两个函数的C代码组合在一起,因为在这种情况下,您的S函数中将有两个同名的函数(mexFunction)。
您可以将函数称为mexCallMATLAB;但是Mathworks写道,不应该从S-functions调用此函数。
另一种可能是使用DLL函数(在Windows中为:LoadLibrary、GetProcAddress、FreeLibrary)加载mex函数,并使用函数指针调用mex函数的函数mexFunction()。
然而,在这种情况下,您必须将所有C数据类型转换为mxArray数据,并且必须将从mex函数返回的数据转换回...
...需要的TLC文件...嵌入式编码器
访问mxArray类型数据的函数仅在Matlab运行时可用。
如果你生成的代码在Matlab之外是可执行的,你就不能使用mxArray,因此你也不能调用mex函数。
文件csolve.c定义了四个结构变量:
Vars vars;
Params params;
Workspace work;
Settings settings;该文件实际执行的操作如下:
params (mxArray数据类型),将这些内容转换为C数据类型,并将数据写入上面的四个结构变量steps = solve();for (i = 0;i< extra_solves;i++) solve();
在project.
.c文件中定义了函数solve()、四个结构变量的值和由[vars, status]
返回的值step,并将数据转换为mxArray.
[vars, status]您可以在S-function代码中定义四个变量,像文件csolve.c一样填充这些结构,如上所述调用solve()函数,并直接从这四个变量读取vars和status的数据。
从项目中删除csolve.c,并将mex函数的其他.c文件添加到S函数中。
https://stackoverflow.com/questions/56641726
复制相似问题