/thread-10041-1-1.html
/thread-545-1-1.html
一、
matlab下m文件
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild-setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:
二、
mcc -W cpplib:libmyadd2 -T link:lib myadd2-C
不加 -C 不会生成libmyadd2.ctf文件
结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。
三、
创建一个Win32 Console的VC++工程,把以上四个文件拷贝到VC++工程的源代码所在目录。
接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VC++6.0中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。
进行项目必要的设置(注意这里和VC有较大不同,与matlab也不同)。vc主界面进入project>Settings,点C/C++选项卡,Category选择Preprocessor,
Additionalincludedirectories下填入如下路径
C:\Program Files\MATLAB\Ra\extern\include
点“link”选项卡,Category选择General,在下面的Object/library modules那栏的最后添加
libmyadd2.lib mclmcrrt.lib
两个库之间以及和其他库以空格隔开。
然后Category选择input,
Additionallibrarypath下填写:
C:\ProgramFiles\MATLAB\Ra\extern\lib\win32\microsoft
如图
点击OK。
至此配置完毕
在VCcpp文件中
#include "stdafx.h"后添加#include <iostream>
#include "libmyadd2.h"
return 0上面添加
std::cout << "Hello world!"<< std::endl;
if(!mclInitializeApplication(NULL,0) )
{
std::cout<< "Could not initialize theapplication!" << std::endl;
return-1;
}
// initialize lib
if(!libmyadd2Initialize())
{
std::cout<< "Could not initialize libmyadd2!"<< std::endl;
return-1;
}
try
{
// declare and initializea
mwArray a(2, 2,mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
int i;
for( i=0; i<4;++i)
{
aData[i] =1.0*i;
}
// print output
std::cout<< "a = "<< std::endl;
std::cout<< aData[0]<< ",\t"<< aData[1]<< std::endl;
std::cout<< aData[2]<< ",\t"<< aData[3]<< std::endl;
a.SetData(aData, 4);
// declare and initializeb
mwArray b(2, 2,mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
mwArray y(2, 2,mxDOUBLE_CLASS);
mwArray z(2, 2,mxDOUBLE_CLASS);
// call the function
myadd2(2,y, z, a, b);
// copy data from mwArray toC++ objects
// allocate outputs
double *yData, *zData;
yData = new double[4];
if( yData == NULL )
{
std::cout<< "Failed to allocate memory foryData!" << std::endl;
return-1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout<< "Failed to allocate memory forzData!" << std::endl;
return-1;
}
// copy data from mwArray toC++
y.GetData(yData, 4);
z.GetData(zData, 4);
// print output
std::cout<< "y = "<< std::endl;
std::cout<< yData[0]<< ",\t"<< yData[1]<< std::endl;
std::cout<< yData[2]<< ",\t"<< yData[3]<< std::endl;
std::cout<< "z = "<< std::endl;
std::cout<< zData[0]<< ",\t"<< zData[1]<< std::endl;
std::cout<< zData[2]<< ",\t"<< zData[3]<< std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( constmwException& e)
{
std::cerr<< e.what()<< std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
点击编译、运行即可。
也可将m文件改为:
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
x1=0:0.1:10;
y1=sin(x1);
plot(x1,y1);
msgbox("hello world!");
end
其他不变,再生成dll文件等加载到VC中,其他不变,看一下效果
在main()函数中加一句
system("pause"); //暂停作用
//////////////////////////////////////////////
也可将m文件改为:
function [y,z] = myadd2(a, b,c)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
x1=0:0.1:c;
y1=sin(x1);
plot(x1,y1);
msgbox("hello world!");
end
其他不用改,在VC的main()函数中加入:
mwArray c(1, 1,mxDOUBLE_CLASS);
c(1,1)=5;
将调用函数改为:
// call the function
myadd2(2,y, z, a, b,c);
可以了