㈠ matlab与c/c++混合编程 怎么调试c代码
nlhs:输出参数数目
plhs:指向输出参数的指针
nrhs:输入参数数目
例如,使用
[a,b]=test(c,d,e)
调用mex函数test时,传给test的这四个参数分别是2,plhs,3,prhs
㈡ 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 VC混合编程调用神经网络工具箱
调用MATLAB Engine虽然可以实现对神经网络工具箱的功能,但是因为这种方法是基于C/S模式的,效率很低,而且需要在matlab下实现其功能,无法脱离matlab直接运行,所以,基于这个原因,我放弃了利用MATLAB Engine来实现混合编程。利用C++数学库虽然可以脱离MATLAB直接运行,但是C++数学库并不支持神经网络工具箱,所以,无法实现基于神经网络的混合编程。利用mcc命令虽然可以直接生成.exe文件,并可以脱离MATLAB在VC++中直接运行,但是因为其自身的诸多缺点,这种方法并不能编译神经网络函数为C++文件,所以,也无法胜任这个任务。 最后,只有COM组件这一个办法了,由于COM组件技术的强大功能,利用matlab的COM Builder工具可以实现脱离matlab的混合编程,并成功的调用了神经网络工具箱。
㈣ 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函数
matlab中调用c语言函数:
#include "mex.h" //头文件必须包含mex.h
double mexSimpleDemo(double *y,double a,double b);
//C语言算法程序声明,在最后调用时,第一
// 个参数是返回结果
//c语言到matlab变换,以mexFunction命名
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
double *y;
double m,n;
//获取输入变量的数值大小
m=mxGetScalar(prhs[0]);
n=mxGetScalar(prhs[1]);
//获取输出变量的指针
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
y=mxGetPr(plhs[0]);
//调用子函数
mexSimpleDemo(y,m,n);
}
//C语言函数
double mexSimpleDemo(double *y,double a,double b)
{
return *y=(a>b)?a:b;
}
㈥ 如何将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");
}
㈦ matlab与c混合编程,engOpen()的问题,matlab引擎启动不了
使用engOpen()打开Matlab引擎总是失败,问题可能就是Matlab组件没有注册。注册方法:点击开始/运行/cmd,在命令行提示窗口下更改到Matlab安装路径/bin,运行指令
matlab/regserver,注册成功后会弹出Matlab 命令窗口。