zoukankan      html  css  js  c++  java
  • matlab练习程序(c/c++调用matlab<engine>)

    就我目前了解的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

  • 相关阅读:
    【转载】Linux的进程间通信-信号量
    【转载】高性能数据库连接池的内幕
    【转载】我是一块硬盘(下)
    【转载】我是一块硬盘(上)
    69. Sqrt(x)
    68. Text Justification
    67. Add Binary
    66. Plus One
    65. Valid Number
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2933578.html
Copyright © 2011-2022 走看看