Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 34

Создание MEX-файлов для Matlab в VS2012

14.02.2016, 11:00. Показов 3811. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Необходимо создать dll с определенным алгоритмом для Matlab. Для этого использую
mex функцию, но появляются ошибка средств компоновщика LNK2019, какие-то хедеры я не подключаю. Кто знает укажите библиотеки из matlab, которые необходимо подключить.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
     int i;
     char *str;
     int j;
     mwSize nelem;
     mxChar *x, *y;
     if (nrhs > 1) mexErrMsgTxt("Не надо так много параметров!");
     if (nlhs > 1) mexErrMsgTxt("Слева должно быть имя одной переменной, в которую запишется результат работы программы!");   
     if(!mxIsChar(prhs[0])) mexErrMsgTxt("На входе должен быть текст!");
     str = mxArrayToString(prhs[0]);     
     plhs[0] = mxCreateCharMatrixFromStrings((mwSize)nrhs, &str); 
     nelem = mxGetNumberOfElements(plhs[0]);
     x = (mxChar *)mxGetData(prhs[0]);
     y = (mxChar *)mxGetData(plhs[0]);            
     for(j=0; j < nelem; j++)
     {
         y[j] = x[j] + 1;
     }
     mxFree(str);
}
Добавлено через 17 часов 3 минуты
все еще актуально, dll создается, но стоит использовать хотя бы одну из спец.функций к примеру mexErrMsgTxt или mxArrayToString появляется ошибка.

Добавлено через 55 минут
нашел пример в библиотеке matlab, соответственно он тоже не рабочий.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*=================================================================
 * mexfunction.c 
 *
 * This example demonstrates how to use mexFunction.  It returns
 * the number of elements for each input argument, providing the 
 * function is called with the same number of output arguments
 * as input arguments.
 
 * This is a MEX-file for MATLAB.  
 * Copyright 1984-2011 The MathWorks, Inc.
 * All rights reserved.
 *=================================================================*/
#include "mex.h"
 
void
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
    int        i;
       
    /* Examine input (right-hand-side) arguments. */
    mexPrintf("\nThere are %d right-hand-side argument(s).", nrhs);
    for (i=0; i<nrhs; i++)  {
        mexPrintf("\n\tInput Arg %i is of type:\t%s ",i,mxGetClassName(prhs[i]));
    }
    
    /* Examine output (left-hand-side) arguments. */
    mexPrintf("\n\nThere are %d left-hand-side argument(s).\n", nlhs);
    if (nlhs > nrhs)
      mexErrMsgIdAndTxt( "MATLAB:mexfunction:inputOutputMismatch",
              "Cannot specify more outputs than inputs.\n");
    
    for (i=0; i<nlhs; i++)  {
        plhs[i]=mxCreateDoubleMatrix(1,1,mxREAL);
        *mxGetPr(plhs[i])=(double)mxGetNumberOfElements(prhs[i]);
    }
}
Добавлено через 23 часа 19 минут
Неужели все компилят в SDK и никто не смог настроить Visual Studio?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2016, 11:00
Ответы с готовыми решениями:

Создание dll в Matlab, для использования в C#
Здравствуйте. Необходимо создать dll в Matlab, для использования в C#. Использую deploytool. Добавляю m-функцию, нажимаю Package. Получаю...

Сохранение SQL запроса на создание таблицы в VS2012
Только начал изучать технологии ADO.NET по книге Троелсена. На данный момент нету практически никакого опыта работы с БД. Проблема возникла...

Создание dll для передачи данных из C++ в Matlab
Есть проэкт в Visual Studia 6. Программа создаёт dll файл, при помощи которого в MATLAB передаются данные с С++. Проблема в том,что по...

6
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 34
17.02.2016, 23:01  [ТС]
Задача решена,при необходимости отпишусь...
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 2
29.02.2016, 08:03
Похожая проблема, только у меня русская VS2010.

Из матлаба компиляция запускается и в случае отсутствия ошибок что-то там компилирует.
Но, если есть ошибки - они приходят в Матлаб в виде крокозябл в неизвестной кодировке. Да и если бы на русском приходили - матлаб роль отладчика с++ никак не тянет.

Так что я подключил C:\Program Files\MATLAB\R2014b\extern\include и C:\Program Files\MATLAB\R2014b\extern\lib куда положено (лучше бы $(matlabroot)\extern\include, но (matlabroot) у меня почему-то не работает), и VS что-то начала понимать, во всяком случае - ошибки теперь прочитать можно.

Однако далее всё застопорилось, т.к. нормального help по матлабским функциям на с++ я не нашёл.
0
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 34
29.02.2016, 10:29  [ТС]
Полностью согласен отладчик из матлаба никакой, даже не кракозябры напрягают, а то что чуть какая ошибка с выделением памяти например для массива и все матлаб либо виснет, либо вылетает.Задачу помучившись, то я решил, но на будущее хотелось бы нормальную студию.Не думаю что версия студии принципиальна,я запустил на VS2012,VS2013, смог скомпилировать DLL, сделал файл экспорта для функции, но матлаб не видит эту функцию...Может совместными усилиями заставим его работать? P.s Там не только каталоги нужно указать, но и библиотеки надо подключить и заголовочные файлы соответствующие + у меня компилируются только в x64 т.к матлаб x64. Если найду файл отпишусь,завтра...

Нормальный хелп с примерами,по функциям матлаба есть http://www.mathworks.com/help/... les-1.html
точнее это описание mex функции, которую matlab понимает для создания dll которая будет выполняться в matlab.

А матлабские функции на с++ это немного другая задача, можно вычислять все в VS с использованием библиотек matlabа,но это на мой взгляд извращение, времени уйдет намного больше. По этой теме есть несколько книг,то же названия могу позже дать...
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 2
29.02.2016, 11:47
Кстати, а вот и отладчик:
http://www.mathworks.com/help/... forms.html
0
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 34
29.02.2016, 21:47  [ТС]
Да отладчик пригодится, попробовал.
Если Вы разобрались как компилировать в VS напишите свой вариант, особенно интересно как запустить функцию уже в скомпилированной dll,например при скомпилированном matlab.dll, функция в матлабе должна вызываться matlab(аргумент), из dll скомпилрованных в VS у меня так и не получилось запустить функции в matlab/

Мой код, который компилируется в VS без ошибок:

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <mex.h>
#include <matrix.h>
//-----------------------
 
#pragma  comment(lib,"libmex.lib")
#pragma  comment(lib,"libmat.lib")
#pragma  comment(lib,"libmx.lib")
 
 
void mexFunction (int nOut, mxArray* pOut[],
                  int nIn, const mxArray* pIn[])
{
    //----------------------------------------------------------------------
    if (nIn > 1)
        mexErrMsgTxt ("входной параметр должен быть один");
    if (nIn == 0)
        mexErrMsgTxt ("введите  входной параметр, он должен быть ");
    if (mxIsChar (pIn[0])) mexErrMsgTxt ("На входе должен быть  не текст!");
    //---------------------------------------------------------------------
 
 
    int razmer, count_state;
    int in_1, in_2, in_3, in_4;
    int i1, i2, i3, i4;
 
    double  *pS;
 
    int h, i, j;
    double *pAS;
 
    count_state = 0;
    razmer = *mxGetPr (pIn[0]);
 
    in_1 = razmer; in_2 = in_1;
    in_3 = in_1;   in_4 = in_1;
 
    mexPrintf (" \n");
 
    for (i4 = 0; i4 <= in_4; i4++)
    {
        for (i3 = 0; i3 <= in_3; i3++)
        {
            for (i2 = 0; i2 <= in_2; i2++)
            {
                for (i1 = 0; i1 <= in_1; i1++)
                {
                    if (i3 + i4 <= razmer)
                    {
                        count_state = count_state + 1;
                        //mexPrintf("  %d \n",count_state);
                    }
                }
            }
        }
    }
 
    // создание выходной матрицы 2x2 типа double
    pOut[0] = mxCreateDoubleMatrix (count_state, 4, mxREAL);
    // получение адреса выходной матрицы
    pS = mxGetPr (pOut[0]);
    // шаг для перехода между столбцами при инициализации матрицы
    h = count_state;  i = 0;
 
    for (i4 = 0; i4 <= in_4; i4++)
    {
        for (i3 = 0; i3 <= in_3; i3++)
        {
            for (i2 = 0; i2 <= in_2; i2++)
            {
                for (i1 = 0; i1 <= in_1; i1++)
                {
                    if (i3 + i4 <= razmer)
                    {
                        // mexPrintf("  %d     %d     %d      %d \n",i1,i2,i3,i4);
                        count_state = count_state + 1;
                        pS[i + 0 * h] = i1;  pS[i + 2 * h] = i3;
                        pS[i + 1 * h] = i2;  pS[i + 3 * h] = i4;
                        i++;
                    }
                }
            }
        }
    }/**/
}//(end);


def файл для экспорта функции (может я в нем ошибаюсь,имя dll - matlab.dll, проект x64):
Кликните здесь для просмотра всего текста
C
1
2
3
   LIBRARY   "matlab"
      EXPORTS
      mexFunction



Название книжки как обещал :
http://dmkpress.com/catalog/co... 074-310-1/

Добавлено через 18 минут
Вопрос с отладчиком все еще актуален, приведенный выше способ отладки позволяет отлаживать только уже скомпилированный dll, а хотелось бы видеть ошибки при неудачной компиляции, можно конечно обойтись, но уж очень утомительно при написании большой разветленной программы.
0
0 / 0 / 0
Регистрация: 20.11.2015
Сообщений: 34
03.03.2016, 23:45  [ТС]
вопрос по настройки все еще актуален...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2016, 23:45
Помогаю со студенческими работами здесь

Создание интерфейса для уже существующей программы в MATLAB
Помогите пожалуйста,У меня есть м-файл PASSIV,внутри которого я задаю параметры,которые в дальнейшем использую для получения результата.Мне...

можно ли в Matlab создать библиотеку для С++ и использовать ее без вызова Matlab?
Возможно ли с помощью команды deploytool или какой-то другой команды создать библиотеку .dll например функции polyxpoly, чтобы в...

Подключение библиотеки SFML для VS2012
Здравствуйте форумчане. Первый раз столкнулся с процессом подключения библиотеки делал все по гайду на официальном сайте сайте. Пример...

Компиляция Qt4.8.4 из исходников для VS2012
Добрый день уважаемые гуру Qt. Вот решил собрать Qt4.8.4 но в процессе компиляции выпадает ошибка которую я не понимаю. Вот это: ...

Плагин для форматирования кода в VS2012
Здравствуйте! На днях столкнулся с первым опытом командной разработки приложения. Работает нас три человека, но есть одна проблема -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru