Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Использование MatLab в проектах на С/C++


Автор: smoke_man 6.9.2009, 20: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".

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

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

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

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

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)