首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在s-function builder中构建一个临时结构变量?

如何在s-function builder中构建一个临时结构变量?
EN

Stack Overflow用户
提问于 2019-06-18 12:22:00
回答 1查看 329关注 0票数 1

我在s函数构建器中遇到了一个问题,我必须使用temp结构变量来将输入传输到扩展的C函数。

背景: csolve函数是由CVXGEN为我的QP问题生成的二次规划求解器,我已经在level-2 matlab s-fun中测试了该函数。现在我想使用s函数生成器来生成支持嵌入式代码生成的TLC文件。

我的问题: 1)我必须使用一个临时结构变量'params‘到输出面板中的inputs to csolve函数,您能帮我解决这个问题吗? 2)我发现在cvxgen文件夹中包含一个包含'tic’和'toc‘函数的头文件,如何在s函数生成器中使用这些函数?

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 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中为:LoadLibraryGetProcAddressFreeLibrary)加载mex函数,并使用函数指针调用mex函数的函数mexFunction()

然而,在这种情况下,您必须将所有C数据类型转换为mxArray数据,并且必须将从mex函数返回的数据转换回...

...需要的TLC文件...嵌入式编码器

访问mxArray类型数据的函数仅在Matlab运行时可用。

如果你生成的代码在Matlab之外是可执行的,你就不能使用mxArray,因此你也不能调用mex函数。

文件csolve.c定义了四个结构变量:

代码语言:javascript
复制
Vars vars;
Params params;
Workspace work;
Settings settings;

该文件实际执行的操作如下:

  • 读取结构params (mxArray数据类型),将这些内容转换为C数据类型,并将数据写入上面的四个结构变量
  • 调用以下代码:

steps = solve();for (i = 0;i< extra_solves;i++) solve();

在project.

  • Take中的其他.c文件中定义了函数solve()、四个结构变量的值和由[vars, status]

返回的值step,并将数据转换为mxArray.

  • Return结果为[vars, status]

您可以在S-function代码中定义四个变量,像文件csolve.c一样填充这些结构,如上所述调用solve()函数,并直接从这四个变量读取varsstatus的数据。

从项目中删除csolve.c,并将mex函数的其他.c文件添加到S函数中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56641726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档