我在s函数生成器中遇到问题,我必须使用temp结构变量将输入传输到扩展的C函数。
背景:csolve函数是CVXGEN针对我的QP问题生成的二次编程求解器,我已经在2级matlab s-fun中测试了该函数。现在,我想使用s函数生成器来生成支持嵌入式代码生成的TLC文件。
我的问题: 1)我必须在输入中使用临时结构变量'params'才能在输出面板中解决功能,请您能帮我解决这个问题吗? 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
答案 0 :(得分:0)
首先,您应该了解一些背景信息:
Matlab和C的工作原理完全不同,并且使用不同类型的数据类型。为了从Matlab调用C代码,会生成所谓的“ mex函数”。 Matlab使用名为mxArray
的特殊数据类型在Matlab与这些用C编写的“ mex函数”之间交换数据。
在C程序中,类型mxArray
的元素(例如变量)表示任何数据类型的Matlab值。 Matlab提供了一些函数(如mxGetData()
)来从C函数访问Matlab数据元素的实际数据:有一些函数可以检查mxArray
是表示浮点值还是字符串。如果元素具有浮点值,则可以使用另一个函数将值从mxArray
转换为double
。
[vars, status] = csolve(params)
这意味着您要从“ S函数”调用“ mex函数”。
从理论上讲,这是可能的,但这并不像您想的那么简单:
首先,两种类型的函数的入口点在C代码中被命名为mexFunction()
。这意味着您不能简单地组合两个函数的C代码,因为在这种情况下,您的S函数中将有两个具有相同名称(mexFunction
)的函数。
您可以调用函数mexCallMATLAB
;但是Mathworks写道,不应从S函数调用此函数。
另一种可能性是使用DLL函数(在Windows中为LoadLibrary
,GetProcAddress
,FreeLibrary
)加载DLL函数,然后调用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();
函数solve()
在项目的其他.c
文件中定义。
取四个结构变量的值和step
返回的值solve()
并将数据转换为mxArray
。
[vars, status]
您可以在S函数代码中定义四个变量,以与文件csolve.c
相同的方式填充这些结构,调用如上所示的solve()
函数并读取其中的数据vars
和status
直接来自四个变量。
您从项目中删除了csolve.c
,并将mex函数的其他.c
文件添加到S函数。