Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何在s-function builder中构建临时结构变量?_Matlab_Function_Simulink - Fatal编程技术网

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

Matlab 如何在s-function builder中构建临时结构变量?,matlab,function,simulink,Matlab,Function,Simulink,我在s函数生成器中遇到了一个问题,我必须使用temp结构变量将输入传输到扩展C函数 背景:csolve函数是CVXGEN为我的QP问题生成的二次规划解算器,我已经在2级matlab s-fun中测试了该函数。现在我想使用s function builder生成支持嵌入式代码生成的TLC文件 我的问题是: 1) 我必须使用一个临时结构变量“params”来输入输出面板中的csolve函数,你能帮我解决这个问题吗? 2) 我发现在cvxgen文件夹中包含一个包含'tic'和'toc'函数的头文件,如

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

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

我的问题是: 1) 我必须使用一个临时结构变量“params”来输入输出面板中的csolve函数,你能帮我解决这个问题吗? 2) 我发现在cvxgen文件夹中包含一个包含'tic'和'toc'函数的头文件,如何在s function builder中使用这些函数

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;


有关所附文件,请先参阅您应该了解的一些背景信息:

Matlab和C的工作方式完全不同,使用的数据类型也不同。为了从Matlab调用C代码,将生成所谓的“mex函数”。Matlab使用名为
mxArray
的特殊数据类型在Matlab和这些用C编写的“mex函数”之间交换数据

在C程序中,
mxArray
类型的元素(例如变量)表示任何数据类型的Matlab值。Matlab提供了一些函数(如
mxGetData()
)从C函数访问Matlab数据元素的实际数据:有一些函数用于检查
mxArray
是否表示浮点值或字符串。另一个函数允许您将
mxArray
中的值转换为
double
(如果元素具有浮点值)

这意味着您要从“S函数”调用“mex函数”

理论上,这是可能的,但并不像你想象的那么容易:

首先,这两种函数的入口点在C代码中都被命名为
mexFunction()
。这意味着您不能简单地组合两个函数的C代码,因为在这种情况下,您的S函数中将有两个同名的函数(
mexFunction

您可以调用函数
mexCallMATLAB
;然而,Mathworks写道,不应从S函数调用此函数

另一种可能是使用DLL函数加载mex函数(在Windows中:
LoadLibrary
GetProcAddress
FreeLibrary
),并使用函数指针调用mex函数的函数
mexFunction()

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

。。。在…中需要的TLC文件。。。嵌入式编码器

只有在Matlab运行时,才能使用访问
mxArray
类型数据的函数

如果生成的代码应在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();
    
    steps=solve();
    对于(i=0;i
    函数
    solve()
    在项目中的其他
    .c
    文件中定义

  • 从四个结构变量和
    solve()
    返回的
    step
    值中获取值,并将数据转换为
    mxArray

  • 将结果返回为
    [vars,status]
您可以在S函数代码中定义四个变量,以文件
csolve.c
的相同方式填充这些结构,调用如上所示的
solve()
函数,并直接从四个变量读取
vars
status
的数据


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

首先介绍一些您应该了解的背景信息:

Matlab和C的工作方式完全不同,使用的数据类型也不同。为了从Matlab调用C代码,将生成所谓的“mex函数”。Matlab使用名为
mxArray
的特殊数据类型在Matlab和这些用C编写的“mex函数”之间交换数据

在C程序中,
mxArray
类型的元素(例如变量)表示任何数据类型的Matlab值。Matlab提供了一些函数(如
mxGetData()
)从C函数访问Matlab数据元素的实际数据:有一些函数用于检查
mxArray
是否表示浮点值或字符串。另一个函数允许您将
mxArray
中的值转换为
double
(如果元素具有浮点值)

这意味着您要从“S函数”调用“mex函数”

理论上,这是可能的,但并不像你想象的那么容易:

首先,这两种函数的入口点在C代码中都被命名为
mexFunction()
。这意味着您不能简单地组合两个函数的C代码,因为在这种情况下,您的S函数中将有两个同名的函数(
mexFunction

您可以调用函数
mexCallMATLAB
;然而,Mathworks写道,不应从S函数调用此函数

另一种可能是使用DLL函数加载mex函数(在Windows中:
LoadLibrary
GetProcAddress
FreeLibrary
)并调用函数
mexFunction()
steps = solve();
for (i = 0; i < extra_solves; i++)
    solve();