现在的位置: 首页 > 综合 > 正文

matlab练习程序(c/c++调用matlab

2012年05月24日 ⁄ 综合 ⁄ 共 1942字 ⁄ 字号 评论关闭

就我目前了解的c++调用matlab有两种方法。

第一种是通过matlab引擎调用,也就是这里用到的方法。

第二种是用matlab将m文件编译为相应的h/lib/dll文件再加以调用。

使用engine所用到的h和lib文件基本在D:\Program Files\MATLAB\R2010b\extern里面,当然不同的机器安装的地方都不一样。

头文件只需engine.h即可。lib文件需要这三个:libmx.lib/libmat.lib/libeng.lib。至于如何配置我就不介绍了,方法很多。

引擎相应的部分函数如下:

engOpen:启动Matlab引擎

engClose:关闭Matlab引擎

engGetArray:从Matlab引擎中获得一个Matlab矩阵,用于数据交换

engPutArray:从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换

engEvalString:执行一个Matlab命令

engOutputBuffer:创建一个用于存储Matlab文本输出的字符缓冲区

相应例程:

#include <iostream>
#include <math.h>
#include "engine.h"
using namespace std;
void main()
{
    Engine *ep; //定义Matlab引擎指针。
    if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。
    {
        cout <<"Can't start Matlab engine!" <<endl;
        exit(1);
    }

    //下面是将c++格式数据转换为matlab格式可用数据
    double data[4]={1.0,2.0,3.0,4.0};
    mxArray *Y=mxCreateDoubleMatrix(1,4,mxREAL);

    memcpy(mxGetPr(Y),data,sizeof(data));
    engPutVariable(ep,"Y",Y);

    engEvalString(ep,"plot(Y,'o')");    //显示数据
    mxDestroyArray(Y);            

    engEvalString(ep,"figure");        //开一个新的显示窗口

//////////////////////////////////////////////////////////
    //下面是从matlab格式数据转换为c++格式可用数据
//    mxArray *filename=NULL;
//    const char *name="D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg";
//    filename=mxCreateString(name);
//    engPutVariable(ep,"filename",filename);

    engEvalString(ep,"X=imread('D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg');");    //在engine中读取一张图片
    engEvalString(ep,"imshow(X)");        //显示图片
    mxArray *X=engGetVariable(ep,"X");    //从engine获得真正的数组X
    
    int ndims=mxGetNumberOfDimensions(X);    //获得这个数组的维数
    cout<<ndims<<endl;

    int *dims=new int[ndims];    
    memcpy(dims,mxGetDimensions(X),ndims*sizeof(int));    //获得数组每一维的大小
    for (int i=0;i<ndims;i++)
    {
        cout<<dims[i]<<"  ";
    }
    cout<<endl;
/*
    double *p=(double*)mxGetData(X);    //指向数组X的指针以便能访问数组元素,图像数据量太大,这里就不显示了
    for (int i=0;i<dims[0];i++)
    {
        for (int j=0;j<dims[1];j++)
        {
            cout<<p[i*dims[1]+j]<<"  ";
        }
        cout<<endl;
    }
*/
    delete[] dims;
    mxDestroyArray(X);

    cout <<"good job." <<endl;
    cin.get();
    engClose(ep); //关闭Matlab引擎。

}

由于整个环境离不开matlab,所以程序还需相应的dll文件才能运行。

matlab的结构实在复杂,所以我也不太清楚究竟需要哪些dll,我就图简单了,直接把生成的文件移到了matlab可执行目录下了。

通常是这个目录:D:\Program Files\MATLAB\R2010b\bin\win32

抱歉!评论已关闭.