Программирование на языке С для пакета MATLAB [часть 4] - Программирование - Каталог статей по программированию - Студия перевода Нуреева Александра
Студия перевода программ РУсофт
Понедельник, 2012-05-21, 02:26:30
Меню сайта

    Форма входа
    E-mail:
    Пароль:

    Категории раздела
    Программирование [2844]
    Статьи по программированию по C, C++, Delphi, FoxPro, Assmbler и т.д. Инструкция по Visual Studio .NET.

    Поиск

    Наш опрос
    Как вам новый дизайн?
    Всего ответов: 369

    Мини-чат
    200

    Друзья сайта
  • Создать сайт
  • Все для веб-мастера
  • Программы для всех
  • Мир развлечений
  • Лучшие сайты Рунета
  • Кулинарные рецепты

  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    Главная » Статьи » Программирование

    Программирование на языке С для пакета MATLAB [часть 4]
    ЧАСТЬ 4

    Программирование на языке С для пакета MATLAB

    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 в фоновом режиме. Это, однако, не мешает щелчком мыши по иконке этого приложения развернуть его главное (командное) окно и начать тут же вводить команды и выполнять их.

    Таким образом легко убедиться в роли такой библиотечной функции системы MATLAB, как функция mxSetName, которую мы детально обсуждали выше. Однако в процессе отладки в справедливости сказанного вы можете убедиться сами. Например, закомментируйте строку в исходном С-коде с вызовом функции mxSetName и перекомпилируйте весь проект. Затем запустите приложение под отладчиком и остановитесь на вызове функции engPutArray. По идее после работы этой функции в рабочем пространстве системы MATLAB должна появиться внедряемая туда с помощью этой функции переменная. Вот это и можно легко проверить. Разверните окно системы MATLAB и введите команду who, которая и покажет список всех переменных из рабочего пространства системы MATLAB. При закомментированной функции mxSetName вы внедряемой функции не обнаружите. Это естественно, так как функцию в рамках системы MATLAB можно показать только по ее имени, а мы не приписали в С-коде ей никакого имени, так как это делается закомментированной функцией mxSetName.

    Если вернуться и раскомментировать вызов этой функции, перекомпилировать и запустить проект снова под отладчиком, остановиться где надо, то зайдя в командное окно системы MATLAB и выполнив команду who, мы теперь обнаружим внедряемую нами переменную в списке переменных из рабочего пространства системы MATLAB.

    Остальные приемы отладки приложений типа MATLAB Engine не отличаются от приемов отладки любых других приложений Windows.

    13.3. Математические библиотеки системы MATLAB
    Разработав приложение типа MATLAB Engine, вы возможно захотите передать его для работы сторонним пользователям. Это вполне разумная идея, особенно если на языке С разработан удобный и самоочевидный графический интерфейс, а также присутствуют подробные HELP-файлы.

    Тут, однако, следует иметь в виду, что приложение MATLAB Engine невозможно запустить на компьютере, на котором не установлено приложение MATLAB. В этом случае пользователь получит сообщение об ошибке, гласящее, что не удается найти библиотек libeng.dll и libmx.dll. Если просто скопировать эти библиотеки на другой компьютер (например, в каталог System32) и снова запустить на нем разработанное приложение MATLAB Engine, то теперь будут затребованы другие библиотеки, так что конца этому не будет и ничего не получится.

    Как же быть, если требуется разработать на языке С приложение, которое использует всю математику, присущую системе MATLAB, но тем не менее, полностью независимо от самого приложения MATLAB? Ответ здесь заключается в том, что тогда нужно разрабатывать на языке С приложение Windows, которое обращается уже не к библиотекам MATLAB Engine (это файлы libeng.dll и libmx.dll), а к математическим библиотекам, поставляемым вместе с пакетом MATLAB. В данном параграфе рассмотрим функции из этих библиотек, а в следующем параграфе разработаем на их основе ряд учебных проектов.

    Мощь математических библиотек, поставляемых с пакетом MATLAB и которые можно вызывать из программ, разработанных на языке С, весьма велика. Суммарно математические библиотеки системы MATLAB содержат буквально сотни функций. Все математические библиотеки являются являются библиотеками динамической компоновки и располагаются в каталоге \bin.

    Полный набор индивидуальных библиотечных файлов, составляющих логически единую математическую С-библиотеку пакета MATLAB, представлен ниже:

    libmmfile.dll
    libmatlb.dll
    libmatlbmx.dll
    libmat.dll
    libmx.dll
    libut.dll

    Эти библиотеки экспортируют основные математические (и некоторые вспомогательные) функции пакета MATLAB. Если изолированное от ядра пакета MATLAB (то есть от приложения matlab.exe) приложение хочет вызывать эти функции, то при его компиляции нужно предоставить в распоряжение компоновщика (часть компилятора в широком смысле этого термина) соответствующие библиотеки импорта. Эти библиотеки, то есть файлы libmmfile.lib, libmatlb.lib, libmatlbmx.lib, libmat.lib, libmx.lib и libut.lib, изготавливаются с помощью утилиты lib.exeи соответствующих файлов с расширением .def. Этот процесс аналогичен ранее рассмотренным примерам получения lib-файлов.

    Библиотека libmat.dll содержат функции для работы с МАТ-файлами, то есть с файлами закрытого формата, в которых система MATLAB сохраняет свое рабочее пространство по команде save.

    С помощью утилиты dumpbin.exe, входящей в состав пакета Microsoft Visual C++, можно получить список функций, экспортируемых той или иной библиотекой. Выходную информацию удобно сохранять в текстовом файле (см. рис. 13.8):

    В частности, в представленном примере мы сохраняем выходную информацию в файле MyFilel2345. Просмотреть содержимое такого файла можно любым текстовым редактором и узнать список экспортируемых функций:

    1 0 00001060 MATCLOSE94
    2 1 00001110 MATDELETEMATRIX@12
    3 2 00001080 MATGETDIR08
    4 3 00001140 MAT6ETFULL@28
    5 4 00001ОАО MATGETMATRIX@12
    6 5 000010FO MATGETNEXTMATRIX@4
    7 б 000011ЕО MATGETSTRING@24
    8 7 00001000 MATOPEN@16
    9 8 00001190 MATPUTFULL028
    10 9 00001ODD MATPUTMATRIX08
    11 A 00001290 MATPUTSTRING020
    12 В 00001540 raatClose
    13 С 00001300 raatCreateMATFile
    14 D 000016AO matDeleteArray
    15 E 00001790 matDeleteMatrix
    16 F 00001610 matGetArray
    17 10 00001650 matGetArrayHeader
    18 11 00001670 matGetDir
    19 12 00001580 matGetFp
    20 13 000017BO matGetFull
    21 14 00001970 matGetMatrix
    22 15 000015FO matGetNextArray
    23 16 00001630 matGetNextArrayHeader
    24 17 000019BO matGetNextMatrix
    25 18 000018CO raatGetString
    26 19 000014BO matOpen
    27 1A 000015BO roatPutArray
    28 IB 000015DO matPutArrayAsGlobal
    29 1C 00001830 matPutFull
    30 ID 00001990 matPutMatrix
    31 IE 00001590 matPutNextArray
    32 IF 00001920 roatPutString

    В списках экспортируемых функций помимо порядковых десятичных и шестнадцатеричных номеров функций даются также их байтовые смещения от начала файла.

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

    Одной из наиболее важных библиотек этой группы является библиотека libmatlb.dll. Вот часть списка экспортируемых ею функций:

    543 21Е 00013А20 mlfReshape
    544 21F 000095DO mlfRestorePreviousContext
    545 220 00028А40 mlfReturnValue
    546 221 0001C110 mlfRmappdata
    547 222 00013AEO mlfRound
    548 223 00013B20 mlfRuntime
    549 224 OOOOC930 mlfSave
    550 225 OOOOCBBO mlfSave_v!2
    551 226 OOOOBD40 rolfScalar
    552 227 00013B40 mlfSchur
    553 228 0001C1CO mlfSelectmoveresize
    554 229 0001C200 mlfSemilogx
    555 22A 0001C340 mlfSemilogy
    556 22В 0001С480 mlfSet
    557 22C 000099BO mlfSetErrorHandler
    558 22D OOOODC40 mlfSetLibraryAllocFcns
    559 22E OOOOC2FO mlfSetLibraryCalloc
    560 22F OOOOC330 mlfSetLibraryFree
    561 230 OOOOC310 mlfSetLibraryMalloc
    562 231 OOOOBF50 mlfSetPi
    563 232 OOOOBEFO mlfSetPr
    564 233 00009940 mlfSetPrintHandler
    565 234 00013BCO mlfSet_param
    566 235 0001C5CO mlfSetappdata
    567 236 00013BEO mlfSetstr
    568 237 00013C20 mlfSign
    569 238 00013C60 mlfSim
    570 239 00013C80 mlfSimget
    571 23A 00013CAO mlfSimset
    572 23В 00013ССО mlfSin
    573 23C 00013DOO mlfSing.le
    574 23D 00013D40 mlfSinh
    575 23E 00013D80 mlfSize
    576 23F 00013E50 mlfSize2d
    577 240 00013EEO mlfSldebug
    578 241 00013FOO mlfSort
    579 242 00013F90 mlfSparse
    580 243 00014020 mlfSparsfun
    581 244 000141AO mlfSprintf
    582 245 00014290 mlfSqrt
    583 246 000142DO mlfSscanf
    584 247 000143DO mlfStr2func
    585 248 00014470 mlfStrcmp

    Из представленного списка хорошо видно, что функции из этой библиотеки имеют префикс mlf и коррелируют с сответствующими функциями, которые вызываются в М-языке без этого префикса. Например, для обычной функции М-языка, такой как sin, в этой библиотеке имеется функция аналогичного действия с именем mlfSin. Для функции sort в пару ставится библиотечная функция mlfSort и так далее. Вообще в библиотеку libmatlb.dll сгруппированы функции, используемые на практике наиболее часто, так что при создании многих приложений можно будет ограничиться лишь двумя библиотеками: libmatlb.dll и libmx.dll. Суммарный объем этих двух библиотек составляет 648 КВ.

    Последняя из этих двух библиотек нужна всегда, так как математические функции системы MATLAB оперируют на массивах этой системы, а работу с такими массивами как раз и обеспечивает библиотека libmx.dll. Мы уже использовали эту библиотеку как при создании МЕХ-функций, так и при написании приложений типа MATLAB Engine, поскольку везде приходится работать с массивами системы MATLAB.

    Как было сказано выше, суммарно математические библиотеки пакета MATLAB содержат многие сотни функций, поэтому их хотя бы краткое поименное обсуждение здесь невозможно. В то же время в этом нет практической необходимости, так как действие большинства функций вполне понятно из-за их хороших мнемонических имен. Кроме того, в случае необходимости по каждой функции можно получить справочную информацию, вызвав диалоговое окно Help (см. рис. 13.9):

    Поэтому мы сразу перейдем к практическому примеру, иллюстриру-щему создание приложений, использующих математическую мощь пакета MATLAB, но являющихся вполне независимыми от ядра этого пакета, то есть от приложения matlab.exe. Будем для краткости называть такие приложения изолированными от matlab.exe.

    13.4. Изолированные от matlab.exe приложения Windows
    Такие приложения создаются на языке Си с помощью компилятора Microsoft Visual C++ компилируются в исполняемые файлы, для дальнейшей работы которых требуется наличие на компьютере (например, в том же каталоге, где находится исполняемый файл изолированного приложения) динамических математических библиотек пакета MATLAB, о которых было рассказано в предыдущем параграфе.

    Последнее означает, что для переноса изолированных приложений на другие компьютеры, на которых пакет MATLAB отсутствует, их следует поставлять вместе с указанными математическими библиотеками.

    Рассмотрим простой пример, в котором вычислим sin(x), опираясь на математические библиотеки системы MATLAB, а не на математическую библиотеку компилятора Visual C++. На таком простом примере проде- . монстрируем передачу параметров в функции математической библиотеки системы MATLAB, а также рассмотрим создание проекта и его настройки, необходимые для успешной компиляции.

    Вот текст первого примера, в котором исключительно ради краткости убраны все проверки возвращаемых значений (разумеется их нужно применять в реально работающих приложениях):

    #include
    #include
    #include
    #include "matlab.h"
    double x[] = {1,3,5,7,2,4,6,8};

    int main( void )
    {
    mxArray* X = NULL; mxArray* Y = NULL; int i, M, N;
    // Create arguments matrix X:
    X = mxCreateDoubleMatrix( 4, 2, mxREAL );
    // Set its 8 elements:
    memcpy( mxGetPr( X ), data, 8*sizeof(double) );
    // Calculate sin for all values at one time:
    Y = mlfSin( X );
    // Get elements of mxArray Y:
    pEl = mxGetPr( Y ); M = mxGetM( Y );
    N = mxGetN( X );
    // Print results of calculations:
    for( i=0; i {
    printf("%lf\n", pEl[i] );
    }
    // Free all mxArray memory buffers: mxDestroyArray( X );
    mxDestroyArray( Y );
    // Screen delay:
    printf("Press any key to exit");
    getch();
    return 0;
    }

    Из этого примера видно, что математические функции из библиотеки системы MATLAB сохраняют важное свойство всех функций системы MATLAB - способность осуществлять массовые (групповые) вычисления. Здесь мы одним вызовом функции mlfSin вычислили сразу восемь скалярных значений функции sin для восьми различных скалярных значений аргумента.

    В остальном представленный код нам должен быть абсолютно понятен, так как в нем нет ничего нового по сравнению с примерами, которые мы разрабатывали ранее в связи с приложениями MATLAB Engine. Обратим только внимание на необходимость удалять все буферы в памяти компьютера, выделенные под структуры mxArray. Причем это нужно делать как для массивов, созданных нами явно функцией mxCreateDoubieMatrix, так и для массивов, являющихся возвращаемыми значениями функций из математической библиотеки системы MATLAB. В нашем коде таким массивом является массив Y значений синуса. Память под этот массив была выделена в процессе работы библиотечной функции mlfSin, а освободить эту память должны мы сами:

    mxDestroyArray( X ); mxDestroyArray( Y );
    Иначе мы допустим ситуацию, когда после завершения работы нашего приложения память, выделенная в процессе ее работы, не будет освобождена, что перегружает операционную работу дополнительными обязанностями, а это нельзя признать хорошим стилем программирования.

    Чтобы из представленного исходного С-кода получить исполняемый модуль, нужно создать проект Win32 console Application, прописать в свойствах проекта путь к включаемому файлу matlab.h, добавить в список библиотек проекта еще две библиотеки: libmx.lib и libmatlb.lib. Изготовить эти библиотеки нужно самостоятельно так, как мы всегда поступали в таких случаях (смотри выше, например, параграф про приложения типа MATLAB Engine), после чего скопировать их в главный каталог нашего проекта. После всего этого нужно запустить процесс компиляции нажатием клавиши F7.

    Запустив скомпилированное приложение, получим результаты вычислений восьми значений синуса в консольном окне, показанном на рисунке 13.10:

    Как мы заявляли ранее, полученное приложение абсолютно независимо от самого приложения matlab.exe. Его можно перенести вместе с библиотеками libmx.dll и libmatlb.dll , а также еще двумя вспомогательными библиотеками libut.dll и libmat.dll, на другой компьютер, на котором пакет MATLAB не установлен, а работоспособность нашего приложения от этого не пострадает. В этом смысле изолированные от matiab.exe приложения поддаются наиболее простому способу распространения среди различных групп пользователей. Естественно, сохраняется зависимость от операционной платформы (невозможно, например, запустить приложение, скомпилированное под Microsoft Windows, на платформе Macintosh).

    Другие материалы по теме
    Категория: Программирование | Добавил: rusoft (2006-11-12) | Автор: Н.Н. Мартынова
    Просмотров: 2028 | Рейтинг: 5.0/1
    Всего комментариев: 5
    0  
    5 WeapleWef   (2011-11-15 21:40:46)
    How do you play Barcelona in this year?

    0  
    3 Диана   (2009-03-22 18:33:12)
    Мне это действительно безумно интересно. спасибо за статью!!!

    0  
    2 Олег   (2009-03-21 17:28:53)
    Хорошо написано.

    0  
    1 Диана   (2009-01-16 19:08:24)
    Спасибо большое за информацию.

    Имя *:
    Email:
    Код *:
    Copyright MyCorp © 2012
    Создать сайт бесплатно