| Категории раздела | | Программирование [2070] Статьи по программированию по C, C++, Delphi, FoxPro, Assmbler и т.д. Инструкция по Visual Studio .NET. |
|
|
В категории материалов: 2070 Показано материалов: 1-10 |
Страницы: 1 2 3 ... 206 207 » |
Сортировать по: Дате↑ · Названию · Рейтингу · Комментариям · Просмотрам
Программирование на языке С для пакета MATLAB Глава 12. Программирование МЕХ-функций системы MATLAB на языке С 12.1. Интерфейс МЕХ-функций с системой MATLAB Когда стоящую перед нами задачу не удается решить с помощью функций, встроенных в систему MATLAB, приходится разрабатывать собственные функции. Разработка ведется на некотором языке программирования. До сих пор нами разрабатывались функции на М-языке -внутреннем языке программирования пакета MATLAB. Код М-функций, как известно, сохраняется в текстовых файлах, имеющих расширением букву m. Именно в таком состоянии эти функции готовы к применению: система MATLAB загружает их в память, преобразует в некоторый промежуточный псевдокод (Р-код), который уже и выполняется далее в режиме интерпретации, когда каждая синтаксически законченная конструкция Р-кода заменяется на соответствующий набор машинных инструкций. У М-языка имеется масса достоинств. Это наглядный и простой язык высокого уровня (очень далекий от машинного языка), похожий во многих отношениях на самый распространенный в мире язык программирования BASIC. Работа с М-функциями в интерпретируемом режиме (без промежуточной стадии полной компиляции в машинный код) создает быстро реализуемую цепочку "разработка-запуск-отладка (исправление ошибок) - новый запуск" и так далее. М-язык сверхкомпактен по отношению к массивам и операциям над ними: все математические функции работают с массивами так же легко, как и со скалярными величинами. И, наконец, богатейший набор встроенных математических и графических функций завершает перечисление чрезвычайно привлекательных особенностей внутреннего языка пакета MATLAB. И тем не менее у любого языка программирования всегда имеются недостатки, являющиеся продолжением его достоинств. Высокоуровневый характер М-языка не позволяет реализовывать алгоритмы работы со сверхсложными структурами данных (деревья и ветвящиеся списки). Интерпретируемый характер этого языка, способствующий быстроте разработки, препятствует увеличению быстродействия во время выполнения и так далее. Кроме того, как быть, если некоторая функция уже разработана на другом языке программирования? Переработка на М-язык может оказаться весьма трудоемкой (если вообще возможной), особенно если нет поддержки со стороны оригинальных разработчиков. Ясно, что любой математический пакет имел бы существенно большую область применимости, если бы он предоставлял возможность вести комплексные разработки, когда разные части прикладной пользовательской программы разрабатываются на разных языках программирования с помощью различных инструментальных средств. Именно таковым и является пакет MATLAB! Oн позволяет разрабатывать отдельные функции на популярнейших компилируемых языках программирования С, C++ и Фортран. Последняя версия пакета MATLAB б добавила к этому списку язык Java. Тем самым уже накопленный фонд программ на этих языках может быть легко подключен к текущему проекту, в котором лишь часть функций должна программироваться на М-языке. В данном учебном пособии мы будем рассматривать разработку функций только на языке С, предоставив читателю возможность самостоятельно изучить по встроенной системе помощи аналогичные вопросы, касающиеся Фортрана. Ситуация же с языком C++ практически не отличается от рассматриваемой нами в связи с языком С. Мы здесь выбрали язык С как наиболее яркий антипод М-языку. Язык программирования С является наиболее низкоуровневым (близким по смыслу к машинным инструкциям) и тем самым самым гибким в вариантах его применения и самым эффективным в смысле быстродействия и экономии использовании памяти компьютера. Безусловно, этот язык явно не тянет па чемпиона в легкости его изучения и применения. Однако являясь самым распространенным языком системного программирования и будучи хорошо переносимым между разными программными и аппаратными платформами, он является чемпионом в номинации "Программирование без ограничений" (Programming Unlimited)! В рамках терминологии пакета MATLAB все функции, разработанные на внешнем по отношению к пакету MATLAB языке программирования, принято называть МЕХ-функциями (М - это Matlab, a ЕХ - это External, то есть "внешний"). Еще раз повторим, что мы будем разрабатывать МЕХ-функции только на языке программирования С, оставив аналогичные вопросы по языкам Фортран и C++ для самостоятельного изучения читателями по встроенной в пакет MATLAB системе помощи. Кроме того, предполагается, что читатель знаком с языком программирования С и средством разработки Microsoft Visual C++ (версий 5 ИЛИ 6). На платформе Windows готовые к применению в рамках пакета MATLAB МЕХ-функции представляют из себя скомпилированный машинный код, погруженный в файлы динамических библиотек (Dynamic Link Libraries; эти файлы имеют расширение .dll). Одна МЕХ-функция соответствует одному файлу динамической библиотеки. При этом имя МЕХ-функции, используемое для ее вызова в выражениях системы MATLAB, совпадает с именем файла динамической библиотеки. Например, если мы в командном окне системы MATLAB записываем выражение res = А .* В + MyMexFunctionl( А + В ); где MyMexFunctionl - имя МЕХ-функции, то на диске компьютера в любом известном пакету MATLAB каталоге должен находиться бинарный файл с машинными инструкциями MyMexFunction1.dll, разработанный и скомпилированный в среде Microsoft Visual C++. Именно по имени МЕХ-функции пакет MATLAB ищет необходимый файл, загружает его в память компьютера в свое адресное пространство, после чего содержимое этого файла становится продолжением "родного машинного кода" пакета MATLAB. В этом смысле МЕХ-функции являются бинарными расширениями кода пакета MATLAB, в то время как М-функции являются его текстовыми расширениями. Если в одном и том же каталоге встречаются как МЕХ- так и М-функции с одинаковым именем, то интерпретатор пакета MATLAB отдаст предпочтение МЕХ-функции, в то время как команда help выбирает М-функцию. Это позволяет документировать информацию по МЕХ-функции в содержимом одноименной М-функции. Теперь начнем рассматривать вопросы, связанные с практическими аспектами разработки МЕХ-функции на языке программирования С. Как реально скомпилировать файл динамической библиотеки в среде... Читать дальше » |
На вход данной функции допускаются только двумерные массивы ячеек. С помощью MATLAB API функции mxGetCell мы извлекаем отдельный элемент входного массива. Для массива ячеек элементы имеют тип mxArray. Обратим внимание на то, что в функции mxGetCell отдельные элементы индексируются единственным индексом, значение которого нужно назначать исходя из упорядочения элементов массивов системы MATLAB по столбцам. Именно поэтому элемент из i-й строки и j-ro столбца извлекается с помощью следующего выражения (индексы в языке С начинаются с нуля): pAr= mxGetCell( pln[0], i+j*M ); Указатель pAr на структуру mxArray далее передается в функцию MyPrint, где С ПОМОЩЬЮ функций mxIsChar, mxIsDouble, mxIsComplex, mxIsCell, mxIsStruct, mxIsUint8 и mxIsSparse определяется, какие данные содержатся в этой структуре. Так как в языке С индексы массивов начинаются с нуля, а в М-языке они начинаются с единицы, то, чтобы наблюдать в командном окне системы MATLAB привычные значения индексов, мы в функции MyPrint увеличиваем значения индексов на единицу при их выводе в командное окно функцией mexPrintf. Протестируем работу созданной только что МЕХ-функции мехCell1 на примере простого массива типа cell (см. рис. 12.14): Если же применить функцию мехСеll1 к массиву ячеек MyCellArray MyStruct = struct('fieldl',[ 1 2 3],'field2','Hello'); MyCellArray( 1,1)={ 'Bonjour!' }; MyCellArray( 1,2)={[123;456;789]>; MyCellArray( 2, 1 ) = { MyStruct }; MyCellArray( 2,2)={[975]};... Читать дальше » |
В следующем параграфе будет детально рассказано как скомпилировать реальное Win32 console-приложение на базе представленного текста, которое составляет содержимое файла main.с. Это единственный исходный файл, необходимый для компиляции. Там же будет рассказано, как следует отлаживать такое приложение. Сейчас же покажем, как выглядит окно приложения после того, как все вычисления будут произведены (см. рис. 13.1): Отсюда видно, что получены три собственных числа. После нажатия любой клавиши окно закроется. Весь представленный выше код достаточно очевиден после того, как мы кратко описали предназначение всех функций библиотеки MATLAB Engine. Помимо них еще используются функции с префиксом mx, большинство из которых нам также хорошо известно, так как мы достаточно потренировались с ними на примерах из предыдущей главы. Однако есть все-таки одна новая функция, на которой следует остановить свое внимание. Это функция mxSetName, которую мы только что использовали в представленном выше примере. Это очень важная функция. Можно сказать, что эта функция нивелирует некоторое принципиальное различие между миром программ на языке С и миром программ на М-языке. В первом из них (то есть в мире С-программ) объекты типа mxArray (массивы системы MATLAB) адресуются указателями, которых нет вообще в М-языке. А в мире программ на М-языке есть только обычные имена для массивов. Так вот функция mxSetName и призвана снивелировать это различие, точнее перебросить мостик между двумя способами обращения к массивам (матрицам) в этих двух мирах. Фрагмент из вышеприведенной программы // Create real matrix pArr = mxCreateDoubleMatrix( 3, 2, mxREAL ); mxSetName( pArr, "A" ); показывает, что сначала создается массив 3x2 и он адресуется указателем pArr. После этого с помощью функции mxSetName для массива вводится "человеческое" (в отличие от использования "нечеловеческих" указателей в языке С) имя А. Когда позже этот массив будет внедрен в рабочее пространство системы MATLAB для дальнейшей его обработки, то сама эта обработка в рабочем пространстве системы MATLAB будет происходить над переменной с именем А. Вот соответствующий фрагмент кода: engPutArray( pEng, pArr ); engEvalString( pEng, "Vec = eig( A*A')" ); pV = eng6etArray( pEng, "Vec" ); Здесь в первой строке массив, адресуемый в С-коде указателем pArr, внедряется в рабочее пространство системы MATLAB, где с ним уже работают как с переменной А, что прекрасно видно из второй строки фрагмента. Далее, поскольку результат вычислений поименован там как Vec, то именно под этим именем мы и извлекаем его назад из рабочего пространства функцией engGetArray. Результат такого извлечения, то есть некоторая область памяти, далее адресуется в С-коде указателем pV. Надо полагать, что представленных подробнейших пояснений по поводу назначения функции mxSetName вполне достаточно... Читать дальше » |
13.2. Создание и компиляция ЕХЕ-проекта в среде компилятора Microsoft Visual C++ Недостаточно просто написать С-код для приложения типа MATLAB Engine. Нужно еще выбрать тип проекта Microsoft Visual C++, выполнить изменение свойств проекта и, наконец, скомпилировать его. Допустимыми типами проектов для создания приложений MATLAB Engine являются проекты Win32 Console Application и Win32 Application. Последние позволяют компилировать приложения с развитым графическим интерфейсом пользователя, в то время как первые проекты ограничиваются работой с простыми окнами, ориентированными на текстовый вывод. Именно эти окна (в рамках терминологии системы Windows они и называются консольными) мы приводили выше в качестве иллюстрации работы приложений MATLAB Engine, получающихся из представленных там примеров исходных С-кодов. Мы и далее будем работать только с проектами типа Win32 console Application исключительно из соображений их меньшего объема, что важно в процессе изучения системы MATLAB. Создав проект указанного типа, включаем в него единственный файл (например, под именем main.с, хотя выбор имени абсолютно произволен). Если тут же начать компилировать проект, то Developer Studio выдаст сообщения об ошибках, поскольку мы еще не выполнили должную настройку проекта. Она заключается в следующем. Во-первых, нужно прописать путь к включаемому файлу engine.h. Это все тот же каталог \extern\include, который мы уже указывали в свойствах проекта по созданию МЕХ-функций (см. предыдущую главу). Далее в списке библиотечных файлов проекта нужно вручную записать имена двух библиотек импорта, что показано на рисунке 13.6. В конце строки ввода object/library modules: здесь присутствуют имена libeng.lib и libmx.lib этих библиотек. Их нужно ввести вручную с клавиатуры. Сами эти библиотечные файлы, однако, не поставляются в готовом виде вместе с пакетом MATLAB. Их требуется изготовить самостоятельно. В предыдущей главе мы уже самостоятельно изготавливали аналогичный по смыслу и назначению файл matlab.lib. Мы сейчас точно таким же способом, который использовался в главе 12, изготовим недостающие библиотечные файлы libmx.lib И libeng.lib. Содержимое следующего командного окна Windows показывает необходимые действия по изготовлению обоих библиотечных файлов (рис. 13.7): По-прежнему применяется утилита lib с ключом /def:, но аргументами теперь являются файлы libeng.def и libmx.def. В результате получаются библиотечные (это библиотеки импорта) файлы libeng.lib И libmx.lib. Затем полученные таким образом библиотечные файлы нужно скопировать в главный каталог нашего проекта в среде Developer Studio, после чего все готово к компиляции. Нажав клавишу F7, получаем в результате процесса компиляции целевой исполняемый файл с расширением .ехе (а имя его совпадает с выбранным именем каталога проекта). Этот целевой файл уже можно запускать на выполнение (если под отладчиком среды Developer Studio - то клавишей F5). Он сам в процессе работы запустит приложение MATLAB, запросит у него выполнение некоторой работы, а результаты возможных вариантов работы мы уже наблюдали в предыдущем параграфе. Теперь несколько слов об отладке приложений MATLAB Engine. Для отладки эти приложения запускаются клавишей F5 (если, конечно, они собраны в Debug, а не Release варианте) с предварительно поставленными в их тексте точками останова (Breakpoints). После осуществления останова программы на одной из таких точек можно клавишей F10 осуществлять построчное продвижение. При этом очень легко наблюдать процесс запуска приложения MATLAB в фоновом режиме. Это, однако, не мешает щелчком мыши по иконке этого приложения развернуть его главное (командное) окно и начать тут же вводить команды и выполнять их... Читать дальше » |
|
|
 |
 |
Понедельник, 2012-02-06, 17:14:17 Приветствую Вас Гость |
| Статистика | 
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
 |
|