Как я могу использовать Microsoft Visual C++ 2010 для создания файлов MEX с помощью MATLAB 7.10 (R2010a)?

следуя вопросам:
Как настроить интерфейс LIBSVM Matlab?
Почему “ Нет компилятора» в моей Windows 7 при вводе mex -setup в r2010a?
Я наткнулся на ссылку:
Как я могу использовать Microsoft Visual C++ 2010 для создания файлов MEX с помощью 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)

person Sepideh Abadpour    schedule 16.01.2014    source источник
comment
да, патч должен работать с Ultimate версией VS2010.   -  person Amro    schedule 16.01.2014


Ответы (1)


Да, конечно.

Во-первых, вы должны добавить папку include, папку libs в VS include & libs.

Во-вторых, вы реализуете свой mex-файл через C++, вы должны сначала включить файл mex.h в свой исходный код, а затем mexFunction должна быть предоставлена ​​​​в соответствии с правилом mex. Следующим образом:

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

В-третьих, вы должны добавить библиотеки в Дополнительные зависимости, например, libmx.lib, libmat.lib, libmex.lib и т. д..

PS: Когда вы пытались реализовать проект matlab mex, вы должны создать проект dll с помощью VS, на самом деле файл 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);
    }
}

Если вам нужно, я могу поделиться своим проектом с вами.

person Berlin    schedule 16.01.2014
comment
хорошо, @Berlin, я понял, что вы говорите создать mex-файл в VS, а затем добавить его в папку набора инструментов Matlab на моем ноутбуке. Это правильно, если у меня есть все файлы .lib, .h и .dll, но у меня их нет. Если у меня есть исходный код, будет легко создавать .dll и .libs с помощью VS. Но проблема в том, что это домашнее задание в университете, и мне разрешено просто использовать интерфейс Matlab libsvm. И сделать мекс с помощью матлаба. Мой вопрос был точно Will the patch obtained by mathworks usable with ultimate edition of VS2010 or I am forced to use a later version of matlab? - person Sepideh Abadpour; 16.01.2014
comment
Да, я уверен, я сделал это, как вы сказали. Заголовочный файл mex.h и библиотеки находятся в каталогах $matlab dir\extern\include, $matlab dir\extern\include\win32 и $matlab dir\extern\lib\win32\microsoft. - person Berlin; 16.01.2014
comment
@Berlin: хотя это должно работать так, как вы описали, проще использовать mex команда из MATLAB; он создаст ваши MEX-функции без необходимости вручную создавать проекты VS и настраивать пути и библиотеки. Все, что вам нужно, это запустить mex -setup хотя бы один раз, чтобы правильно выбрать поддерживаемый компилятор. - person Amro; 16.01.2014
comment
Хорошо, теперь я понимаю, что вы имеете в виду. Существует два метода создания файла MEX. То, что я сказал ранее, является одним из них. Да, мы также можем сгенерировать mex-файл с помощью команды Matlab, во-первых, вы должны настроить компилятор, если вы установили VS 10 на свой компьютер, когда вы запускаете mex -setup, должен быть выбран элемент компилятора vc 11, а во-вторых , используйте mex source.c для сборки mex. - person Berlin; 17.01.2014
comment
@Белин: да, это правильно. Конечно, это зависит от вашей версии MATLAB в отношении того, какие компиляторы VS поддерживаются (например, более старые версии MATLAB не знали о VS2013! Кроме того, MathWorks, как правило, удаляет поддержку старых компиляторов по мере выпуска новых версий). Кстати, процесс ручной компиляции MEX-файлов описан здесь, который должен работать всегда, независимо от того, какая у вас версия. - person Amro; 17.01.2014