精华内容
下载资源
问答
  • 2021-09-10 12:03:22

    Matlab函数封装为DLL供Cpp调用

    Ⅰ目标

    1. Matlab函数封装为DLL,供Cpp调用
    2. Matlab函数为类函数,matlab函数功能复杂

    Ⅱ 学习

    1. 整体流程:

      ①**(整体学习)** 浅析将matlab函数编译成dll供Cpp调用的方法 http://blog.sina.com.cn/s/blog_9908653401012hz3.html

      ②**(主要参考)** VS2015调用Matlab编译生成的DLL 编译环境设置 [吐血整理] 来自 https://blog.csdn.net/weixin_41760829/article/details/79389685

    2. Matlab类函数的实现

      ① Matlab类 函数

      参考:[面向对象:MATLAB的自定义类 MATLAB]

      ② Matlab类函数,类method想对类的property值进行修改,需建立句柄类

      Matlab 为传值函数

      参考:句柄类和值类的比较 https://ww2.mathworks.cn/help/matlab/matlab_oop/comparing-handle-and-value-classes.html

    3. 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
    1. 编好要使用的.m文件
    2. 在命令窗口中选中要使用的编译器,使用命令:mbuild -setup
    3. 在命令窗口中输入命令:deploytool
    4. 在弹窗中选择Library Compiler,然后会弹出如下窗口

    参考:MATLAB中通过Library Compiler生成dll 来自 https://blog.csdn.net/bloke_come/article/details/77524776

    2. vs2015中C++调用Matlab DLL步骤
    1. 添加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生成的

    2. 将 .lib文件,放入当前/前一级文件夹

    3. 在头文件中添加生成的.h文件

    4. 关键代码:

    
       #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

    Ⅳ 问题解决

    1. ⭐问题: matlab类函数,封装为DLL后,DLL中只剩下初始化函数,无法调用类的method。

      解决:将类的method,分别用其他的函数封装,然后将多个接口函数,共同进行library compiler

    2. 问题: 报错:

      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

    3. 问题: 报错:

      fatal error LNK1181: 无法打开输入文件 错误
      

      解决:

      无法找到相关.lib有关,可以将lib放入上一级目录

      参考:

      https://bbs.csdn.net/topics/350176906?list=13363673

    4. 问题: 报错:

      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

    5. 问题:报错:

      帧不在模块中
      

      参考:

      VS2015调用Matlab编译生成的DLL 编译环境设置 [吐血整理] https://blog.csdn.net/weixin_41760829/article/details/79389685

    Ⅴ 后续可能有用信息

    1. (C#调用Matlab生成的DLL)

      C#调用MATLAB生成的DLL以及多个m文件生成一个DLL https://blog.csdn.net/weixin_39559414/article/details/95059135

    更多相关内容
  • matlab查看自带以及封装函数源代码

    千次阅读 2019-02-05 22:24:42
    Matlab自带函数知道m文件名如何查看源代码: 方法一:输入doc加上名称:&amp;gt;&amp;gt;doc pcdownsample.m 方法二:用open命令:&amp;gt;&amp;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中的函数定义与使用。

    软件/版本

    • matlab 7.0及以上

    方法/步骤

    1

    首先建立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中如何定义函数














    回到控制台Command Window(主界面),注意要使用之前保存的函数文件名来调用函数,如下所示:

    >> clear

    >> a = eg_sum(10)

    运行结果: a = 55

    matlab中如何定义函数









    许多网友说函数名一定要与函数文件名一致,【如果不一致matlab会警告】,但实际不影响使用,最好函数名与函数文件名 一致 ,参考网上有网友特意之处:“其实不是这样子的,只要知道调用函数时是通过函数文件名调用的这点即可!比如下图所示,即使文件名仍然是eg_sum,但我可以修改函数名为:my_sum 调用时用文件名调用就好,如下所示:

    >> b = eg_sum(10)

    运行结果: b = 55

    matlab中如何定义函数















    注意事项

    • 在调用函数时,请确保已将matlab当前目录切换到函数文件所在处,不然会报错:Undefined function 'eg_sum' for input arguments of type 'double'.


    展开全文
  • 利用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可执行文件的工程。

    286a5995d6f0144b67b0cfc297d1da42.png

    图1在CCS中新建库工程

    2)定义相关的库函数

    新建完工程后,即可将所需封装的函数放入工程文件中,在此以简单的一个功能函数为例进行说明。

    7d725dadc00c17595f50f859f11ee5c8.png

    图2.C文件中添加目标库函数

    3)添加头文件.h

    先在工程目录新建一个“include”文件夹,然后在该文件夹新建

    4d6e5b0cb8c0eb6c793de53e6f6c2661.png

    ce91fba059a6ed8360b29e2f57204c46.png

    图3新建.h文件

    在.h文件中进行库函数的函数声明。

    cb6a7598aca7486b4d8f9e19cf65f81a.png

    图4函数名声明

    至此,编译该工程,即可生成所需的.lib文件,在默认的Debug文件路径中。

    747723f9bbcd05e5f072ff1cb6fa6815.png

    图5编译生成对应的.lib文件

    2.在工程项目中使用该库文件

    以C2000WARE中的“led_ex1_blink”例程为例,说明下如何在实际工程中使用定义的库文件。

    1)建立文件链接

    首先将第一步生成的.lib文件以及.h文件所在文件夹一并拷贝至目标工程,由于具体的库函数代码实现体现在.c文件,因此最终的工程无法索引至原始的.c文件。

    b1c3a4d298c904af751f3be5c569af09.png

    图6复制相应的.h和.lib文件

    下一步需要在该工程中建立对库文件的链接关系。首先在工程属性C2000Compiler-》IncludeOption中添加.h文件所在的文件路径,注意此处使用的是相对路径,以确保工程路径发生变更时的一致性。

    60224cdbeca84a8b60c8292a512c5bc3.png

    图7添加.h所在的文件路径

    然后,在C2000Linker-》FileSearchPath中分别添加对应的.lib文件名以及所在文件路径。

    49ca405c89f68a1c66b6c2f3e0d80111.png

    图8添加.lib文件名及路径

    2)添加函数头文件及调用

    在目标工程中添加.h文件的声明,以及测试变量,并在主函数中进行调用。

    2866dab848b0f6a6c66fe7c60f7c5c5e.png

    e02c13dddf77fbddda6147384466b560.png

    图9.h文件声明以及调用示例

    烧录该工程到芯片,运行后验证“test”结果符合预期。

    此外,除了上述方法,可以采用以下方式把工程的调试功能禁止,这样在debug模式下就无法进行任何的调试操作以及查看代码,具体步骤:

    选择“option--symdebug:none”,即在工程属性Build-》C2000Complier-》AdvancedOptions-》AdvancedDebugOptions中选择--symdebug:none作为Debuggingmodel。

    5a6cb3616cb400805380ed866bedcd85.png

    图10使能option--symdebug:none

    选择一个例程,进行以上配置后,在调试模式下的效果如图11所示。在该模式下,所有symbols和工程的链接将被移除,因此无法进行任何的调试操作以及查看源代码。建议在工程开发的最后阶段再使用该模式。

    b3328358ac79d8ae39c0ee7862805c5c.png

    图11工程示例

    责任编辑人:CC

    展开全文
  • matlab自带函数缺失问题的解决

    千次阅读 2019-05-26 23:45:38
    最近需要使用matlab自带的Heatmap函数进行绘图,结果将在实验室电脑可以运行的代码放到电脑上时显示找不到heatmap函数,查阅matlab帮助之后发现heatmap函数在2017a之后的版本才有,而自己是装的2016a。鉴于重装一次...
  • 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 1、Python: 参考Python3 函数 | 菜鸟教程 1.1函数定义: ...
  • 本人最近需要写多个仿真,需要大量用到本地标准Kalman滤波,于是干脆将Kalman滤波的算法封装函数,后续使用直接进行调用即可。 注意:封装函数仅仅是单一时刻的计算,调用需要在循环体内进行。 函数代码 %...
  • function []=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:34
    1 变量声明与参数传递1)接口文件的输入输出参数,应该尽量避免cell或者table等c语言中不能转换或者没有对应的变量类型。2)在m文件中,变量的类型与占用空间需要在使用前开辟...5)对于主函数与子函数的参数传递,应该...
  • Visual c 中MATLAB数学函数库的封装.pdf
  • MATLAB有强大的矩阵运算能力以及丰富的函数库,可以用于算法的仿真以及快速验证某些算法思路。MATLAB的UI层是利用基于JVM利用Java实现的,而部分算法的底层则是封装了C/C++以及Intel提供的汇编指令集。因此MATLAB在...
  • 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工具创建一个独立的应用程序,以下这个例子显示...
  • CallLapack 是一个 Matlab mex 函数,它封装了 Lapack 和 Blas 函数。 CallLapack 包装来自 CLAPACK 2.0 版发行版的所有功能,但很少有例外(Matlab lib 文件不导出带有的文件)。 该发行版还包含用于为接受原始数据...
  • matlab 符号函数 syms

    万次阅读 2021-12-09 20:36:56
    本文只提到syms相关的函数功能,不介绍函数具体用法。所有用法都可以参考官方文档。
  • 这个压缩文件包含了34种现在流行的数据集降维方法,主要用于机器学习的研究。这些方法封装在了一起,可以方便地调用。
  • 所有的绘图api均封装在Plot类下,使用和Matlab类似的函数名称。 figrue() 创建一个绘图面板 hold_on() 开启绘图保持,用于将多个绘图对象绘制到同一个面板上 hold_off() 关闭绘图保持 plot() 绘图 axis() 设置显示...
  • 如何把matlab代码封装风筝 所有年龄段的编程语言。 概念 代码和数据之间没有区别。 不要重复自己。 关注点分离。 实例化。 执行顺序。 我梦想成为最好的编程语言的开发者。 样本 “评论”一些东西“单行注释”一些...
  • 安装编译器有多种选择,matlab自带LCC,推荐使用VC++6.0键入:mex-setup %有空格或mbuild -setup %有空格若出现如下提示,建议重新安装:错误使用 mex/mbuild,未找到支持的编译器。您可以安装免费提供的 MinGW-w64 C...
  • MATLAB时频域特征提取已封装函数,可实现一行代码提取时域频域特征。亲测好用! 可以直接生成原始信号的特征向量。包括22个特征。
  • 以 demo.m 为例
  • MATLAB函数参数

    2021-04-24 01:13:08
    本节介绍一下 MATLAB函数参数。具体的操作步骤如下:确定函数参数数量当调用一个函数时,所用的输入变量和输出变量的数量,在函数内是确定的。nargin 函数确定输入变量个数,nargout 函数确定输出变量个数。示例1...
  • matlab模块封装

    2021-04-20 01:23:10
    MATLAB8Simulink子系统的创建及应用.ppt_数学_自然科学_专业资料。第7章 Simulink子系统的创建及应用 7.1创建子系统 7.1.1通过已有的模块建立子系统 7.1.2......图7-2 封装子系统后的模型图 7.1.2通过Subsystem模块...
  • slhelp simulink的用户向导或者模块帮助 封装命令 hasmask 检查已有模块是否封装 hasmaskdlg 检查已有模块是否有封装的对话框 hasmaskicon 检查已有模块是否有封装的图标 iconedit 使用ginput函数来设计模块图标 ...
  • 如何把matlab代码封装 新生炎症 向全球研究人员教授基础编码和数据科学技能。 该GitHub存储库生成了Software Carpentry课程网站“使用炎症数据的非程序员R简介”。 这 。 在此GitHub存储库中进行更改,使我们可以...
  • 封装基础知识封装是一种自定义模块界面,它可隐藏模块内容,使用它自己的图标和参数对话框将内容以原子块的形式显示。它可以封装模块逻辑,提供对模块数据的受控访问,并简化模型的图形外观。当您封装模块时,将创建...
  • 我对原始代码的界面进行了大量修改,将其中的很多内容封装函数中。 这样做主要是为了能够将求解器包含在一个单独的命名空间中,因此允许我创建一个可以在 for 循环中模拟很多情况的单个脚本。 最有用的功能: 函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,930
精华内容 3,972
关键字:

matlab封装函数

matlab 订阅