vc2005如何设置才能调用matlab函数

vc2005如何设置才能调用matlab函数,第1张

上面那个乱回答嘛,里面都没讲。。人家要2005的,,我给你收索滴:
在vs2005中添加lib库的方法2007-09-04 09:48方法一:
点击菜单命令 “项目/属性”,d出项目属性对话框;或者在解决方案视图或类视图中,右击项目名称,选“属性”,d出项目属性对话框;在d出对话框的活动配置中,选择“配置属性/链接器/输入/附加依赖项”,即可输入待加入的lib库文件,添加完毕点击“应用”或“确定”按钮。如果要对所有的配置添加lib库文件,可先将活动配置切换为“所有配置”。
在“配置属性”---“连接器”---“常规”的“附件库目录”填上库所在的目录名,这个目录名最好是在工程文件夹中建一个专门放lib的文件夹。
方法二:
#pragma comment(lib,"libnamelib")
头文件也类似,,

我把我了解的一点分享下:
首先打开一个matlab工程,在c中调用engOpen可以打开该工程
然后是c语言中的矩阵需要保存成为matlab可以理解的数据类型:mxarray 就是说在c里把数据保存为mxarray这种数据类型里再传递到matlab里,matlab读出来就是矩阵啊向量啊这种东西了
在然后我觉得很方便的就是用engEvalString 命令来调用matlab中的一些预定义函数之类的了
这个命令和matlab里eval命令是差不多的,参数的传递类型是字符串 内容是你需要调用的函数
最后一个例子 我抄的 没试过。。。
#include "engineh"
void main()
{
Engine ep;
mxArray A_ptr;
double A;
int i,j;
/创建一个新矩阵
A_ptr=mxCreateDoubleMatrix(10,10,mxREAL);
mxSetName(A_ptr,"A");
A=mxGetPr(A_ptr);
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
A[i+10j]=(j+1)(j+1)+(i+1)(i+1);
}
}
ep=engOpen("/opt/matlab52/bin/matlab");/打开工程
engPutArray(ep,A_ptr);
engEvalString(ep,"mesh(A);")
engEvalString(ep,"print pictureeps -deps;");
engClose(ep);
mxDestroyArray(A_ptr);
exit(0);
}
完成功能就是建立一个矩阵传递到matlab里 画出图形

通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及 *** 作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将m程序转成dll文件!
一、使用matlab将m转成dll文件
1、在命令行中输入mex -setup
提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C/C++ version 60 in E:\Program Files\Microsoft Visual Studio”,根据自己实际情况选择。
2、在命令行中输入mbuild -setup
这里的选项和上面类似,依次选择环境确定。
3、生成dll文件
一句命令mcc -W cpplib:add -T link:lib addm
前面的add表示生成的dll文件名,后面的addm顾名思义是m文件名。生成后会多出8个文件,有用的是addctfadddll addlib addh4个文件,据说新版的Matlab不会生成ctf文件。
二、VC60中调用生成的dll文件
上面生成的dll文件,我们可以借助VC60的Depends工具查看导出函数名,但是我们要调用导出函数必须要知道函数的形参返回类型等,这里要借助h文件,它包含了导出函数的声明,下面以实例来讲解使用方法:
1、addm文件
function [a,b]=add(x,y)
a=2x+y;
b=3y;
end
注意了add函数有两个返回值,可以猜测一下在C++中是如何处理的;
2、addh文件
截取其中一段关键代码如下:
extern void add(int nargout, mwArray& a, mwArray& b
, const mwArray& x, const mwArray& y);
实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 现在做的这个项目中用户自定义算法dll使用的规则和这里类似!
3、C++中调用dll文件
(1)新建空工程,将上面提及的4个文件放到工程目录下;
(2)VC++目录中包含目录:matlab 内的include目录
比如我的是 E:\MATLAB7\extern\include
(3)VC++目录中库目录:matlab 内的lib目录
E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根据VC++版本修改!
(4)工程属性-》连接-》输入-》附加依赖项
输入:addlib mclmcrrtlib mclmcrlib,第一个是生成的。或者在预处理中加入下面代码
#pragma comment(lib, "mclmcrrtlib")
#pragma comment(lib, "mclmcrlib")
#pragma comment(lib, "addlib")
4、C++代码
#include <iostream>
#include "addh"
using namespace std;
int main()
{
if(!addInitialize())
{
cout<<"initilize failed!!!"<<endl;
return -1;
}
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
a(1,1)=20;
b(1,1)=30;
mwArray x(1,1,mxDOUBLE_CLASS);
mwArray y(1,1,mxDOUBLE_CLASS);
//输出参数个数,输出参数,输入参数。
add(2,x,y,a,b);
double i=new double;
double j=new double ;
xGetData(i,1);
yGetData(j,1);
cout<<"x="<<i<<" y="<<j<<endl;
getchar();
return 0;
}
注意:addInitialize()一定要!

用engine的方法,,其他的几种方法比较局限,,,我就是这么做的,,
这几天正在写这方面的论文,,这是其中的几句关键
每个函数的具体用法如下:
1、GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10); 将ID为IDC_EDIT1的编辑框控件里的输入转化为数组ch1[10];
2、GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);将数组ch3的元素组成的数据显示在ID为IDC_EDIT3的编辑框里;
3、memcpy((char ) mxGetPr(M),(char ) A,2sizeof(double));将vc中的数组A放入内存中赋给M(M初始化为M = mxCreateDoubleMatrix(m, n, mxREAL);即内存中的m×n的数组)
4、engPutVariable(ep,"z",M);将内存中的M读取进入matlab的workspace赋给Z;
5、M=engGetVariable(ep,"x"); 将matlab中workspace中的数组X传给内存中的M;
6、memcpy((char ) A,(char ) mxGetPr(M),2sizeof(double));将内存中的数组M传给vc中的数组A;

我几年以前做过这样的混合编程,下面是运行正确的代码片段,供你参考:
单个变量也要定义成1X1的矩阵形式,如 double sample[1]={0};
sizeof括号里面应该是变量的数据类型,如double
时间长了,我都有点忘了,希望给你提供帮助。
void CBsplineDlg::OnButtonStartCalculation()
{
// TODO: Add your control notification handler code here
//从表中读入原始数据,存储为rowCount维数组中
double x[ROWMAX]={0};
double y[ROWMAX]={0};
double xout[ROWMAX]={0};
double yout[ROWMAX]={0};
double sample[1]={0}; //拟合中选择的采样点数
double dispfig[1]={0}; //拟合结束后是否显示图形
for(long i=1;i<rowCount;i++)
{
m_gridSetRow(i);
m_gridSetCol(1);
x[i-1]=atof(m_gridGetText());
m_gridSetCol(2);
y[i-1]=atof(m_gridGetText());
}
//根据用户设置获得采样点及是否显示图形的信息,作为参数传人matlab
UpdateData(true);//这一句应该写在这里,即向matlab传值之前
sample[0]=m_iSample;
dispfig[0]=m_bCheck 10 : 00;
Engine ep;
mxArray c1 = NULL, c2 = NULL;
mxArray str=NULL,samp=NULL,display=NULL;
mxArray GetDatax=NULL,GetDatay=NULL;
TCHAR buffer[MAX_PATH];
char strCmd[MAX_PATH];
char strSave[MAX_PATH];
::GetCurrentDirectory(MAX_PATH,buffer);

if (!(ep=engOpen(NULL)))
{
//MessageBox ((HWND)NULL, (LPSTR)"Can't start MATLAB engine",
//(LPSTR) "Engwindemoc", MB_OK);
AfxMessageBox("不能打开matlab,请确认系统中装有matlab软件!");
exit(-1);
}
engSetVisible(ep,1); //显示matlab窗口
//T = mxCreateDoubleMatrix(1, 10, mxREAL);
c1=mxCreateDoubleMatrix(1,rowCount-1,mxREAL);
//memcpy((void )mxGetPr(T), (void )time, sizeof(time));
memcpy((void )mxGetPr(c1),(void )x,(rowCount-1)sizeof(double));
//engPutVariable(ep, "T", T);
engPutVariable(ep,"c1",c1);
c2=mxCreateDoubleMatrix(1,rowCount-1,mxREAL);
memcpy((void )mxGetPr(c2),(void )y,(rowCount-1)sizeof(double));
engPutVariable(ep,"c2",c2);
samp=mxCreateDoubleMatrix(1,1,mxREAL);
memcpy((void )mxGetPr(samp),(void )sample,1sizeof(double));
engPutVariable(ep,"nSample",samp);
display=mxCreateDoubleMatrix(1,1,mxREAL);
memcpy((void )mxGetPr(display),(void )dispfig,1sizeof(double));
engPutVariable(ep,"boolFigureout",display);
sprintf(strCmd,"cd %s\\splinework",buffer);
sprintf(strSave,"%s\\splinework\\",buffer);
str=mxCreateString(strSave);//传人文件当前路径,用于保存文件
engPutVariable(ep,"SavePath",str);
engEvalString(ep,strCmd);
engEvalString(ep,"A=[c1',c2'];");
engEvalString(ep,"frm='everything is ok'");
if(!m_bB)
{
engEvalString(ep,"[tx,ty]=BSpline(A,nSample,SavePath,boolFigureout);");
}
else
{
engEvalString(ep,"[tx,ty]=B3Spline(A,nSample,SavePath,boolFigureout);");
}
//取回计算结果
GetDatax=engGetVariable(ep,"tx");
memcpy((void )xout,(void )mxGetPr(GetDatax) , (rowCount-1)sizeof(double));
GetDatay=engGetVariable(ep,"ty");
memcpy((void )yout,(void )mxGetPr(GetDatay) , (rowCount-1)sizeof(double));
//engClose(ep);
AfxMessageBox("点击确定将关闭matlab引擎!");
mxDestroyArray(c1);
mxDestroyArray(c2);
mxDestroyArray(str);
mxDestroyArray(samp);
mxDestroyArray(display);
mxDestroyArray(GetDatax);
mxDestroyArray(GetDatay);
engClose(ep);
//以下代码用于将结果保存在flexgird控件中
//下面省去和你的问题无关的代码若干
}

当需要脱离matlab运行程序时,我在网上查的需要
“将 <matlab path >/extern/lib/win32/mglinstallerexe拷贝到到待运行机器上
在机器上先运行mglinstallerexe, 然后选择解压目录,将在指定目录下解压缩出bin和toolbox两子目录,其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个(我的是47个)。可以将这些dll考入system32,(考入的时候某些dll被占用 无法考入) 也可以直接放在应用程序目录下(能否帮我举个例子,我放了很多地方都不行)。而toolbox目录则必须与应用程序同一目录。”

可以在VC中使用matlab引擎(matlab engine),但是系统需要安装matlab。
另一种方法使用matcom软件将matlab画图的函数做成一个dll文件,嵌入到VC中;
还有几种方法,自己学习一下这个网站>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/10493229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存