УДК 004.4422 Нгуен Зуи Тхаи,
аспирант кафедры технологии машиностроения, Иркутский государственный технический университет, тел. +79246256668, e-mail: [email protected]
Сосинская Софья Семеновна, к. т. н., доцент кафедры технологии машиностроения, Иркутский государственный технический университет, тел. +79149153062, e-mail: [email protected]
ТЕХНОЛОГИЯ СОЗДАНИЯ ПРИЛОЖЕНИЙ НА ЯЗЫКЕ С++, ИСПОЛЬЗУЮЩИХ БИБЛИОТЕКУ ФУНКЦИЙ MATLAB
Nguyen Duy Thai, S.S. Sosinskaya
THE TECHNOLOGY OF CREATING APPLICATIONS ON C++ USING MATLAB LIBRARY OF FUNCTIONS
Аннотация. Рассматривается технология создания библиотеки функций, реализованной в ходе разработки программы лабораторного практикума в системе MATLAB для использования в Microsoft Visual C++. Библиотека содержит ряд функций численного анализа, пригодных для решения различных задач, и создается с помощью компилятора MATLAB. Подробно описан процесс создания библиотеки, тип данных mwArray. В качестве иллюстрации использования созданной библиотеки приводятся этапы создания лабораторного практикума по численным методам как приложения в системе Microsoft Visual C++.
Ключевые слова: компилятор MATLAB, компилятор C++, Microsoft Visual C, библиотека функций, лабораторный практикум, численные методы.
Abstract. The technology of creating library of functions implemented in the course of laboratorial practical work development in MATLAB for using in Microsoft Visual C++ is considered. The library contents a number of functions for solving different tasks and is created by the MATLAB Compiler. Process of creating library and mwArray data type are described in details. Stages of creating laboratorial practical work like application in Microsoft Visual C++ are presented.
Keywords: MATLAB Compiler, C++ Compiler, Microsoft Visual C, library of functions, laboratorial practical work, numerical methods.
Введение и постановка задачи
В практике программирования во многих случаях возникает необходимость решить сложную математическкую задачу. При решении этой задачи часто выбираются какие-нибудь математические пакеты, например пакеты Mathematica, Maple и MATLAB. Основными областями применения MATLAB являются математические расче-
ты, моделирование, анализ данных и визуализация, научная и инженерная графика, разработка приложений, включая графический интерфейс пользователя.
Несмотря на мощный технический язык, система MATLAB имеет некоторые недостатки [7, 8]: во-первых, язык MATLAB является интерпретируемым языком сценариев, то есть не создается машинный код, поэтому программа, написанная на языке MATLAB, может быть запущена только на платформе MATLAB, так как не имеет межплатформенных возможностей; во-вторых, m-файл, подготавливаемый MATLAB, представляет собой текстовый файл, который можно легко прочитать, что говорит о плохой защищенности алгоритмов.
С другой стороны, на данный момент Visual Studio является самым популярным средством разработки приложений на платформе Windows. Система Visual Studio использует не только высокую эффективность языка С++, но и дружественный интерфейс, удобство визуального программирования. Переход на C++ Visual Studio требует разработки и отладки программ выполнения матричных операций, численного анализа и инженерных расчетов.
Было бы заманчиво объединить широкую гамму возможностей, предоставляемых современными визуальными средствами создания приложений на языке C/C++, с мощными математическими библиотеками, которые можно сформировать из функций систем MATLAB. Использование эффективного математического кода MATLAB совместно с возможностями визуальных сред разработки приложений позволило бы программисту-математику решать широкий круг прикладных задач [6]. Рассматриваемая технология позволяет сократить время исполнения программы и время разработки программы [9].
В статье рассмотрена технология создания
Информатика, вычислительная техника и управление. Моделирование. Приборостроение. Метрология. Информационно-измерительные приборы и системы
ш
визуальных приложений С++ с библиотекой функций, полученной с помощью компилятора MATLAB. Созданная библиотека содержит ряд функций численного анализа: решения нелинейных уравнений; решения систем линейных алгебраических уравнений; интерполирования табличной функции полиномом; аппроксимации функции; решения дифференциальных уравнений; численного интегрирования и численной оптимизации функции.
Использование созданной библиотеки иллюстрируется применением ее для решения задач лабораторного практикума [10], ориентированных на использование методов решения систем линейных уравнений, интерполирования табличной функции полиномами, численного интегрирования и других задач.
Созданная библиотека может в дальнейшем использоваться во многих задачах, требующих применения тех же методов. При этом не исследовался вопрос решения задач с большими объемами исходных данных, так как основное внимание уделялось удобному способу ознакомления студентов с численными методами.
Компилятор MATLAB
Компилятор MATLAB используется для преобразования программ MATLAB в приложения и библиотеки, которые могут работать независимо от самой системы. Можно компилировать m-файлы, MEX-файлы. Компилятор MATLAB поддерживает все особенности системы, включая объекты и функции, и используется для создания автономных C/C++ приложений на различных платформах (Windows, Unix и Macintosh) и динамически подключаемых библиотек, или dll на Windows.
Пакет MATLAB®Builder для .NET есть расширение пакета MATLAB®Compiler. Он используется для преобразования функций MATLAB в один или более классов .NET, которые составляют компонент .NET, или пакет. Каждая функция MATLAB преобразуется в метод некоторого класса и может быть вызвана из приложения .NET. Приложения, использующие методы, созданные при помощи .NET Builder, при своей работе не требуют установленной системы MATLAB. Однако должна быть установлена MCR - среда исполнения для компонентов MATLAB® (MATLAB Component Runtime).
На рис. 1 показаны возможности пакета MATLAB Compiler и его расширений для создания соответствующих компонентов.
Рис. 1. Возможности пакета MATLAB Compiler и его расширений
Инсталляция и конфигурирование MATLAB Compiler
Компилятор MATLAB устанавливается вместе с MATLAB. Для этого следует выбрать установку компоненты MATLAB Compiler. Для работы компилятора MATLAB требуется, чтобы в системе был установлен внешний компилятор ANSI C или C++, поддерживаемый MATLAB. Для MATLAB R2010b (версия 7.14) можно использовать один из следующих 32-разрядных компиляторов C/C++:
• Lcc C, версия 2.4.1 (включен в MATLAB), это компилятор С, но не С++;
• Microsoft Visual C++ (MSVC).
Среда выполнения компоненты MATLAB, библиотека MCR
Эта среда, называемая MCR (MATLAB Component Runtime), содержит автономный набор общедоступных библиотек MATLAB и все необходимое для работы созданного компилятором приложения или компонента. Среда MCR обеспечивает полную поддержку всех особенностей языка MATLAB.
Создание библиотеки совместного использования
Библиотекой совместного использования называется динамически компонуемая библиотека (Dynamic Link Library). Обычно эта библиотека представляет собой фрагмент кода, хранимый в файле с расширением dll. Код может быть использован другими программами, но сама по себе библиотека программой не является.
При создании библиотеки DLL компилятором MATLAB создается сама DLL и остальные файлы: файл обертки, заголовочный файл, файл библиотеки импорта и список экспорта.
Для создания библиотеки можно использовать среду разработки Deployment Tool или исполнить команды mcc, mbuild. Среда разработки Deployment Tool позволяет легко создавать необ-
ходимые компоненты MATLAB. Однако иногда нужны более широкие возможности управления процессом построения автономных приложений и библиотек. В этом случае можно использовать две утилиты, mcc и mbuild, с их опциями. Ниже на рис. 2 показана процедура создания библиотеки «matlablib» с помощью среды разработки Deployment Tool. Библиотека «matlablib» содержит разные функции, определенные в m-файлах и используемые в компилируемой программе. Перечислим некоторые функции:
• [x, fx, i]=fseq_solve_equation_iteration(f, a, b, x0, eps) - функция, позволяющая решать нелинейные уравнения методом простой итерации;
• [x,dx]=fseq_sys_equations_gauss(A,B) -функция, позволяющая решать системы линейных уравнений;
• [yy, c]=fseq_interpolation_spline(x, y, xx) -функция, позволяющая вычислять коэффициенты кубического сплайна и его значения в заданных точках интерполирования;
• [apha,beta,msum,devl]=fseq_approximation_f ormula1(x,y) - функция, позволяющая вычислять коэффициенты аппроксимированной функции по первой эмпирической формуле;
• s=fseq_integral_monte_karla(f,a,b,n) - функция, позволяющая вычислять численное интегрирование по формуле Монте-Карло;
• [x,y,dy]=fseq_solve_diff_equations_runge_ku to(f,a,b,fa,m) - функция, позволяющая решать обыкновенные дифференциальные уравнения методом Рунге - Кутты;
• [x,y]=fseq_optimization_divide2(f,a,b,eps) -функция, позволяющая искать минимальную точку функции в определенном интервале методом половинного деления;
• myfplot(func,a,b) - функция, позволяющая рисовать график функции на отрезке (a, b), и т. д.
В результате работы компилятора создаются следующие файлы:
• matlablib.cpp (C++ файл библиотечной обертки),
• matlablib.dll (файл общедоступной библиотеки),
• matlablib.exp, maüablib.exports (файлы экспорта, содержат список экспортируемых функций библиотеки),
• matlablib.h (заголовочный файл обертки библиотеки, содержит объявления функций создаваемой библиотеки и функций инициализации среды MCR),
• matlablib.lib (библиотека импорта, содержит описание функций библиотеки dll; этот файл позволяет компоновщику связать вызовы в приложении с адресами в DLL).
Создание автономного приложения C++
Для иллюстрации использования созданной библиотеки было создано автономное приложение С++ в среде Visual Studio 2008 [4, 5], которое имеет возможности лабораторного практикума, разработанного ранее в среде MATLAB [10]. При этом создается проект «mymatlab» (рис. 3). В форме приложения «Form1.h» размещены нужные компоненты. Для использования в приложении общедоступной библиотеки, созданной компилятором MATLAB, файл «mymatlab.cpp» должен иметь следующую структуру [2]:
• объявление переменных;
• вызов функции mclInitializeApplication, инициализирующей среду исполнения MCR MATLAB для работы приложения;
• вызов функции matlablibInitialize() инициализации каждой общедоступной библиотеки, созданной компилятором MATLAB, которая включается в приложение;
• вызов экспортируемых функций библиотеки при необходимости;
• вызов mclWaitForFiguresToDie(NULL) для отображения рисунка в окне MATLAB;
• вызов функции matlablibTerminate() завершения библиотеки, когда приложение больше не нуждается в ней;
• вызов функции mclTerminateAppHcationO, когда приложение больше не должно вызывать никаких библиотек;
• освобождение переменных, закрытие файлов, выход.
Рис. 2. Создание библиотеки средой разработки Deployment Tool
Информатика, вычислительная техника и управление. Моделирование. Приборостроение. Метрология. Информационно-измерительные приборы и системы
m
Solution Explorer - mymatlab
GH.J> *
è
_Solution 'mymatlab' (1 project)
é 3JGSSE3
1Header Files (=)••• ¿S Forml.h
^ Forml.resX h°) matlablib.h h*| resource.h stdafx.H IliSi Resource Files Hil app.ico eâ app.rc L^ Source Files
c**| Assemblylnfo.cpp
mymatlab.cpp «>f| stdafx.cpp matlablib.dll |gi matlablib.lib ReadMe.txt
B-
B-
Рис. 3. Проект «mymatlab»
Тип данных mwArray
Для того, чтобы использовать в С++ методы, созданные компилятором, в MATLAB разработаны специальные классы для С++:
• mwArray - используется для передачи параметров ввода/вывода к С++ интерфейсным функциям, созданным компилятором MATLAB;
• mwString - класс строк, используемый mwArray API (MATLAB Application Program Interface) для вывода строковых данных.
Объекты mwArray являются аналогами массивов MATLAB в С++. Класс mwArray обеспечивает необходимые конструкторы, методы и операторы для создания массива и его инициализации, а также для простой индексации. Класс mwArray определен в файле mclcppclass.h.
Подробное описание каждого конструктора, метода, оператора типа данных mwArray, а также процедур преобразования значений между данными типа С++ double и mwArray показано в [1, 2, 3]. В конкретном приложении нужно преобразовать данные типа string в mwArray. При этом используется функция PtrToStringChars(), находящаяся в файле Vcclr.h.
Настройки проекта
Перед запуском приложения необходимо настроить свойства конфигурации в свойстве страниц проекта. При этом необходимо выполнить следующие изменения:
• Выбор проекта mymatlab —> Properties —> Configuration Properties —> General —> Common Language Runtime support: Замена поддержки общеязыковой исполняющей среды (Common Language Runtime support) из «Pure MSIL Common Lanaguage Runtime Support (/clr:pure)» на «Common Lanaguage Runtime Support (/clr)»;
• Выбор проекта mymatlab —> Properties —> Configuration Properties —> Linker —> General —> Additional Library Directories: Добавление каталогов «C:\Program Files\MATLAB\R2010b\extern\lib\ win32\microsoft» и «E:\Compiler\mymatlab\ mymatlab» (каталог, в котором сохраняется библиотека совместного использования);
• Выбор проекта mymatlab —> Properties —> Configuration Properties —> Linker —> Input —> Additional Dependencies: Добавление библиотек: mclmcrrt.lib и matlablib.lib;
• Выбор проекта mymatlab —>Properties —> Configuration Properties —> C/C++ —>General — >Additional Include Directories: Добавление каталогов: « C:\Program Files\ \ext rn\include» и «E:\ Com-piler\mymatlab\mymatlab»;
• Выбор проекта mymatlab —> Properties —> Configuration Properties —> C/C++ —> Code Generation —> Runtime Library: Выбор «Multi-threaded Debug DLL (/MDd)»;
После выполнения вышеуказанных изменений можно приступать к разработке и выполнению приложения.
Интерфейсы лабораторного практикума
Для создания приложения нужно только поместить на формы все визуальные компоненты, с помощью которых осуществляются ввод данных и вывод результатов. Важно, чтобы вводимые данные были преобразованы в тип данных mwArray или mwString с помощью команды SetData(). На рис. 4-6 показаны интерфейсы лабораторного практикума на языке C++.
Рис. 4. Интерфейс «Решение систем линейных уравнений»
Рис. 5. Интерфейс «Численное интегрирование»
Рис. 6. Интерфейс «Интерполирование функций»
Как показано на рис. 5 и 6, в результате решения задач также изображены графики функций. При этом в ходе выполнения программы вызываются графические окна MATLAB.
Заключение
Использование библиотеки, созданной компилятором MATLAB, является удобной технологией для разработки визуальных приложений С++. Эта библиотека может применяться при разработке других приложений, в которых используются функции, включенные в ее состав. Кроме того, рассматриваемая технология позволяет расширять библиотеку, добавляя в неё новые функции путем
повторной компиляции. Единственное замеченное ограничение - данные перед использованием в скомпилированных функциях должны быть преобразованы в тип mwArray.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. MATLAB Compiler User's Guide. Sixth printing. Revised for Version 3.0 (Release 13). 2002. 274 с.
2. Н. К. Смоленцев. Создание windows-приложений с использованием математических процедур MATLAB. М. : ДМК-Пресс, 2008. 456 с.
3. М. Л. Подкур, П. Н. Подкур, Смоленцев Н. К. Программирование в среде Borland C++ Builder с математическими библиотеками MATLAB C/C++. М. : ДМК-Пресс, 2006. 496 с.
4. Пахомов. Б. И. C/C++ и MS Visual C++ 2008 для начинающих. СПб.: БХВ-Петербург, 2009. 624 с.
5. Пауэрс Л. Microsoft Visual Studio 2008 : пер.с англ. СПб. : БХВ-Петербург. 2009, 1200 с.
6. П. Н. Палухин, В. В. Поддубный. Технология использования MATLAB программ в средах визуального программирования С\С++ // Вестн. Томс. гос. ун-та, 2003. № 280. С. 309-318.
7. Zhang Liang, Wang Jian-yang, etc. Mixed Programming for MATLAB with C/C++, post & telecom press. 2008. Nov. Р. 7-8.
8. Luhe Hong, Jianli Cai. The application guide of mixed programming between MATLAB and other programming languages. Р 185-189.
9. Zhang Bao Li, Chen Juan, etc. The mix program trend between VC and MATLAB in view of different MATLAB version. Journal of Changchun University of Technology (Natural Science Edition), April 2008, vol. 29, No. 2, Р. 174-177.
10.Нгуен Зуи Тхаи. Разработка лабораторного практикума по численным методам в системе MATLAB // Научная инициатива иностранных студентов и аспирантов российских вузов : IV Всерос. науч.-практ. конф. Томск, 2011. С. 153156.