1.编写m文件 function [X,f]=lin(f,A,b) [x,fval] = linprog(f,A,b); X=x; f=fval; End 保存为lin.m 2.将m文件编译为dll mcc -W cpplib:liblin -T link:lib lin.m -v 其中,libname为编译后的库文件名,lin.m为matlab的m文件名 该命令用于mwArray数据类型
生成四个文件(用到的): liblin.ctf liblin.dll liblin.h liblin.lib
3.VC++6.0工程的创建与设置 (1)建立一个名为Test的C++控制台工程,在工程中添加一个名为test.cpp文件 (2)对VC++6.0的设置(与matlab关联,一旦设置后以后就不需再修改) ----工具--->选项---->目录----->include files: 加入--e:\matlab7\extern\inlcude ------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60 (3)针对该工程的设置: 工程---->设置----->连接---->对象/库模块:加入mclmcrrt.lib liblin.lib(自己制作dll时生成的库文件) 注:也可以不在这里设置,在test.cpp文件中加入: #pragma comment(lib,"mclmcr.lib") #pragma comment(lib,"liblin.lib") (4)将前面生成的四个文件(matlab的works文件夹下)添加到VC6.0建立的工程目录下,将liblin.h添加到工程(工程--->添加到工程---->文件)
例: min f = -4x1- x2, s.t. -x1+2x2<=4 2x1+3x2<=12 x1-x2<=3 x1,x2>=0 (1)在matlab中计算: >> f = [-4;-1]; >>A = [-1 2; 2 3; 1 -1]; >>b = [4;12;3]; >>[x,fval] = linprog(f,A,b)
(2)在VC中调用dll 具体代码:
#include <iostream> using namespace std; #include "mclmcr.h"//mwArray类型定义 #include "liblin.h"dll的头文件
#pragma comment(lib,"mclmcr.lib") #pragma comment(lib,"liblin.lib")
int main() { //初始化程序 if(!mclInitializeApplication(NULL,0)) { cout<<"Could not initialize the application!"; exit(1); } //初始化库 if(!liblinInitialize()) { cout<<"Could not Initialize the library!"; exit(1); } //输入参数f,A,b mwArray A(3,2,mxDOUBLE_CLASS); mwArray f(2,1,mxDOUBLE_CLASS); mwArray b(3,1,mxDOUBLE_CLASS);
//输出参数X,fval mwArray X(2,1,mxDOUBLE_CLASS); mwArray fval(1,1,mxDOUBLE_CLASS); //输入,传给mwArray double aa[]={-1,2,1,2,3,-1};//注意,这里的约束系数与在matlab中的不一样 double bb[]={4,12,3}; double ff[]={-4,-1};
//给f,A,b赋值 A.SetData(aa,6); b.SetData(bb,3); f.SetData(ff,2);
//调用函数 lin(2,X,fval,f,A,b); //从X,fval取值 double* x; double* fv; x = new double[2]; fv = new double[1];
X.GetData(x,2); fval.GetData(fv,1);
//输出结果 cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;
//关闭库和程序
liblinTerminate(); mclTerminateApplication();
return 0; }
|
|