Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование MatLab в проектах на С/C++, Статья 
:(
    Опции темы
smoke_man
Дата 6.9.2009, 20:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 1
Всего: 17



Создание функций MatLab  в виде разделяемой библиотеки dll


Для начала необходимо настроить компилятор среды Matlab. Это можно сделать либо из cmd, либо из самой среды командой mbuild  –setup .  При ее выполнении появится строка:

Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers [y]/n?

При подтверждении появится список установленных в системе компиляторов, поддерживаемых средой MatLab. Если выберете n , то появится список всех поддерживаемых компиляторов данной версии программы. Стоит отметить, что чем выше версия Matlab – тем больше поддерживаемых компиляторов. 

Select a compiler: 
[1] Borland C++Builder version 6.0 in C:\Program Files\Borland 
[2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc 
[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio 
[0] None

Выбираем компилятор, который будет использоваться, и подтверждаем свой выбор.  Я использую 3-ий.
Следующий шаг написание m-файла.

Пример 1 – Создание функции без параметров. 

Создадим  m-функцию с названием dataplotdll .m , содержащей:
Код


function dataplotdll()
%открываем файл для чтения
fid = fopen('C:\dlldata.txt', 'r');
%Читаем 200 значений
[s] = fscanf(fid, '%f ', [1, 200]);
%строим график
plot(s);
grid
xlabel('Time');
title('Testing DLL Program for Plotting a Response');
ylabel('Response');



Данная функция выполняет  чтение данных из текстового файла и выводит  их в виде графика.В среде MatLab указываем директорию, содержащую данный файл. Для этого можно воспользоваться  полем Current Directory.
Далее компилируем m-функцию  следующей командой:

mcc -B sgl -t -W libhg:dataplotlib -T link:lib dataplotdll.m

При компиляции использовались следующие опции компилятора:
  • -B sgl  указывает на необходимость использования графики
  • -t  - указывает на трансляцию из m-кода в C/C++ код
  • -W libhg:dataplotlib – создает обертки функций
  • -T link:lib dataplotdll.m  - указывает тип создаваемого объекта. В нашем случае это будет библиотека.

Полное описание ключей компилятора  Matlab можно получить командой  mcc -?

       Создаем  пустой консольный проект.  Я использую для этого VS2008, в других студиях следующие действия делаются по аналогии. Стоит отметить, что при использовании Builder могут возникнуть проблемы с использованием заголовочных файлов MatLab  , так как  строки в этих файлов  имеют большую длину.  Чтобы исключить эту проблему,    необходимо воспользоваться текстовым редактором, поддерживающим длинные строки, и разбить их для уменьшения длины.
      В папку с проектом консоли необходимо скопировать следующие файлы из директории MATLABверсия\extern\include\:
libmatlb.h; libmatlbm.h; libsgl.h ; matrix.h; mex.h; mwutil.h; tmwtypes.h,
а так же скопировать из папки с m-файлом:
dataplotlib.dll; dataplotlib.lib; dataplotlib.h

Все h-файлы необходимо подключить  к проекту.Создаем main.cpp и подключаем к проекту.
В main.cpp пишем текст программы:
Код

#pragma comment(lib,"dataplotlib.lib")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dataplotlib.h"
double data_array[200];
#define PI 3.14159
FILE* fp;
int main()
{
    int i;
    //Пишем в файл результат вычисления функции
    fp = fopen("c:\\dlldata.txt", "w");
    for ( i = 0; i < 200; i ++)
    {
        data_array[i] = 10 * sin(( 2 * PI/200) * i );
        fprintf( fp, " %f ", data_array[i]);
    }
    fclose( fp);
    // Следующая функция вызывается для инициализации dataplotdll. 
    dataplotlibInitialize();
    //Вызываем m-функцию    
    mlfDataplotdll();
    //Завершаем работу с библиотекой
    dataplotlibTerminate();
    return EXIT_SUCCESS;
}


После компиляции проекта скопируйте dataplotlib.dll, а так же файлы FigureMenuBar.fig и FigureToolBar.fig(необходимы для отображения меню и интструментов работы с графиком)  в директорию с получившимся exe-файлом.

Пример 2. Создание функции с параметрами.

Изменим предыдущий пример следующим образом:
Код


function dataplotdll (x,str)
plot(x);
grid
xlabel('Time');
title(str);
ylabel('Response');


То есть в функцию передаем координаты точек и название графика.
Компилируем m-файл как в примере 1:
mcc -B sgl -t -W libhg:dataplotlib -T link:lib dataplotdll.m
Создаем новый пустой  консольный проект. Копируем в директорию с проектом консоли  файлы из MATLABверсия\extern\include\:
libmatlb.h; libmatlbm.h; libsgl.h ; matrix.h ; mex.h; mwutil.h; tmwtypes.h,
библиотеки libmatlb.lib и libmx.lib  из \MATLABверсия\extern\lib\win32\ваш компилятор\, а так же из папки с m-файлом:
dataplotlib.dll ; dataplotlib.lib; dataplotlib.h
Все h-файлы подключаем к проекту. Создаем main.cpp следующего содержания:
Код

#pragma  comment(lib,"libmatlb.lib")
#pragma  comment(lib,"libmx.lib")
#pragma comment(lib,"dataplotlib.lib")
#include <cstring>
#include "dataplotlib.h"


int main()
{
    //Объявляем переменные для работы
    mxArray *x = NULL;
    mxArray *title = NULL;
    
    double arrays[4] = {0,1.25,2,10};
            //Создаем строку
    title = mxCreateString("example");
    //Создаем матрицу 1 на 4
    x = mxCreateDoubleMatrix(1,4,mxREAL);
    //Копируем данные
    memcpy( mxGetPr(x), &arrays[0], 4*sizeof(double));
    //Инициализируем библиотеку
    dataplotlibInitialize();
    //Вызываем функцию
    mlfDataplotdll(x,title);
    //Завершаем работу библиотеки
    dataplotlibTerminate();
    //Освобождаем память
    mxDestroyArray(title);
    mxDestroyArray(x);

    return EXIT_SUCCESS;
}

После компиляции проекта скопируйте dataplotlib.dll, а так же файлы FigureMenuBar.fig и FigureToolBar.fig  в директорию с получившимся exe-файлом.

Пример 3 Создание функции возвращающей значение


Изменим предыдущий пример следующим образом:
Код


function y = dataplotdll(x)
y = x*2;




Компилируем m-файл как в примере 2, но без ключа -B, так как графика здесь не нужна:
mcc  -t -W libhg:dataplotlib -T link:lib dataplotdll.m
Создаем новый пустой  консольный проект. Копируем в директорию с проектом консоли  файлы из MATLABверсия\extern\include\:
libmatlb.h; libmatlbm.h; libsgl.h ; matrix.h ; mex.h; mwutil.h; tmwtypes.h,
библиотеки libmatlb.lib и libmx.lib  из \MATLABверсия\extern\lib\win32\ваш компилятор\, а так же из папки с m-файлом:
dataplotlib.dll ; dataplotlib.lib; dataplotlib.h
Все h-файлы подключаем к проекту. Создаем main.cpp следующего содержания:

Код


#pragma  comment(lib,"libmatlb.lib")
#pragma  comment(lib,"libmx.lib")
#pragma comment(lib,"dataplotlib.lib")
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "dataplotlib.h"


int main()
{
    //Объявляем переменные для работы
    mxArray *x = NULL;
    mxArray *y = NULL;
    
    double arrays[4] = {1,2,3,4};
    int count;
    double *result;
    //Создаем матрицу 1 на 4
    x = mxCreateDoubleMatrix(1,4,mxREAL);
    //Копируем данные
    memcpy( mxGetPr(x), &arrays[0], 4*sizeof(double));
    //Инициализируем библиотеку
    dataplotlibInitialize();
    //Вызываем функцию
    y = mlfDataplotdll(x);
    //Считываем количество значений
    //mxGetM вернет 1, так матрица 1 на 4
    count = mxGetN(y);
    result = new double[count];
    //Копируем данные
    memcpy( result, mxGetPr(y), count*sizeof(double));
    //Завершаем работу библиотеки
    dataplotlibTerminate();
    
    for(int i = 0; i < count; i++)
        std::cout << result[i]<<std::endl;
    //Освобождаем память
    mxDestroyArray(y);
    mxDestroyArray(x);
    
    delete [] result;

    system("PAUSE");
    return EXIT_SUCCESS;
}


Надеюсь данные примеры помогут в  освоении использования Matlab в своих проектах.
Статья написана с использованием материалов книги Джифенга Ксу "Взаимодействие  Matlab с ANSI C,  Visual C++, Visual  BASIC и Java".


Присоединённый файл ( Кол-во скачиваний: 76 )
Присоединённый файл  Source.rar 869,86 Kb


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
kowara
Дата 17.6.2010, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.6.2010

Репутация: нет
Всего: нет



Вроде делаю всё верно, а выходит ошибка !!! в dataplotlib.h:
 

fatal error C1083: Не удается открыть файл include: mclmcr.h: No such file or directory

Кроме подключения файл dataplotlib.h в коде, надо ещё что-то где-то добавлять!!???

Очень прошу помощи...

 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1154 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.