分享

VC调用matlab的linprog函数-----自己的总结

 火离 2010-05-08
 

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.mmatlabm文件名

该命令用于mwArray数据类型

 

生成四个文件(用到的):

 liblin.ctf      liblin.dll    liblin.h   liblin.lib

 

3.VC++6.0工程的创建与设置

1)建立一个名为TestC++控制台工程,在工程中添加一个名为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)将前面生成的四个文件(matlabworks文件夹下)添加到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;

}

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多