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數(shù)據(jù)類型
生成四個(gè)文件(用到的): liblin.ctf liblin.dll liblin.h liblin.lib
3.VC++6.0工程的創(chuàng)建與設(shè)置 (1)建立一個(gè)名為Test的C++控制臺(tái)工程,在工程中添加一個(gè)名為test.cpp文件 (2)對(duì)VC++6.0的設(shè)置(與matlab關(guān)聯(lián),一旦設(shè)置后以后就不需再修改) ----工具--->選項(xiàng)---->目錄----->include files: 加入--e:\matlab7\extern\inlcude ------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60 (3)針對(duì)該工程的設(shè)置: 工程---->設(shè)置----->連接---->對(duì)象/庫模塊:加入mclmcrrt.lib liblin.lib(自己制作dll時(shí)生成的庫文件) 注:也可以不在這里設(shè)置,在test.cpp文件中加入: #pragma comment(lib,"mclmcr.lib") #pragma comment(lib,"liblin.lib") (4)將前面生成的四個(gè)文件(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中計(jì)算: >> f = [-4;-1]; >>A = [-1 2; 2 3; 1 -1]; >>b = [4;12;3]; >>[x,fval] = linprog(f,A,b)
(2)在VC中調(diào)用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); } //輸入?yún)?shù)f,A,b mwArray A(3,2,mxDOUBLE_CLASS); mwArray f(2,1,mxDOUBLE_CLASS); mwArray b(3,1,mxDOUBLE_CLASS);
//輸出參數(shù)X,fval mwArray X(2,1,mxDOUBLE_CLASS); mwArray fval(1,1,mxDOUBLE_CLASS); //輸入,傳給mwArray double aa[]={-1,2,1,2,3,-1};//注意,這里的約束系數(shù)與在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);
//調(diào)用函數(shù) 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);
//輸出結(jié)果 cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;
//關(guān)閉庫和程序
liblinTerminate(); mclTerminateApplication();
return 0; }
|
|