C和MATLAB的混合编程
通过matcom混合编程。
首先把matlab语言转换成dll,可以在c里面调用。
当然,新版本的matlab可以把m语言直接转换成标准c
2. 哪位大侠知道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给软件开发人员提供了一种共享二进制代码的方法,这种共享并不局限于某种编程语言。
3. 如何将c文件在matlab simulink中混编
方法/步骤
菜单:工程→ 属性... 选择配置属性下的 VC++ 目录。在包含目录栏目中添加matlab相关的include文件。我的matlab装在F盘中,只要把F:\MatLab\extern\include\win64和F:\MatLab\extern\include两个目录配置上去就好,这里注意下要是win64的vs所建立的工程必须是x64的,否则会出错,比较低的版本则没有win64,只有win32 这样是建立一个x86或win32工程即可
在 库目录栏目中添加matlab相关的lib文件。例如:F:\MatLab\extern\lib\win32\microsoft;F:\MatLab\extern\lib\win32;F:\MatLab\extern\lib\win64\microsoft;F:\MatLab\extern\lib\win64;
注意这里是针对于不同的工程和机器位数,最好全部加上去,以免出错。
菜单:工程 属性 选择配置属性下的 连接器→ 输入。
在 附加依赖项 栏目中输入项目需要引用matlab的的lib文件库。
libmat.lib libeng.lib libmx.lib
菜单:工程 属性 选择配置属性下的 连接器→ 常规。
在 附加库目录 栏目中,添加库所在的目录名称。如:F:\MatLab\bin\win64
这一步相当的重要,不然的话,各种dll文件找不到,lib文件找不到之类的报错。
测试:从网上随便找一个代码
#include <iostream>#include <iomanip>using namespace std;#include <engine.h>#include <string.h>
void main(){ // 定义循环变量 int i = 0, j = 0;
// 状态变量
int nStatus = 0; // 定义MATLAB引擎指针 Engine *ep;
// 定义mxArray变量指针 mxArray *A, *B;
// 定义矩阵数组
// 注意:VC中矩阵的行列次序与MATLAB正好时相反,需要转置。 double arData[3][3] = {{7.5,16.3,9.6},{13.2,8.9,12.3},{9.6,5.4,13.7}}; double arResData[3][3];
// 输出原矩阵 cout<<"原矩阵为:"<<endl; for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { cout<<setw(10)<<arData[i][j]<<" "; } cout<<endl; } // 打开MATLAB引擎 ep = engOpen(NULL); if(ep == NULL) { cout<<"无法打开MATLAB引擎。"<<endl; exit(EXIT_FAILURE); }
// 是否显示MATLAB窗口:true-显示;false-隐藏。
nStatus = engSetVisible(ep, false);
if(nStatus != 0)
{
cout<<"设置MATLAB显示属性失败。"<<endl;
exit(EXIT_FAILURE);
}
// 为mxArray变量分配空间 A = mxCreateDoubleMatrix(3,3,mxREAL); B = mxCreateDoubleMatrix(3,3,mxREAL); if(A == NULL || B == NULL) { cout<<"为mxArray变量分配空间失败。"<<endl;
exit(EXIT_FAILURE); }
// 将数组中的数据写入到mxArray空间中
memcpy((void*)mxGetPr(A),(void*)arData,sizeof(arData));
// 将矩阵变量A写入到MATLAB引擎空间
nStatus = engPutVariable(ep,"A",A);
if(nStatus != 0)
{
cout<<"矩阵变量写入MATLAB引擎空间失败。"<<endl;
exit(EXIT_FAILURE);
}
// 执行引擎命令求矩阵A的逆矩阵
nStatus = engEvalString(ep,"B=inv(A)");
if(nStatus != 0)
{
cout<<"执行MATLAB引擎命令失败。"<<endl;
exit(EXIT_FAILURE);
}
// 从MATLAB引擎空间中读取执行结果
B = engGetVariable(ep,"B");
// 将矩阵变量B复制到数组arResData中
memcpy((void*)arResData,(void*)mxGetPr(B),sizeof(arResData));
// 释放矩阵变量空间
mxDestroyArray(A);
mxDestroyArray(B);
// 关闭MATLAB引擎
engClose(ep);
// 输出计算结果
cout<<"逆矩阵为:"<<endl;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
cout<<setw(10)<<arResData[i][j]<<" ";
}
cout<<endl;
}
// 暂停程序,查看结果
system("pause");
}
4. 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程序运算
5. matlab与c/c++混合编程,急!
目前常用的的是4.5版本,包含matlab.h头文件,和v4501v.dll
ago4501两个动态库即可。
具体可参考matcom帮助或者留言给我
6. 如何将MATLAB文件与c#混合编程
没有做过这方面的编程,不过之前在杂志上看过相关的文章,是基于MatlAB与VB的混合编程,由于MatlAB不能开发可执行文件,程序必须在其环境运行,MatlAB提供了与其他高级语言的接口,以实现它们的混合编程。
文章介绍了两种接口方法:引入1.Matrix
VB
2.借助Matcom将MatlAB函数转换为VB可调用的DLL文件。具体方法你可以查看相关资料
7. matlab与c 混合编程 大概可提速多少倍
我做图像处理的时候,先是用MATLAB,因为有大量的循环处理,其运行时间将近一分钟,后来改用MATLAB与C混合,时间缩短至0.09秒,时间之差,真的是不可估量。
但是,情况不完全如此,MATLAB优点在于矩阵运算中,如果你的程序中有大量的矩阵运算,那么混合编程个人不是很建议;C语言优点在于循环速度很快。
我也有这样的经历,我的算法中有大量的矩阵运算(由于我是做图像处理,矩阵基本上是512*512的),本来用MATLAB编程用了9秒左右的时间,但是改用了C混合后,N长时间,反正我是等了将近一分钟,混合程序我是检验过的,没有死循环的。
以上这些完全个人经验之谈,希望对您有个帮助。
8. matlab与c混合编程,engOpen()的问题,matlab引擎启动不了
使用engOpen()打开Matlab引擎总是失败,问题可能就是Matlab组件没有注册。注册方法:点击开始/运行/cmd,在命令行提示窗口下更改到Matlab安装路径/bin,运行指令
matlab/regserver,注册成功后会弹出Matlab 命令窗口。
9. matlab与C++混合编程(高手请进)
源代码:
#include "D:\extern\include\mat.h"
void main() {
MATFile *pMF; // mat文件
mxArray *pA; // 矩阵指针
double *A; // 数据指针
int i, j;
// 打开一个test.mat文件,只写,如果不存在就新建,否则删除重建
pMF = matOpen("test.mat", "w");
// 新建一个12*4的矩阵只有实部(在MATLAB里矩阵都是复矩阵)
pA = mxCreateDoubleMatrix(12, 4, mxREAL);
// 给这个矩阵命名为x
mxSetName(pA, "x");
// 让指针Array指向这个矩阵的数据
A = mxGetPr(pA);
// 在VC里数组是按行排放的,在MATLAB里矩阵是按列排放的,)
for (i = 0; i < 12; i++)
for (j = 0; j < 4; j++)
A[j * 12 + i] = i + 0.001 * j;
// 将矩阵写到文件test内
matPutArray(pMF, pA);
// 释放矩阵空间
mxDestroyArray(pA);
// 关闭文件
matClose(pMF);
}