65.9K
CodeProject 正在变化。 阅读更多。
Home

Matlab 7.1+ 和 Visual Studio 2005

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (9投票s)

2007年7月11日

CPOL

3分钟阅读

viewsIcon

98031

downloadIcon

1464

一篇介绍如何使用 Visual Studio 2005 编译 Matlab 7.1-7.4 mexw32 文件的文章

引言

这个程序演示了如何使用 Visual Studio 2005 编译和链接新的 Matlab mexw32 文件。 Matlab 7.1 将其 mex 文件格式从 .dll 更改为 .mexw32。所有新版本,MATLAB 7.1 (R14SP3)、MATLAB 7.2 (R2006a)、MATLAB 7.3 (R2006b) 和 MATLAB 7.4 (R2007a) 编译 mexw32 文件。以前编译的 mex .dll 必须重新编译。使用 Visual Studio 2005 使这个过程变得容易。此外,很多时候需要使用来自其他 C/C++ 函数的外部头文件和库。在这些情况下,Visual Studio 比 Matlab 自己的编译器工作得更好。 Mex 文件允许创建非常强大的 Matlab 函数,并且能够使用 .m Matlab 脚本文件的所有功能。

背景

我最初为什么学习这个? 我需要从 Matlab 控制激光陀螺仪。 我有从命令提示符控制激光的 C 函数,所以我需要在 Matlab mexw32 文件中实现 C 代码。 我不仅需要添加 mex 文件的库和头文件来进行编译,还需要添加激光库。 我的示例代码包含对激光设备的函数调用,但它们被注释掉了,因为如果没有正确的库,它们将无法编译。 您可以为自己的特定函数调用,使用我的代码。 - A. Bryant Nichols Jr.

Using the Code

您可以打开我的解决方案文件,并修改属性以链接到您的 matlab 目录,或者按照以下步骤操作: 

  1. 创建一个新的 C++ Win32 控制台应用程序。
  2. 从 MATLAB 包含目录 matlab\extern\includemexversion.rc 添加到项目中。
  3. 使用以下文本创建一个 .def 文件,并将其添加到解决方案中。
    注意:将 myFileName 更改为您的文件名。
    LIBRARY myFileName
    EXPORTS mexFunction
  4. 在 C/C++ 常规附加包含目录中,添加 matlab\extern\include
  5. 在 C/C++ 预处理器属性中,将 MATLAB_MEX_FILE 添加为预处理器定义。 
  6. 在 Linker General Output File(链接器常规输出文件)中,更改为 .mexw32 
  7. 在 Linker General Additional Library Directories(链接器常规附加库目录)中,添加 matlab\extern\lib\win32\microsoft
  8. 在 Linker Input Additional Dependencies(链接器输入附加依赖项)中,添加 libmx.liblibmex.liblibmat.lib 作为附加依赖项。
  9. 在 Linker Input Module Definition File(链接器输入模块定义文件)中,添加您创建的 (.def) 文件。 
  10. 在 General Configuration Type(常规配置类型)中,选择 .dll
  11. 添加更多指向您程序所需的包含和库的链接。 在我的例子中,我还添加了激光陀螺仪的 \include\lib 依赖项。

代码

Matlab 所需的头文件。 注意:包含您自己的头文件以获得更具体的函数。

#include "stdafx.h"
#include "Windows.h"
#include "mex.h"
#include "matrix.h"
//#include "AerSys.h"

这是我自己的函数,用于控制激光。

void StartDevice();

这是 mex 文件的主要入口点。 nlhs 是输出的数量,*plhs 是输出指针,rlhs 是输入的数量,*prhs 是输入指针。

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

从输入读取的第一个变量是 iCase ,它用于 case 语句。 有关所有可能的输入/输出选项,请参阅 Sample(示例)部分。

if (nrhs>0)
{
    data1 = mxGetPr(prhs[0]);
    iCase = (int)data1[0];
}
if (nrhs>1)
{
    data1 = mxGetPr(prhs[1]);
    dist1 = data1[0];
    if (iCase==4)
    {
        char buf[128];
        mwSize buflen;
        // Allocate enough memory to hold the converted string.
        buflen = mxGetNumberOfElements(prhs[1]) + 1;        
        mxGetString(prhs[1], buf, buflen);
        sprintf_s(szProgram,buf);
    }
}
if (nrhs>2)
{
    data1 = mxGetPr(prhs[2]);
    dist2 = data1[0];
}
StartDevice();
if (iCase==3)
{
    if (nlhs>=2)
    {
        plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
        plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL);
        data1 = mxGetPr(plhs[0]);
        data1[0] = dXPos/AZCOUNTS;
        data1 = mxGetPr(plhs[1]);
        data1[0] = dYPos/ELCOUNTS;
    }
}
return;

这是对我的函数的调用,但是如果没有正确的激光设备库,它将无法编译。

void StartDevice()

示例 Matlab 命令

这些是可以在 Matlab 中用于运行激光的可选命令。 注意:即使文件名是 MatlabVS.m,如果有人在 Matlab 命令提示符下键入 MatlabVS(1);,则 MatlabVS.mexw32 文件将获得优先级并被运行。 这是一种注释您的 mexw32 文件的好方法,以便用户可以理解其用法格式。

% function MatlabVS(option, var1, var2)
%     
% 0) To Reset...
%     MatlabVS(0);
% 
% 1) To Initialize...
%     MatlabVS(1);  
%
% 2) To Absolute Move...
%     MatlabVS(2,Xdist,Ydist);
%
% 3) To Return Positions
%     [AZ,EL]=MatlabVS(3);
%
% 4) To Run GCode...
%     MatlabVS(4,FileName);
%     e.g. MatlabVS(4,'Aero.pgm'); 
%     
% 5) To Increment Move...
%    MatlabVS(5,Xdist,Ydist);
%
% 6) To Home...
%    MatlabVS(6);

关注点

Matlab 是一个用于数组和矩阵计算、绘图、分析等的绝佳工具。 在 Matlab mexw32 文件中使用 C/C++ 还可以从外部 C 控制的设备获取实时数据,并在 Matlab 中立即进行分析。 使用 Matlab 7.1+ 和 Visual Studio 2005,天空才是极限!

历史

  • 版本 1.1
© . All rights reserved.