【问题标题】:How can I use Microsoft Visual C++ 2010 to create MEX files with MATLAB 7.10 (R2010a)?如何使用 Microsoft Visual C++ 2010 通过 MATLAB 7.10 (R2010a) 创建 MEX 文件?
【发布时间】:2014-02-05 00:40:49
【问题描述】:

以下问题:
How to set up LIBSVM Matlab interface?
Why “No compiler” on my Windows 7 when typing mex -setup in r2010a?
我遇到了链接:
How can I use Microsoft Visual C++ 2010 to create MEX files with MATLAB 7.10 (R2010a)?
页面中说补丁会支持这些组合:

• Visual C++ 2010 Professional and 64-bit MATLAB 7.10 (R2010a)

• Visual C++ 2010 Professional and 32-bit MATLAB 7.10 (R2010a)

• Visual C++ 2010 Express (Windows SDK 7.1 also required) and 64-bit MATLAB 7.10 (R2010a)

• Visual C++ 2010 Express and 32-bit MATLAB 7.10 (R2010a)

但是我的笔记本上安装了Visual C++ 2010 Ultimate。我如何知道补丁是否支持这种组合?

• Visual C++ 2010 Ultimate and 64-bit MATLAB 7.10 (R2010a)

【问题讨论】:

  • 是的,该补丁应该适用于 VS2010 的 Ultimate 版本。

标签: c++ visual-studio-2010 matlab libsvm mex


【解决方案1】:

是的,当然。

首先,您应该将 include 文件夹、libs 文件夹添加到 VS 的 include & libs 中。

其次,你通过 C++ 实现你的 mex 文件,你应该首先将 mex.h 文件包含到你的源代码中,然后必须根据 mex 的规则提供 mexFunction。如下:

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

第三,你应该将libs添加到Additional Dependencies中,例如libmx.lib,libmat.lib,libmex.lib等。

PS:当你尝试实现一个matlab mex项目时,你应该使用VS创建一个dll项目,实际上mex文件(mexw32 & mexw64)是一个特殊的dll文件。所以VS生成的文件是一个dll文件,如果你想让VS生成一个mex文件,你可以通过修改VS项目的配置项来更改文件名,或者在生成后重命名文件。

这里,我只是给你看一些代码:

#include "Rectification.h"
#include "mex.h"

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, 
             const mxArray *prhs[] )
{
    if (nrhs != 4)
    {
        mexErrMsgTxt("You need input just 4 parameters!");
    }

    int m1 = mxGetM(prhs[0]);
    int n1 = mxGetN(prhs[0]);

    int m2 = mxGetM(prhs[1]);
    int n2 = mxGetN(prhs[1]);

    int m3 = mxGetM(prhs[2]);
    int n3 = mxGetN(prhs[2]);

    int m4 = mxGetM(prhs[3]);
    int n4 = mxGetN(prhs[3]);

    double* temp1 = mxGetPr(prhs[0]);
    double* temp2 = mxGetPr(prhs[1]);
    double* temp3 = mxGetPr(prhs[2]);
    double* temp4 = mxGetPr(prhs[3]);

    CMatrix size(m1, n1, temp1);
    CMatrix inliers1(m2, n2, temp2);
    CMatrix inliers2(m3, n3, temp3);
    CMatrix fMatrix(m4, n4, temp4);

    CMatrix h1, h2;

    CalH(size, inliers1, inliers2, fMatrix, h1, h2);

    int om1 = h1.GetmRows();
    int on1 = h1.GetmCols();
    plhs[0] = mxCreateDoubleMatrix(om1, on1, mxREAL);
    double* outMat1 = mxGetPr(plhs[0]);

    for (int i = 0; i < om1*on1; i++)
    {
        *(outMat1 + i) = *(h1.GetmData() + i);
    }

    int om2 = h2.GetmRows();
    int on2 = h2.GetmCols();
    plhs[1] = mxCreateDoubleMatrix(om2, on2, mxREAL);
    double* outMat2 = mxGetPr(plhs[1]);

    for (int i = 0; i < om2*on2; i++)
    {
        *(outMat2 + i) = *(h2.GetmData() + i);
    }
}

如果你需要,我可以和你分享我的项目。

【讨论】:

  • 好吧@Berlin 我明白你说要在VS中构建mex文件,然后将它添加到我笔记本上的matlab工具箱文件夹中。如果我拥有所有 .lib、.h 和 .dll 文件但我没有它们,这是正确的。如果我有源代码,那么使用 VS 构建 .dll 和 .lib 将很容易。但问题是这是一个大学作业,我被允许只使用 libsvm 的 matlab 接口。并使用 matlab 制作 mex。我的问题正是Will the patch obtained by mathworks usable with ultimate edition of VS2010 or I am forced to use a later version of matlab?
  • 是的,我确定,我已经按照你说的做了。 mex.h的头文件和libs在$matlab dir\extern\include、$matlab dir\extern\include\win32和$matlab dir\extern\lib\win32\microsoft中。
  • @Berlin:虽然这应该按照您描述的方式工作,但在 MATLAB 内部使用 mex 命令更容易;它将构建您的 MEX 功能,而无需手动创建 VS 项目并调整路径和库。您只需至少运行一次mex -setup 即可正确选择支持的编译器。
  • 好的,现在我明白你的意思了。有两种方法可以生成 mex 文件。我之前说的就是其中之一。是的,我们也可以通过matlab命令生成mex文件,首先你应该设置编译器,如果你已经在你的PC上安装了VS 10,当你运行mex -setup时,应该可以选择一个vc 11编译器项,其次,使用mex source.c 构建mex。
  • @Belin:是的,没错。当然,支持哪些 VS 编译器取决于您的 MATLAB 版本(例如,旧的 MATLAB 版本不知道 VS2013!此外,MathWorks 在发布新版本时倾向于删除对旧编译器的支持)。顺便说一句,手动编译 MEX 文件的过程在 here 中进行了描述,无论您拥有什么版本,它都应该始终有效..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多