人在仿真软件万博1manbetx

万博1manbetx仿真软件和基于模型的设计

利用生成的代码从MATLAB c++应用程序

今天我很高兴欢迎客人的博客 艾琳McGarrity 。的主要原因是我兴奋地欢迎艾琳嘉宾,他将讨论从MATLAB代码生成C / c++代码和仿真软件模型使用万博1manbetx MATLAB编码器 , 万博1manbetx仿真软件编码器 嵌入式编码器 。虽然我曾经更关注simulation-related主题在这个博客上,我意识到代码生成是一个重要的话题很多这个博客的读者。我们想听在下面的评论今天的话题,你觉得什么和什么其他代码生成相关的话题你想看到在这个博客上。

介绍

假设我们有一个奇特的MATLAB的数值程序,我们一直在做,我们想利用一个外部c++应用程序。在这篇文章中,我们将展示如何生成一个动态库从MATLAB代码可以调用一个c++项目。这将允许我们利用MATLAB的强大的外部程序。

MATLAB代码

为了演示工作流,让我们创建一个常规执行一条适合一些数据。这个函数有两个输入, x y ,都是适合的数据向量。这些向量应该有相同的长度 N 。这个函数的输出 b 直线的斜率和截距,最适合数据。我们执行适合通过最小化的垂直距离点的方块的线点斜式是由这个方程 [1] :
ϕ(m,b)=i=1N(y(i)-(mx(i)+b))2" style="vertical-align:-17px"> ϕ ( , b ) = = 1 N ( y ( ) - - - - - - ( x ( ) + b ) ) 2
的最小值 ϕ(m,b)" style="vertical-align:-5px"> ϕ ( , b ) 可以使用通常的技术找到求导的对吗 b 和设置这些为零。这样做给了我们以下2方程组:
mϕ(m,b)=0=i=1N-2(y(i)-(mx(i)+b))x(i)" style="vertical-align:-17px"> ϕ ( , b ) = 0 = = 1 N - - - - - - 2 ( y ( ) - - - - - - ( x ( ) + b ) ) x ( )
bϕ(m,b)=0=i=1N-2(y(i)-(mx(i)+b))1" style="vertical-align:-17px"> b ϕ ( , b ) = 0 = = 1 N - - - - - - 2 ( y ( ) - - - - - - ( x ( ) + b ) ) 1
在这里我们使用导数算子和通勤。两个方程两边除以2后,这个系统我们可以重新排列成一个矩阵方程
[i=1Nx(i)2i=1Nx(i)i=1Nx(i)N][mb]=[i=1Nx(i)y(i)i=1Ny(i)]." style="vertical-align:-45px"> ( = 1 N x ( ) 2 = 1 N x ( ) = 1 N x ( ) N ] ( b ] = ( = 1 N x ( ) y ( ) = 1 N y ( ) ]
这个系统可以在紧凑的形式写的
Hp=f." style="vertical-align:-5px"> H p = f
解出 $ p = [m b] ^台币 ,我们可以两边同时乘以的倒数 H
H-1Hp=H-1f," style="vertical-align:-5px"> H - - - - - - 1 H p = H - - - - - - 1 f ,
或者简单地
p=H-1f." style="vertical-align:-5px"> p = H - - - - - - 1 f
MATLAB代码来解决 b 是这样的:
函数[m b] = lineFitter (x, y)
%确定x和y有相同数量的元素
断言(元素个数(x) = =元素个数(y));
%的左手矩阵形式
H = [x (:) ' * x (:) (x(:), 1)总和;
总和(x(:), 1)元素个数(x)];
%的残余
f = [x (:) ' * y (:)
总和(y (:), 1)];
%解决系统
p = H \ f;
%分配山坡上
m =(1页);
b = p (2);
结束

测试在MATLAB拟合程序

检查我们的代码,让我们加载一些数据,符合线和情节。
d = readmatrix (“myData.csv”);
x = d (: 1);
:y = d (2);
%合适的数据
[m b] = lineFitter (x, y)
m = 4.0493
b = -0.0247
%创建线的拟合参数
xgrid = 0:0.1:1;
ygrid = m * xgrid + b;
%的阴谋的一切
图;clf
散射(x, y);
持有所有
情节(xgrid ygrid,“线宽”2);

拟合程序生成代码

现在我们可以生成代码,我们将需要创建一个动态库从我们 lineFitter 例行公事。我们将使用 coder.config coder.typeof
%设置编码器对象动态库
cfg = coder.config (“dll”);
cfg.Verbosity =“详细”;
cfg。GenCodeOnly = true;
%创建样本变量的输入。我们想让这些输入
%动态尺寸,因为我们可能有任意大小的数据文件。
xarg = coder.typeof(1.0,[1] 10000年,[1,0]);
yarg = coder.typeof(1.0,[1] 10000年,[1,0]);
%生成代码和报告
codegen配置cfg lineFitter。米- - - - - -args {xarg,yarg} -nargout 2 -report
# # #编译函数(s) lineFitter……- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -编译抑制:生成代码。- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # #生成编译报告……代码生成成功:查看报告
在MATLAB代码生成报告R2022b有一个整洁的特性称为“ 跟踪代码 “这显示了MATLAB代码对应于C代码:
我们以后需要的相关代码的接口 lineFitter 。的关键代码 lineFitter.h :
/ *函数声明* /
外面的空白lineFitter (const emxArray_real_T * x, const emxArray_real_T * y,
双* m,双* b);
输入是常量数组指针和输出指针双打。这将引导我们的客户端实现如下我们将展示。

包装代码

现在,我们有了自己的代码,我们可以使用 codebuild packNgo 生成和包构建工件,我们可以接管我们的客户机应用程序。在本例中,我们将使用 CMake SHARED_LIBRARY codebuild选项,这样我们就可以使用了 CMake程序 建立所有我们的客户端。CMake是一个工具,它允许我们执行平台独立的编译代码。简而言之,我们可以提供CMake的构建和它将执行所有的检查和编译。
codebuild (”。/ codegen / dll / lineFitter”,“BuildMethod”,“CMake”,“BuildVariant”,“SHARED_LIBRARY”);
packNGo (”。/ codegen / dll / lineFitter”,“PackType”,“分层”,“文件名”,“lineFitter”);
这生成一个存档文件 lineFitter.zip 对于我们的客户,我们可以复制代码库。

创建动态库

现在,我们有了自己的代码,我们可以构建它,创建一个程序链接到它在客户端机器上。之后,我们可以添加我们需要调用的代码线拟合程序在客户端代码。假设我们把新生成的 lineFitter.zip 这里并解压缩一切。解 lineFitter.zip 会产生两个文件, mlrFiles.zip sDirFiles.zip 。测定这些将创建两个目录R2022b codegen。
C: \ \工作lineFitExample > dir / w
codegen lineFitter。邮政mlrFiles。zip R2022b sDirFiles.zip
这些包含所需的MATLAB头和生成的代码,分别。建立这些,我们将创建一个名为build_lib的目录,然后使用以下命令调用cmake [2] (结果)所示:
C: \ \ lineFitExample > mkdir build_lib工作
C: \ \工作LineFitExample > cmake - g - b NMake makefile。/ build_lib -DCMAKE_BUILD_TYPE =释放-DMATLAB_ROOT =。/ R2022b s / codegen / dll / lineFitter
——C编译器识别MSVC 19.29.30137.0
<剪>
——构建文件写入:C: / / LineFitExample / build_lib工作
C: \ \ LineFitExample > cmake——构建build_lib工作
codegen \[8/8]链接CXX共享库dll \ lineFitter \ lineFitter_win64.dll
\ \ # # \ #创建库:C: /工作/ LineFitExample / build_lib codegen / dll / lineFitter / lineFitter_win64.dll

使用动态库

既然我们已经生成的动态库 lineFitter_win64.dll ,是时候创建应用程序将使用的代码 lineFitter 例行公事。我们的客户机应用程序读取csv文件并将列成两个名单:
使这段代码与新创建的动态库接口我们需要分配数组。这些类型的数组 emx_Array_real_T 如上所示。我们会写一个函数来进行分配,但首先我们将包括两个头文件,我们需要:
# include“lineFitter.h”
# include“lineFitter_emxAPI.h”
现在我们准备写数组分配函数,我们将上面的主例程。这个函数接受一个双打复制成一个列表 emxArray_real_T 被分配到适当的大小。这段代码的一个例子可以在目录中找到 。\ codegen \ dll \ lineFitter \ \ c例子
ArrayHelperFunc.png
最后,我们将添加调用分配向量和解决以下系统主程序的阅读代码,但在最后返回语句:
LineFitCode.png
我们的CMakeLists。我们的客户是这样的txt文件:
CMakeFile.png
现在我们准备编译我们的客户机应用程序。你可以在这里下载得到的文件: CMakeLists.txt myFit.cpp 。你还需要的数据文件,也就是在这里 myData.csv
上面的过程类似于编译库中,这是CMake的吸引力的一部分。的命令是:
C: \ \ LineFitExample > mkdir构建工作
C: \ \工作LineFitExample > cmake - g - b“NMake makefile构建- s。-DCMAKE_BUILD_TYPE =释放
——C编译器识别MSVC 19.29.30137.0
<剪>
——构建文件写入:C: /工作/ LineFitExample /构建
C: \ \ LineFitExample > cmake——构建构建工作
(2/2)连接CXX可执行myFit.exe
现在我们有可执行,myFit。exe在构建目录。最后一个步骤来测试我们的代码是:
C: \ \ LineFitExample >设置工作路径= C: \ LineFitExample \ build_lib \ \工作codegen \ dll \ lineFitter \; % %
C: \ \ LineFitExample >。\ \ myFit构建工作。exe myData.csv
米,b = 4.04926, -0.0246821
正如我们可以看到的,我们所得到的斜率和截距是一样的在MATLAB。

笔记

[1]此方法仅用于演示目的。在生产中,您应该使用 polyfit 来解决这个问题。
[2]在这个例子中,我们使用Visual Studio工具来编译代码。为命令行设置这个,我跑脚本:
C:\Program Files (x86)\Microsoft Visual Studio \ 2019 \ \专业VC \辅助\制造\ vcvars64.bat

现在轮到你了

我们希望你喜欢这个例子。很快我们将遵循一个更复杂的示例构建在此基础上。如果有其他程序员相关的话题你想看到博客,覆盖在下面的评论中让我们知道。
|

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。