matlab vc

本文的环境为VC++ 6.0、Matlab 7.0。不同的环境在实现起来可能略有不同。
1 设置Matlab编译器
在Matlab命令窗口中输入mbuild –setup,系统提示“是否对安装的编译器进行配置?”,输入y,显示系统中安装的编译器。选择Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio的编译器,并确定。(注:此步过程只需进行一次。)

2 编写m函数
作为示例,这里编写了一个简单的m函数:
function b = myFunc(a)
b = a.*a;
保存文件名为myFunc.m。

3 编译m函数为DLL
在Matlab命令窗口中输入mcc -B csharedlib:myDLL myFunc.m。其中,myDLL是生成的dll的文件名,这个名子可以更改。
编译完成后,将myFunc.m所在的文件夹下生成9个文件。其中,myDLL.dll、myDLL.lib和myDLL.h三个文件是我们下面所要使用的。

4 建立测试工程
启动VC。选择文件菜单下的新建命令,创建一个Win32 Console Application。在工程类型对话框中选择A simple application。点击完成。

5 设置VC++6.0工作环境
要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例):

1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:\matlab\extern\include"(假定matlab安装在C:\matlab目录)。 
2) 选择Library files,添加路径:C:\matlab\extern\lib\win32\microsoft\msvc60。 
3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。

以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它C++编译器如Borland C++ builder,设置大体相同,不再赘述。

6 编写测试代码
首先添加#include “myDLL.h”。
myDLL.h输出了几个函数,工程中用到的函数有三个,它们分别是:myDLLInitialize()、myDLLTerminate()和mlfMyfunc()。这三个函数的作用分别是初始化DLL库、结束DLL库和m函数myFunc对应的C函数,这个C函数也是我们所需要的。
和m函数相比,函数名有了一些变化。主要的变化是加上了mlf的前缀。这个前缀应该是MatLab Function的简写。
然后在main()函数内添加代码。总的main()函数代码清单如下所示:
int main(int argc, char* argv[])
{
    myDLLInitialize();                    //库初始化

    double _x[5] = {1, 2, 3, 4, 5};                //输入数组
    double _y[5];                        //输出数组

    mxArray* x = mxCreateDoubleMatrix(1, 5, mxREAL);    //创建1*5矩阵
    memcpy(mxGetPr(x), (void*)_x, sizeof(_x));        //拷贝输入数据
    
    mxArray* y = mxCreateDoubleMatrix(1, 5, mxREAL);    //创建1*5矩阵
    y = mlfMyfunc(x);                    //调用m函数
    memcpy(_y, mxGetPr(y), sizeof(_y));            //拷贝输出数据

    myDLLTerminate();                    //结束DLL库

    printf("%f\n", _y[0]);                    //打印结果
    printf("%f\n", _y[1]);
    printf("%f\n", _y[2]);
    printf("%f\n", _y[3]);
    printf("%f\n", _y[4]);
    
    return 0;
}

这些代码在理解上应该不是很困难。需要说明的有一点:mxArray可认为是C中与Matlab中相对应的矩阵类型。在C中,变量需要先定义,后使用。另外,在定义mxArray类型的变量后,需要对其进行初始化,指定它的类型和尺寸。mxGetPr()函数用于获取mxArray类型数据的实部首地址,因为内存是连续分配的,所以可以使用内存拷贝函数将一个数组的数据拷贝给它

7 发布
如果仅是在本机上使用DLL,那么以上六步即可满足要求。如果要在没有安装Matlab的计算机中使用此DLL,还需要随DLL拷贝一些动态链接库等文件。
双击D:\MATLAB6p5p1\extern\lib\win32文件夹下的mglinstaller.exe文件,即可生成所需的文件。
mglinstaller.exe会在D:\MATLAB6p5p1\extern\lib\win32文件夹下生成两个新的文件夹,它们的名称分别是bin和toolbox。发布时只要把这两个文件夹连同DLL一起拷贝就可以了。
所需要文件数目是很大的,但应该可以作很大的精简。因为Matlab输出这些文件,与生成的myDLL.DLL没有什么关系。这个可以作进一步的实验和研究。

mxArray数据类型介绍

Matlab有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是mxArray。

数组的建立采用mxCreatexxx形式的函数,例如新建一个double类型数组,可用函数mxCreateDoubleMatrix,函数形式如下:

mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);

参数m和n为矩阵的函数和列数。ComplexFlag为常数,用来区分矩阵中元素是实数还是复数,取值分别为mxREAL和mxCOMPLEX。

例如,创建一个3行5列的二维实数数组,可用如下语句:

mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);

对应的,要删除一个数组mxDestroyArray,该函数声明如下:

void mxDestroyArray(mxArray *array_ptr);

参数array_ptr为要删除的数组指针。

例如,要删除上面创建的数组T,可用如下语句:

mxDestroyArray(T);

类似的创建函数还有:

mxArray *mxCreateString(const char *str);

创建一个字符串类型并初始化为str字符串。

mxArray *level=mxCreateDoubleScalar();

一般的在VC与Matlab交互

你可能感兴趣的:(matlab vc)