1.matlab封装matlab函数

(1)方法一

1、输入 mex -setup 回车,然后点击选择 mex -setup C++;

2、输入 mbuild -setup 回车,然后点击选择 mex -setup C++ -client MBUILD;

3、输入 mcc -W cpplib:addtest -T link:lib myadd.m -C;(addtest为封装好的dll名称,myadd为要封装的m文件)

(2)方法二

1、matlab  ->  APP  ->  library compiler

2、选择“c++ shared library”,点击“+”加入相应文件

3、点击package(生成addtest.ctf、addtest.dll、addtest.lib、addtest.h等文件)


2.vs调用设置

1、将xxx.lib,xxx.h,xxx.dll,xxx.ctf 文件放入.\project1\project1 文件夹中

2、将xxx.lib,xxx.dll,xxx.ctf 文件放入.\project1\x64\Debug 文件夹中

3、打开VS,将xxx.h导入头文件夹中,将xxx.lib,xxx.dll,xxx.ctf导入资源文件夹中

4、右击项目名称 -> 属性

1)配置属性 -> VC++目录,在包含目录中加入

matlab头文件夹,一般为..\extern\include(根据情况修改)

xxx.h所处文件夹,为.\project1\project1(根据情况修改)

2)配置属性 -> VC++目录,在库目录中加入

matlab  lib文件夹,一般为..\extern\lib\win64\microsoft(根据情况修改)

xxx.lib所处文件夹,为 .\project1\x64\Debug(根据情况修改)

3)配置属性 -> 链接器 -> 输入,在附加依赖项中加入

mclmcrrt.lib、mclmcr.lib、libmat.lib、libmx.lib、libmex.lib、libeng.lib、xxx.lib

5、点击调试 -> 窗口 -> 异常设置,取消勾选Win32 Exceptions(空为取消)

:matlab的环境变量需要自己设置:   .\Matlab2020a\bin\win64(根据情况修改)


3.代码调用

1、引入头文件

#include "xxx.h"
#pragma comment(lib, "xxx.lib")
//将xxx修改为自己的.h,.lib名

2、初始化

if ((!mclInitializeApplication(NULL, 0)) || (!MyAddInitialize()))
{cout << "Could not initialize the application"<<endl;//初始化失败
}
else
{cout << "Initializing Success!!!" << endl;//初始化成功
}

:“MyAddInitialize” 中的“ MyAdd ” 需要改为自己dll的名称

3、定义mArray

mwArray a(1, 1, mxDOUBLE_CLASS); //函数参数类型为mwArray, 大小为1*1,数据类型为double
mwArray b(1, 1, mxDOUBLE_CLASS); //函数参数类型为mwArray, 大小为1*1,数据类型为double
mwArray c(2, 4, mxDOUBLE_CLASS); //函数参数类型为mwArray, 大小为2*4,数据类型为double

4.初始化mArray

1)初始化方法一

a(1, 1) = 1.8; //初始化参数

2)初始化方法二

double aa = 1.0;
a.SetData(&aa, 1);//a中有几个数就为几

3)初始化方法三

//想传递矩阵的方法
double cc[8] = { 1,2,3,4,5,6,7,8 };
c.SetData(cc, 8);//初始化参数//传入后的矩阵为
//  1  3  5  7
//  2  4  6  8
//竖着传递

:其他mArray传递参数方法:将c++的变量赋值给matlab的mwArray数据类型

5、调用matlab函数

1)方法一(直接调用)

//直接调用
kk(1, z, a, b);
//参数分别为(返回值个数、接收返回值的mArray、输入变量mArray数组1、输入变量mArray数组2)
//kk为matlab中的函数名

2)方法二(显示调用)

//显示调用//先在主函数前声明
typedef void(*testFunc)(int nargout, mwArray& u,const mwArray& f1,const mwArray& f2);/***********************************************************************************///再在函数内调用
HINSTANCE hDll = LoadLibrary(L"xxx.dll");//xxx改为之前生成的dll名称
testFunc kk= (testFunc)GetProcAddress(hDll, "zzzzzzzz");//根据自己的修改
if (!kk)
{cout << "Error" << endl;
}
kk(1, c, a, b);

:上述代码中的“zzzzzzzz”,需要自己查找修改

[1] 先查看dll中包含的函数名,查看方法:用VS附带工具来查看dll文件包含的函数

[2] 将其中的matlab中的函数名修改后的函数名找出,替换上述代码的“zzzzzzzz”

(如上图,将   “zzzzzzzz”   替换为     ”_Z5MyAddiR7mwArrayRKS_S2_”)

我matlab中的函数名为MyAdd,不知道为什么matlab中的函数名打包成dll后会变成这样,但修改后可以使用。

:函数前声明的输入参量也要修改

6、获取函数返回值

double z = c.Get(1, 1);

7、结束

MyAddTerminate();
mclTerminateApplication();
FreeLibrary(hDll);
system("pause");

:“MyAddTerminate” 中的“ MyAdd ” 需要改为自己dll的名称


4.完整代码

#include "MyAdd.h"
#pragma comment(lib, "MyAdd.lib")
#include <iostream>
using namespace std;typedef void(*testFunc)(int nargout, mwArray& aa, const mwArray& Flag1, const mwArray& Flag2);int main()
{if ((!mclInitializeApplication(NULL, 0)) || (!MyAddInitialize())){cout << "Could not initialize the application" << endl;//初始化失败}else{cout << "Initializing Success!!!" << endl;//初始化成功}mwArray a(1, 1, mxDOUBLE_CLASS); //函数参数类型为mwArray, 大小为1*1,数据类型为doublemwArray b(1, 1, mxDOUBLE_CLASS);mwArray c(1, 1, mxDOUBLE_CLASS);a(1, 1) = 2.9;//初始化方法一double bb = 0.1;b.SetData(&bb, 1);//初始化方法二//显示调用HINSTANCE hDll = LoadLibrary(L"MyAdd.dll");testFunc kk = (testFunc)GetProcAddress(hDll, "_Z5MyAddiR7mwArrayRKS_S2_");if (!kk){cout << "Error" << endl;}kk(1, c, a, b);//获取结果double z = c.Get(1, 1);cout << a << "+" << b << "=" << z << endl;//结束MyAddTerminate();mclTerminateApplication();FreeLibrary(hDll);system("pause");return 0;
}

参考博客:C++中调用matlab的dll文件(解决初始化失败的问题)_zy_ky的博客-CSDN博客

该博客意在记笔记,纯属为了以后使用方便!!! ​​​​​​​

(VS)c++调用matlab函数相关推荐

  1. C/C++ VS中调用matlab函数的方法

    C/C++ VS中调用matlab函数的方法 [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/73743654 Matla ...

  2. c 调用matlab文件路径,C/C++下调用matlab函数操作说明

    1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...

  3. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何"csharp通过dll调用opencv函数,图片作为参数 ...

  4. 一文读懂如何用python调用matlab函数(windows环境)

    第一步配置环境: 要安装引擎 API,请在操作系统提示符下执行以下命令,其中 matlabroot 是 MATLAB 文件夹的路径.您可能需要管理员权限才能执行这些命令.或者,使用在非默认位置安装用于 ...

  5. 超详细基于Qt平台实现C/C++调用Matlab函数全流程

    超详细基于Qt平台实现C/C++调用Matlab函数全流程 1. 基本调用方式介绍 2. 环境配置 3. 将Matlab程序写成函数形式 4. Matlab配置C编译器,将.m文件转换成动态链接库 4 ...

  6. c# 调matlab传字符串_c#调用matlab函数(混合编程)

    第 2 部分 实战练习(自己做的) 2.1 c# 调用 matlab 函数 matlab 版本 2009b , c# 版本 vs2008. 2.1.1 matlab 函数编译成 dll 文件 ( 1 ...

  7. vc只能调用matlab子函数,VC调用matlab函数

    最近在学习matlab,先试一个VC调用matlab函数的简单例子 用的是VC++6.0,matlab7.8也就是matlabR2009 首先在matlab下设置环境 >> mbuild ...

  8. C++ MATLAB 混合编程——VS项目调用MATLAB函数

    引言 MATLAB无疑是一款强大的矩阵运算与数据分析软件,内部集成了众多函数.如果在C++编程时可以调用相关的函数将对我们的数据分析研究带来极大的方便.这里就总结一下如何在VS工程中调用MATLAB函 ...

  9. 关于python文件中调用matlab函数的打包问题

    1.首先说明python如何调用matlab函数的? 这里我参考的是这篇文章:(3条消息) pythonGUI调用matlab并打包成可执行文件的解决方法_白金之星1717的博客-CSDN博客_pyt ...

最新文章

  1. 华为harmonyos和ios,华为EMUI正式更名为HarmonyOS,看来华为真的是孤注一掷了
  2. 服务器中的地震仪,MOM2005+SP1部署指南(MOM2005系列之一)
  3. View scrolly 正负问题
  4. android so readelf.exe,android ndk中的工具使用
  5. Amazon EC2 AMI实现X11 forwarding【从MobaXterm打开浏览器和图形界面】
  6. 怎么配置网站mysql数据库_本地DZ网站如何配置本地MYSQL数据库
  7. 游戏开发者需要注意的4个内存使用问题
  8. 用Python实现归并排序
  9. 【转】宏定义中#和##的使用
  10. php实现mysql分表
  11. vue部分样式无法修改
  12. bzoj4006 [JLOI2015]管道连接
  13. Windows自带md5校验工具使用说明
  14. 简单说下H5+打包apk
  15. Android的5样的调试信息
  16. 华为ne20路由器登陆密码_很好的文章,主要是关于密码学和NE的基础知识
  17. 【破解】PyCharm2018专业版激活(激活到2100年)
  18. 图解Linux网络包接收过程
  19. 堂食扫码点餐的小程序设计开发
  20. 手把手教你安装虚拟机16

热门文章

  1. 如何对某一个文件夹下的所有文件快速重命名
  2. 外国官方网站下载文件速度缓慢
  3. 你知道哪些出身最奇特的程序员?
  4. input框如何设置框禁止输入
  5. 局部路径规划算法-DWA动态窗口法
  6. linux下rsync启动命令,linux下rsync命令详细整理
  7. php route,FastRoute
  8. vue 设置滚动条的位置
  9. “求答案?一筐鸡蛋:几个几个拿”的Python解答
  10. VMware虚拟机安装Linux教程