matlab与c的混合编程
① 哪位大侠知道vc和matlab混合编程
MATLAB 与Visual C++结合的方法有多种,但其实用程度与范围不同。目前主要有以下三种方式。
1. 通过Matlab引擎(Engine)
采用客户机/服务器(Client/Service)的计算模式,通过windows的ActiveX通道和MATLAB进行结合。MATLAB引擎采用客户机和服务器计算方式,提供了一组Matlab API函数,用户不必关心Matlab引擎是如何实现的,只要调用这些函数即可。正是通过这些API函数实现应用程序进程之间的传递函数,从而实现Matlab与VC的混合编程。具体应用中,往往在VC中设计程序框架, VC的c语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,通过调用MATLAB引擎在后台与MATLAB服务器建立连接,实现动态通信。这种处理方法不要求链接整个Matlab,只需嵌入必要的Matlab引擎库,节省了大量的系统资源,使应用程序整体性能更好,处理效率更高,但这种混合编程的方法需要MATLAB在后台适时运行不能脱离Matlab环境,否则影响了程序的通用性,因此这种方法在实际开发过程中很少采用。
2. 通过DLL实现混合编程
DLL是动态链接库的英文缩写,是一个可执行的二进制文件。把很多通用的功能放在DLL 中,可供多个应用程序调用,而不是每个应用程序在连接时都要增加一个库中目标代码的拷贝。通过Matlab自带的Compiler编译器,可以把由Matlab编写的m 函数文件编译成动态链接库(dl1)。或者通过Matlab提供的组件功能,运用VC+十向导自动生成m文件的动态链接库。在VC程序中调用封装的函数,实现数值算法的运用。这种方法只需在开发和发布中包含其生成的动态库就可以了,可以使程序脱离Matlab可以整体减少文件外部存储空间的占有量,并实现了代码共享。
3.使用COM技术实现混合编程
COM技术是一种应用广泛、方便灵活的方法,是利用MATLAB提供的Deploy Tool工具实现MATLAB与C/C++的混合编程。COM给软件开发人员提供了一种共享二进制代码的方法,这种共享并不局限于某种编程语言。
② matlab和c混合编程如何运行
简单点的,你就用matlab写一个接口程序,封装你的c程序,类似下面这种:(matlab的例子,实现数组相乘,文件为arrayProct.c)
#include "mex.h"
/* 你的c */
void arrayProct(double x, double *y, double *z, mwSize n)
{
mwSize i;
/* multiply each element y by x */
for (i=0; i<n; i++) {
z[i] = x * y[i];
}
}
/* 接口程序 */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
/*初始化输入输出*/
double multiplier; /* input scalar */
double *inMatrix; /* 1xN input matrix */
mwSize ncols; /* size of matrix */
double *outMatrix; /* output matrix */
/* 参数检查,如果程序较简单也可以不用做*/
if(nrhs!=2) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:nrhs","Two inputs required.");
}
if(nlhs!=1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:nlhs","One output required.");
}
/* make sure the first input argument is scalar */
if( !mxIsDouble(prhs[0]) ||
mxIsComplex(prhs[0]) ||
mxGetNumberOfElements(prhs[0])!=1 ) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:notScalar","Input multiplier must be a scalar.");
}
/* check that number of rows in second input argument is 1 */
if(mxGetM(prhs[1])!=1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:notRowVector","Input must be a row vector.");
}
/* get the value of the scalar input */
multiplier = mxGetScalar(prhs[0]);
/* create a pointer to the real data in the input matrix */
inMatrix = mxGetPr(prhs[1]);
/* get dimensions of the input matrix */
ncols = mxGetN(prhs[1]);
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);
/* get a pointer to the real data in the output matrix */
outMatrix = mxGetPr(plhs[0]);
/* call the computational routine */
arrayProct(multiplier,inMatrix,outMatrix,ncols);
}
这个看起来复杂,其实很简单的,就几步:
1、使用mxGet*将输入变为matlab兼容形式
2、使用mxSet*初始化输出空间
3、使用你的C程序运算
③ c语言与matlab混合编程怎么生成m文件
通过matcom混合编程。
首先把matlab语言转换成dll,可以在c里面调用。
当然,新版本的matlab可以把m语言直接转换成标准c
④ vc++ matlab混合编程 fsolve
这个可以有四种方法实现:
(1)将Matlab程序编译成 C/C++源文件并嵌入VC++;
(2)在C/C++程序中利用 Matlab engine调用 Matlab函数;
(3)在C/C++程序中直接使用 Matlab C/C++ Math Library;
(4)将.m文件编闹斗斗译成 *.dll文件嵌入到 VC++的程序中。
自己上销唤网查一下。
不过告诉你一个简单的,在matlab的工作窗口执行:
mbuild -setup
按提示操作
然后执行
met -setup
完成后,到VC里面,应该会出现met工液磨程选项,然后操作就很简单了。
⑤ matlab与c混合编程,engOpen()的问题,matlab引擎启动不了
使用engOpen()打开Matlab引擎总是失败,问题可能就是Matlab组件没有注册。注册方法:点击开始/运行/cmd,在命令行提示窗口下更改到Matlab安装路径/bin,运行指令
matlab/regserver,注册成功后会弹出Matlab 命令窗口。
⑥ matlab与c 混合编程 大概可提速多少倍
我做图像处理的时候,先是用MATLAB,因为有大量的循环处理,其运行时间将近一分钟,后来改用MATLAB与C混合,时间缩短至0.09秒,时间之差,真的是不可估量。
但是,情况不完全如此,MATLAB优点在于矩阵运算中,如果你的程序中有大量的矩阵运算,那么混合编程个人不是很建议;C语言优点在于循环速度很快。
我也有这样的经历,我的算法中有大量的矩阵运算(由于我是做图像处理,矩阵基本上是512*512的),本来用MATLAB编程用了9秒左右的时间,但是改用了C混合后,N长时间,反正我是等了将近一分钟,混合程序我是检验过的,没有死循环的。
以上这些完全个人经验之谈,希望对您有个帮助。