-
matlab 7.0及以上
-
2021-09-10 12:03:22
Matlab函数封装为DLL供Cpp调用
Ⅰ目标
- Matlab函数封装为DLL,供Cpp调用
- Matlab函数为类函数,matlab函数功能复杂
Ⅱ 学习
-
整体流程:
①**(整体学习)** 浅析将matlab函数编译成dll供Cpp调用的方法 http://blog.sina.com.cn/s/blog_9908653401012hz3.html
②**(主要参考)** VS2015调用Matlab编译生成的DLL 编译环境设置 [吐血整理] 来自 https://blog.csdn.net/weixin_41760829/article/details/79389685
-
Matlab类函数的实现
① Matlab类 函数
参考:[面向对象:MATLAB的自定义类 MATLAB]
② Matlab类函数,类method想对类的property值进行修改,需建立句柄类
Matlab 为传值函数
参考:句柄类和值类的比较 https://ww2.mathworks.cn/help/matlab/matlab_oop/comparing-handle-and-value-classes.html
-
C++ 调用Matlab DLL函数,接口调用方法(参数传递、返回值的写法)
Matlab mwArray学习
mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度) // set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值 mwA.SetData(&a, 1); // get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值 c = mwC.Get(1, 1); MyAdd(1, mwC, mwA, mwB); Ref: 涉及指针 mlxMyFunc(int nlhs, mxArray *plhs[], intnrhs, mxArray *prhs[]) https://blog.csdn.net/xinm1001/article/details/53574836 涉及输入值 https://blog.csdn.net/weixin_41760829/article/details/79389685
Ⅲ 实现
1. Matlab 函数封装为DLL
- 编好要使用的.m文件
- 在命令窗口中选中要使用的编译器,使用命令:mbuild -setup
- 在命令窗口中输入命令:deploytool
- 在弹窗中选择Library Compiler,然后会弹出如下窗口
参考:MATLAB中通过Library Compiler生成dll 来自 https://blog.csdn.net/bloke_come/article/details/77524776
2. vs2015中C++调用Matlab DLL步骤
-
添加include路径:C:\Program Files\MATLAB\R2016b\extern\include
添加lib路径:C:\Program Files\MATLAB\R2016b\extern\lib\win64\microsoft
添加附加lib:linker->input 追加 “项目-属性-配置属性-链接器-输入”
TestMat64.lib; libmx.lib; libmat.lib; mclmcr.lib;mclmcrrt.lib; 第1个是自己的M文件mcc生成的
-
将 .lib文件,放入当前/前一级文件夹
-
在头文件中添加生成的.h文件
-
关键代码:
#include "stdafx.h" #include "phyadaper_interface.h" #include "PhyAdapter.h" using namespace std; int main() { mclmcrInitialize(); if (!mclInitializeApplication(NULL, 0)) return 0; if (!phyadaper_interfaceInitialize( )) return 0; cout << "***** start phyadaper_initialize ..." << endl; mwArray moutput1(1,1,mxINT32_CLASS); phyadaper_initialize(1,moutput1); int output1 = moutput1.Get(1, 1); cout << output1 << endl; ... phyadaper_interfaceTerminate(); mclTerminateApplication(); return 0; }
参考:
VS2015调用Matlab编译生成的DLL 编译环境设置 [吐血整理] https://blog.csdn.net/weixin_41760829/article/details/79389685
Ⅳ 问题解决
-
⭐问题: matlab类函数,封装为DLL后,DLL中只剩下初始化函数,无法调用类的method。
解决:将类的method,分别用其他的函数封装,然后将多个接口函数,共同进行library compiler
-
问题: 报错:
Deployed applications must use a prototype file instead of a header file. To create the prototype, use the loadlibrary mfilename option. Use the prototype file in compiled code. See http://www.mathworks.com/help/compiler/matlab-library-loading.html for more information.
解决:
loadlibrary('HXWatchAdapter', 'HXWatchAdapter.h', 'mfilename', 'mHXWatchAdapter'); loadlibrary('HXWatchAdapter',@mHXWatchAdapter);
参考:https://ww2.mathworks.cn/help/compiler/matlab-library-loading.html
-
问题: 报错:
fatal error LNK1181: 无法打开输入文件 错误
解决:
无法找到相关.lib有关,可以将lib放入上一级目录
参考:
https://bbs.csdn.net/topics/350176906?list=13363673
-
问题: 报错:
Error using loaddefinedlibrary
解决:
可能因为没找到Matlab函数引用的DLL。可以在进行matlab函数封装为DLL时,即在调用library compiler时," Files required for your library to run",添加上所用的DLL文件
参考:
https://ww2.mathworks.cn/matlabcentral/answers/81645-error-using-matlab-loadlibrary-function
-
问题:报错:
帧不在模块中
参考:
VS2015调用Matlab编译生成的DLL 编译环境设置 [吐血整理] https://blog.csdn.net/weixin_41760829/article/details/79389685
Ⅴ 后续可能有用信息
-
(C#调用Matlab生成的DLL)
C#调用MATLAB生成的DLL以及多个m文件生成一个DLL https://blog.csdn.net/weixin_39559414/article/details/95059135
更多相关内容 -
matlab查看自带以及封装函数源代码
2019-02-05 22:24:42Matlab自带函数知道m文件名如何查看源代码: 方法一:输入doc加上名称:&gt;&gt;doc pcdownsample.m 方法二:用open命令:&gt;&gt;open pcdownsample.m 方法三:直接用type进行...Matlab自带函数知道m文件名如何查看源代码:
方法一:输入doc加上名称:
>>doc pcdenoise.m
方法二:用open命令:>>open pcdenoise.m
方法三:直接用type进行显示:>>type pcdenoise.m
-
【matlab】自定义、封装函数步骤
2017-02-10 10:22:24许多时候希望将特定的代码(算法)书写成函数的形式,提高代码的可封装性与重复性,简化代码设计,提高执行效率!下面简单介绍一下matlab中的函数定义与使用。 软件/版本 matlab 7.0及以上 方法/...matlab中如何定义函数-
- 许多时候希望将特定的代码(算法)书写成函数的形式,提高代码的可封装性与重复性,简化代码设计,提高执行效率!
- 下面简单介绍一下matlab中的函数定义与使用。
软件/版本
方法/步骤
首先建立M文件或直接点击(File/New/Function)建立函数文件,其中函数文件的格式是:
function [输出变量] = 函数名称(输入变量)
% 注释
% 函数体
如下所示,是编写的一个求1到n之和的求和函数 eg_sum,按照上述格式,编写代码如下并保存文件,注意文件命名时不能以数字开头:
function [s] = eg_sum( n )
% calculate the sum of 1..n
s = 0;
for i = 1:n
s = s + i;
end
许多网友说函数名一定要与函数文件名一致,【如果不一致matlab会警告】,但实际不影响使用,最好函数名与函数文件名 一致 ,参考网上有网友特意之处:“其实不是这样子的,只要知道调用函数时是通过函数文件名调用的这点即可!比如下图所示,即使文件名仍然是eg_sum,但我可以修改函数名为:my_sum 调用时用文件名调用就好,如下所示:”
>> b = eg_sum(10)
运行结果: b = 55
注意事项
-
在调用函数时,请确保已将matlab当前目录切换到函数文件所在处,不然会报错:Undefined function 'eg_sum' for input arguments of type 'double'.
-
-
MATLAB封装后importdata函数报错
2019-03-22 08:58:39利用MATLAB中的importdata函数读取Excel表时,运行源代码没有问题。将程序封装成exe后,该函数读取数据有问题 -
将函数封装成库使用的实现方法
2021-04-22 04:09:04常见的思路是将核心的函数封装成库,下面将结合例程说明具体实现方法。1.库的建立1)新建库工程在CCS中,选择Project-》NewCCSProject,在工程配置窗口中,选择相应的“Target”device,以及输入自定义的工程名字;...在项目开发过程中,开发者出于保护核心算法的目的,希望将部分核心代码封装起来,使得其他使用者无法查看具体的代码实现细节,而不影响正常的调用。常见的思路是将核心的函数封装成库,下面将结合例程说明具体实现方法。
1.库的建立
1)新建库工程
在CCS中,选择Project-》NewCCSProject,在工程配置窗口中,选择相应的“Target”device,以及输入自定义的工程名字;然后需要注意在“Projecttypeandtool-chain-》outputtype”中选择“StaticLibrary”,而不是“Executable”,“Executable”对应的是我们一般用到的可生成.out可执行文件的工程。
图1在CCS中新建库工程
2)定义相关的库函数
新建完工程后,即可将所需封装的函数放入工程文件中,在此以简单的一个功能函数为例进行说明。
图2.C文件中添加目标库函数
3)添加头文件.h
先在工程目录新建一个“include”文件夹,然后在该文件夹新建
图3新建.h文件
在.h文件中进行库函数的函数声明。
图4函数名声明
至此,编译该工程,即可生成所需的.lib文件,在默认的Debug文件路径中。
图5编译生成对应的.lib文件
2.在工程项目中使用该库文件
以C2000WARE中的“led_ex1_blink”例程为例,说明下如何在实际工程中使用定义的库文件。
1)建立文件链接
首先将第一步生成的.lib文件以及.h文件所在文件夹一并拷贝至目标工程,由于具体的库函数代码实现体现在.c文件,因此最终的工程无法索引至原始的.c文件。
图6复制相应的.h和.lib文件
下一步需要在该工程中建立对库文件的链接关系。首先在工程属性C2000Compiler-》IncludeOption中添加.h文件所在的文件路径,注意此处使用的是相对路径,以确保工程路径发生变更时的一致性。
图7添加.h所在的文件路径
然后,在C2000Linker-》FileSearchPath中分别添加对应的.lib文件名以及所在文件路径。
图8添加.lib文件名及路径
2)添加函数头文件及调用
在目标工程中添加.h文件的声明,以及测试变量,并在主函数中进行调用。
图9.h文件声明以及调用示例
烧录该工程到芯片,运行后验证“test”结果符合预期。
此外,除了上述方法,可以采用以下方式把工程的调试功能禁止,这样在debug模式下就无法进行任何的调试操作以及查看代码,具体步骤:
选择“option--symdebug:none”,即在工程属性Build-》C2000Complier-》AdvancedOptions-》AdvancedDebugOptions中选择--symdebug:none作为Debuggingmodel。
图10使能option--symdebug:none
选择一个例程,进行以上配置后,在调试模式下的效果如图11所示。在该模式下,所有symbols和工程的链接将被移除,因此无法进行任何的调试操作以及查看源代码。建议在工程开发的最后阶段再使用该模式。
图11工程示例
责任编辑人:CC
-
matlab自带函数缺失问题的解决
2019-05-26 23:45:38最近需要使用matlab自带的Heatmap函数进行绘图,结果将在实验室电脑可以运行的代码放到电脑上时显示找不到heatmap函数,查阅matlab帮助之后发现heatmap函数在2017a之后的版本才有,而自己是装的2016a。鉴于重装一次... -
Python2.Python与matlab自定义函数(封装)
2021-12-07 15:48:03函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 1、Python: 参考Python3 函数 | 菜鸟教程 1.1函数定义: ... -
Kalman滤波封装Matlab函数
2021-11-02 09:21:26本人最近需要写多个仿真,需要大量用到本地标准Kalman滤波,于是干脆将Kalman滤波的算法封装为函数,后续使用直接进行调用即可。 注意:封装的函数仅仅是单一时刻的计算,调用需要在循环体内进行。 函数代码 %... -
求赐教:matlab函数文件 输入输出形参都为空怎么理解啊?
2020-10-12 18:10:17function []=plot_time_space() %% 时空图绘制 load('NaSch_date.mat'); for time=1:1:1000 tool = memory(time,:);%提取每个时空步速度数据 tool(tool>=0)=time;%有速度的车打点 tool(isnan(tool))=-...end -
matlab函数打包规范
2021-04-18 09:54:341 变量声明与参数传递1)接口文件的输入输出参数,应该尽量避免cell或者table等c语言中不能转换或者没有对应的变量类型。2)在m文件中,变量的类型与占用空间需要在使用前开辟...5)对于主函数与子函数的参数传递,应该... -
Visual c 中MATLAB数学函数库的封装.pdf
2021-11-01 08:00:11Visual c 中MATLAB数学函数库的封装.pdf -
在MATLAB中调用封装好的C++函数的方法
2015-09-07 16:04:28MATLAB有强大的矩阵运算能力以及丰富的函数库,可以用于算法的仿真以及快速验证某些算法思路。MATLAB的UI层是利用基于JVM利用Java实现的,而部分算法的底层则是封装了C/C++以及Intel提供的汇编指令集。因此MATLAB在... -
MATLAB中只能处理非矩阵参数的函数如何传入矩阵
2021-03-05 10:33:11在MATLAB编程中可能会遇到这种问题,一个函数由于其中含有判断语句,只能传入一个非矩阵参数,如果传入矩阵参数可能会影响后面的判断,下面是一种解决方案。 -
MATLAB --函数编写与调用
2020-08-02 11:43:24即将程序封装成函数,再调用,就比较清晰。 1、函数编写 语法: function [输出参数列表] = 函数名(输入参数列表) (注:此语句结尾没有分号) 注释部分 函数体 如: 将整个函数编写完后,接下来就保存.m... -
MATLAB 封装发布exe
2016-12-06 11:42:15从2016a开始到现在的2017,从MATLAB中创建出一个独立的应用程序有多种方法,可以用MATLAB提供的现有函数或者现有App。 本文介绍的是利用MATLAB的Application Compiler工具创建一个独立的应用程序,以下这个例子显示... -
Lapack 和 Blas 函数的 Matlab 接口:包装所有 Lapack 和 BLAS 例程的 Matlab mex 函数-matlab开发
2021-05-31 03:02:05CallLapack 是一个 Matlab mex 函数,它封装了 Lapack 和 Blas 函数。 CallLapack 包装来自 CLAPACK 2.0 版发行版的所有功能,但很少有例外(Matlab lib 文件不导出带有的文件)。 该发行版还包含用于为接受原始数据... -
matlab 符号函数 syms
2021-12-09 20:36:56本文只提到syms相关的函数功能,不介绍函数具体用法。所有用法都可以参考官方文档。 -
34种降维方法MATLAB封装库函数
2014-12-16 10:29:19这个压缩文件包含了34种现在流行的数据集降维方法,主要用于机器学习的研究。这些方法封装在了一起,可以方便地调用。 -
matlabsin函数源码-JavaPlot:像Matlab实现的Java一样的图
2021-05-19 20:14:29所有的绘图api均封装在Plot类下,使用和Matlab类似的函数名称。 figrue() 创建一个绘图面板 hold_on() 开启绘图保持,用于将多个绘图对象绘制到同一个面板上 hold_off() 关闭绘图保持 plot() 绘图 axis() 设置显示... -
如何把matlab代码封装-language:分布式系统设计的编程语言(27-5-2020)
2021-05-24 02:24:47如何把matlab代码封装风筝 所有年龄段的编程语言。 概念 代码和数据之间没有区别。 不要重复自己。 关注点分离。 实例化。 执行顺序。 我梦想成为最好的编程语言的开发者。 样本 “评论”一些东西“单行注释”一些... -
Matlab封装独立于matlab的可执行文件exe
2021-04-18 06:53:34安装编译器有多种选择,matlab自带LCC,推荐使用VC++6.0键入:mex-setup %有空格或mbuild -setup %有空格若出现如下提示,建议重新安装:错误使用 mex/mbuild,未找到支持的编译器。您可以安装免费提供的 MinGW-w64 C... -
MATLAB时频域特征提取已封装为函数
2022-05-01 12:26:50MATLAB时频域特征提取已封装为函数,可实现一行代码提取时域频域特征。亲测好用! 可以直接生成原始信号的特征向量。包括22个特征。 -
Simple Linear Classification and Receiver Operating Characteristic Plotting:matlab 函数的封装,提供...
2021-05-30 05:01:43以 demo.m 为例 -
MATLAB的函数参数
2021-04-24 01:13:08本节介绍一下 MATLAB 的函数参数。具体的操作步骤如下:确定函数参数数量当调用一个函数时,所用的输入变量和输出变量的数量,在函数内是确定的。nargin 函数确定输入变量个数,nargout 函数确定输出变量个数。示例1... -
matlab模块封装
2021-04-20 01:23:10MATLAB8Simulink子系统的创建及应用.ppt_数学_自然科学_专业资料。第7章 Simulink子系统的创建及应用 7.1创建子系统 7.1.1通过已有的模块建立子系统 7.1.2......图7-2 封装子系统后的模型图 7.1.2通过Subsystem模块... -
matlab 输出函数内的所有变量,MATLAB Simulink的常用函数,命令及变量
2021-04-21 16:10:56slhelp simulink的用户向导或者模块帮助 封装命令 hasmask 检查已有模块是否封装 hasmaskdlg 检查已有模块是否有封装的对话框 hasmaskicon 检查已有模块是否有封装的图标 iconedit 使用ginput函数来设计模块图标 ... -
如何把matlab代码封装-r-novice-inflammation:新生炎症
2021-05-24 02:25:22如何把matlab代码封装 新生炎症 向全球研究人员教授基础编码和数据科学技能。 该GitHub存储库生成了Software Carpentry课程网站“使用炎症数据的非程序员R简介”。 这 。 在此GitHub存储库中进行更改,使我们可以... -
封装基础知识 - MATLAB & Simulink - MathWorks 中国
2021-04-18 09:36:51封装基础知识封装是一种自定义模块界面,它可隐藏模块内容,使用它自己的图标和参数对话框将内容以原子块的形式显示。它可以封装模块逻辑,提供对模块数据的受控访问,并简化模型的图形外观。当您封装模块时,将创建... -
matlab求系统函数特征根代码-EAD_Numerical_Simulations:EAD_Numerical_Simulations
2021-06-04 11:58:22我对原始代码的界面进行了大量修改,将其中的很多内容封装到函数中。 这样做主要是为了能够将求解器包含在一个单独的命名空间中,因此允许我创建一个可以在 for 循环中模拟很多情况的单个脚本。 最有用的功能: 函数...