【MATLAB与C的混合编程】之【C程序调用Matlab计算引擎】(1)
来源:互联网 发布:mac美服加速器 编辑:程序博客网 时间:2024/05/14 17:24
先贴本人调试通过的代码:
#pragma comment(lib, "libmx.lib")
//#pragma comment(lib, "libmat.lib")//注销了也没关系
#pragma comment(lib, "libeng.lib")
#include <math.h>
#include "engine.h"
#include <iostream>
using namespace std;
int main()
{
const int N = 50;
double x[N],y[N];
int j = 1;
for (int i=0; i<N; i++) //计算数组x和y
{
x[i] = (i+1);
y[i] = sin(x[i]) + j * log(x[i]); //产生-之间的随机数赋给xx[i];
j*= -1;
}
Engine *ep; //定义Matlab引擎指针。
if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。
{
cout <<"Can't start Matlab engine!" <<endl;
exit(1);//可以思考下
}
//定义mxArray,为1行,N列的实数数组。
mxArray *xx = mxCreateDoubleMatrix(1,N, mxREAL);
mxArray *yy = mxCreateDoubleMatrix(1,N, mxREAL); //同上。
memcpy(mxGetPr(xx), x, N*sizeof(double)); //将数组x复制到mxarray数组xx中。
memcpy(mxGetPr(yy), y, N*sizeof(double)); //将数组x复制到mxarray数组yy中。
engPutVariable(ep, "xx",xx); //将mxArray数组xx写入到Matlab工作空间,命名为xx。
engPutVariable(ep, "yy",yy); //将mxArray数组yy写入到Matlab工作空间,命名为yy。
//【特色】向Matlab引擎发送画图命令。plot为Matlab的画图函数,参见Matlab相关文档。
engEvalString(ep, "plot(xx, yy); ");
mxDestroyArray(xx); //销毁mxArray数组xx和yy。(注:Matlab工作空间中的xx、yy变量在这里没有销毁)
mxDestroyArray(yy);
cout <<"Press any key to exit!" <<endl;
cin.get();
engClose(ep); //关闭Matlab引擎。
}
------------------------------------------------------------------------------------------
结果贴图:
Matlab中内存变量:
xx =
Columns 1 through 22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Columns 23 through 44
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
Columns 45 through 50
45 46 47 48 49 50
yy =
Columns 1 through 13
0.8415 0.2162 1.2397 -2.1431 0.6505 -2.0712 2.6029 -1.0901 2.6093 -2.8466 1.3979 -3.0215 2.9851
Columns 14 through 26
-1.6484 3.3583 -3.0605 1.8718 -3.6414 3.0943 -2.0828 3.8812 -3.0999 2.2893 -4.0836 3.0865 -2.4955
Columns 27 through 39
4.2522 -3.0613 2.7037 -4.3892 3.0299 -2.9143 4.4964 -2.9973 3.1272 -4.5753 2.9674 -3.3412 4.6274
Columns 40 through 50
-2.9438 3.5549 -4.6542 2.9294 -3.7665 4.6576 -2.9269 3.9737 -4.6395 2.9381 -4.1744
===========================================================================================
注意事项:
1)本程序只需要建立win32控制台空项目
2)调用的是Matlab计算引擎,故需要有Matlab环境
3)VS2008中需要在“包含文件”中加入D:\Program Files\MATLAB\R2009b\extern\include(以后本人的Matlab与C混合编程例子中将不再给出此注意点)
4)VS2008中需要在“库文件”中加入D:\Program Files\MATLAB\R2009b\extern\lib\win32\microsoft(以后本人的Matlab与C混合编程例子中将不再给出此注意点)
5)系统变量中加入三个路径:D:\Program Files\MATLAB\R2009b\runtime\win32;D:\Program Files\MATLAB\R2009b\bin\win32;D:\Program Files\MATLAB\R2009b\extern\lib\win32\microsoft;注销后重进系统,以使路径生效
6)应该不会再有问题。【如果还有其他小问题(Main、Unicode等)网上找可以找到解决办法】
another website information
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;
}
- 【MATLAB与C的混合编程】之【C程序调用Matlab计算引擎】(1)
- 【MATLAB与C的混合编程】之【MATLAB调用C程序】
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序[zz]
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- MATLAB与C/C++混合编程之MATLAB调用C程序
- c与matlab混合编程之dll调用
- MATLAB与C++/MFC混合编程;调用MATLAB函数
- 第六周项目六:工资类
- 创建一个宏,实现通过excel导出TXT文本功能
- source insight快捷键及使用技巧
- 最小树形图
- 图解冲突域、广播域
- 【MATLAB与C的混合编程】之【C程序调用Matlab计算引擎】(1)
- 如何重新找回右键菜单新建项内没有文本文档文本文档的选择??
- View Scene Item 坐标系
- pandaboard之rootfs制作及启动
- hibernate4整合spring3.1出现异常
- 从Hadoop框架与MapReduce模式中谈海量数据处理(淘宝技术架构)
- jQuery实现统计字数的功能模块
- Spark, 一个实验的大数据分析项目
- 判断两棵二叉树是否相等