-
编译环境设置
配置系统环境变量
在Windows环境变量中的系统变量中“Path”中新增下:
D:\matlab\bin\win64;
环境变量配置完成后要重启
matlab配置
在Matlab的command window输入:mex -setup C++
然后在输入mbuild -setup
选择mex -setup C++ -client MBUILD
-
混合编程实现
1)在matlab中创建MATLAB函数,编写matrix_add.m文件
function matrix=matrix_add(A,B)
[m1,n1]=size(A);
[m2,n2]=size(B);
if(m1~=m2||n1~=n2)
disp('matrix dimensions must agree');
return;
else
matrix=A+B;
end
2)然后在matlab命令窗口执行编译命令 ,将matrix_add.m编译成C++动态链接库文件。
mcc -W cpplib:libmatrixadd -T link:lib matrix_add.m
其中libmatrixadd是需要生成的各种文件的名称,matrix_add.m是matlab函数,生成动态链接库dll,编译完成后,matlab生成一些文件,其中
libmatrixadd.cpp libmatrixadd.dll libmatrixadd.lib libmatrixadd.h 是我们需要用到
3)在vs2013中新建解决方案,添加源文件,此部分步骤略去,同样要配置属性表
首先在配置属性表之前可以把2)中生成的libmatrixadd.h文件添加到D:\matlab\extern\include
把2)中生成的libmatrixadd.lib压缩文件添加到D:\matlab\extern\lib\win64\microsoft
把2)中生成的libmatrixadd.dll文件添加到D:\matlab\bin\win64
然后开始配置属性表
类似于其他C++库的配置,如:添加包含目录和库路径。添加库目录(自己的MATLAB安装路径中查找):D:\matlab\extern
添加库路径(自己的MATLAB安装路径中查找):D:\matlab\extern\lib\win64\microsoft
配置结束
开始测试
//利用matlab函数matrix_add所生成的动态链接库实现在VS中的矩阵相加
//m1和m2为相加的两个矩阵,sum为两矩阵的和
#include "libmatrixadd.h"
#include<iostream>
using namespace std;
void main()
{
//初始化MCR
if (!mclInitializeApplication(NULL, 0))
{
cout << "fail to initialize the application" << endl;
exit(1);
}
//初始化matrixadd
if (!libmatrixaddInitialize())
{
cout << "fail to initialize libmatrixadd" << endl;
exit(1);
}
//定义矩阵
mwArray M1(2, 2, mxDOUBLE_CLASS);
mwArray M2(2, 2, mxDOUBLE_CLASS);
mwArray SUM(2, 2, mxDOUBLE_CLASS);
//给矩阵M1赋值
double *M1_Data;
M1_Data = new double[4];
int i, j;
for (i = 0; i < 4; i++)
{
M1_Data[i] = 1.0*i;
}
M1.SetData(M1_Data, 4);
//给矩阵M2赋值
for (i = 1; i < 3; i++)
{
for (j = 1; j < 3; j++)
M2(i, j) = i + j;
}
//定义调用matrix_add时输出参数的个数
short int nargout = 1;
//调用matrix_add函数
matrix_add(nargout, SUM, M1, M2);
//给输出分配内存空间
double *SUM_Data;
SUM_Data = new double[4];
if (SUM_Data == NULL)
{
cout << "Failed to allocate memory for SUM_Data" << endl;
exit(1);
}
//将mwArray类型中的数据复制为C++数据类型
SUM.GetData(SUM_Data, 4);
//输出结果
cout << "sum of m1 and m2 is:" << endl;
cout << SUM_Data[0] << ",\t" << SUM_Data[1] << endl;
cout << SUM_Data[2] << ",\t" << SUM_Data[3] << endl;
//释放内存
delete[] M1_Data;
delete[] SUM_Data;
//终止linmatrixadd
libmatrixaddTerminate();
//终止mcr
mclTerminateApplication();
}
在配置VS属性表之前如果不把matlab生成的动态链接库添加到matlab相应路径中,会出各种错