matlab和C++混合编程(C++程序中用MATLAB的m文件,DLL方法)
具体的代码程序在文章末尾。具体的问题解答在文章末尾。
步骤一:
1,mex -setup设置编译器C++,这里我选择的是2013的版本(我的电脑上有10和13两个版本)。
2,mbuild -setup设置编译器C++
步骤二,编写自己的m文件,所有的m文件一定要放在一个文件夹中。
function [r,h]=You(a,b,flag)
if flag==0
r=Add(a,b); %子函数加
end
if flag~=0
r=Cheng(a,b); %子函数乘
end
h=3;
% r = a+b;
end
function r=Add(a,b)
r=a+b;
end
function r=Cheng(a,b)
r=a*b;
end
步骤三,进行编译,这里可能出现错误,参见下面的解决方法。
mcc -W cpplib:libYou -T link:lib You.m
步骤四:进行环境的配置。
1,
Step1:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”
Step2:在项目属性中的VC++目录下的包含目录添加“Matlab安装目录\extern\include;”
Step3:在项目属性中的VC++目录下的库目录添加“Matlab安装目录\extern\lib\win64\microsoft;”
2,
项目属性--链接器---输入----附加依赖项-中添加以下库名
libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib
libemlrt.lib
libeng.lib
libfixedpoint.lib
libcovrt.lib
步骤五:进行代码测试
将生成的.h,.dll,.lib文件加入测试程序,进行程序代码测试。
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "matrix.h"
#include "libYou.h"
using namespace std;
#pragma comment(lib,"libYou.lib") //静态的加入库文件,,,当然也可以在附件依赖项中直接添加
int main()
{
int jieguo=0;
if (!libYouInitialize()) //初始化 动态链接库,这一步是必须的
{
printf("Could not initialize addfunction!");
exit(0);
}
printf("OK!\n");
mwArray h(1, 1, mxDOUBLE_CLASS, mxREAL); //一行一列的矩阵
mwArray result(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray c(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray a(1, 1, mxDOUBLE_CLASS, mxREAL);
//一行一列的矩阵
mwArray b(1, 1, mxDOUBLE_CLASS, mxREAL);
//一行一列的矩阵
double data1 = 2; double data2 = 5; double flag = 0;
printf("%f\n", data1);
a.SetData(&data1, 1); //赋值
b.SetData(&data2, 1);
c.SetData(&flag, 1);
//赋值
//result.SetData(&data2, 1);
//赋值
You(2, result, h,a, b,c); //调用自己用matlab写的函数结果返回到result中
double d = result;
//获取结果
cout << "result="<<result << endl;
cout << "h="<<h << endl;
//printf("%f\n", d); //打印输出(这里是控制台程序)
//cout << d << endl;
libYouTerminate(); //使用完库,必须关掉
return 0;
}
具体的matlab和VS程序代码在这里。
https://download.****.net/download/yanxiaoyunsana/11105893
一些常见的问题解答在下一篇文章。
https://blog.****.net/yanxiaoyunsana/article/details/89202374