Структура DLL
В DLL, вызываемой из MatLab'a, обязательно должна присутствовать экспортируемая функция mexFunction. Вот её прототип:
void __cdecl mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]);
Эта mexFunction аналогична функции main() в обычных С-программах, т.е. с нее начинается выполнение Вашего кода. Рассмотрим параметры этой функции. Общий вызов MatLab-функции выглядит так:
[outParam1, outParam2, outParam3] = mlFunc(inParam1, inParam2),
где inParam1, inParam2 - входные параметры, а outParam1, outParam2, outParam3 - выходные параметры. При этом число и тех, и других параметров для одной и той же функции может быть разным. Так как Ваша DLL-функция должна работать так же, как и любая MatLab'овская, то при её выполнении Вы должны знать, сколько пользователь задал входных, а сколько выходных параметров. Для служат параметры
- int nlhs (количество ВЫХодных параметров)
- int nrhs (количество ВХодных параметров)
Сами параметры передаются в массивах
- plhs (ВЫХодные параметры)
- prhs (ВХодные параметры)
Эти параметры имеет тип mxArray*. mxArray - это тип данных, с помощью которого из MatLab'a передаются параметры всех типов - целые числа, дробные числа, комплексные числа и т.п. Существует ряд функций для работы с этип типом, например bool mxIsChar(const mxArray *array_ptr) указывает, является ли данный mxArray строкой, или нет, mxArrayToString возвращает строку, содержащуюся в mxArray'е, double *mxGetPr(const mxArray *array_ptr) возвращает указатель на первый элемент массива, содержащийся в параметре, и т.п. Все эти функции подробно описаны в Help'е Матлаба. Функция void mexErrMsgTxt(const char *error_msg) возвращающает сообщение об ошибке в командное окно MatLab'а. Эта функция прерывает работу DLL.
Массив выходных параметров пуст в начале работы. Вы должны заполнть каждый выходной парметр, создав переменную типа mxArray c помощью функций MatLab'а. Например, чтобы вернуть в первом выходном параметре строку 'Hello, world!!!', Вы должны написать следующую строчку: plhs[0] = mxCreateString("Hello, world!!!"); Для каждого типа из MatLab'а существует отдельная функция: для чисел это mxCreateDoubleMatrix, для строк - mxCreateString и т.п. После преобразования некоторых входных параметров Вы должны освободить указатели на преобразованные типы с помощью функции mxFree. Например, с помощью функции mxArrayToString Вы получаете указатель на char, являющийся обычной С-строкой. Эту строку Вы и должны освободить с помощью mxFree. Таким образом, общий порядок действий при работе функции следующий:
1. Проверить количество входных и выходных параметров, если эти количества неправильные, то вернуть сообщение об ошибке.
2. Проверить, те ли типы переданы во входных параметрах с помощью функций mxIsChar, mxIsDouble, mxIsComplex и т.п. Действительно, если Вы ожидаете, что Вам в первом параметре передадут строку, а Вам передадут комплексное число, то ничего хорошего такая функция не насчитает.
3. Преобразовать параметры в обыкновенные типы C/C++ с помощью функций mxGetPr, mxArrayToString и т.п.
4. Произвести необходимые действия с этими парметрами
5. Заполнить выходные параметры.
6. При необходимости освободить занимаемую память с помощью функции mxFree.
Необходимо также отметить, что кроме выполнения вычислительных операций, Вы можете вызывать функции WinAPI.
Порядок создания dll-файла в Visual C++, вызываемого из MATLAB:
1. File->New Откроется диалог "New" вкладка "Projects":
o выбираем тип создаваемого проекта: Win32 Dynamic-Link Library
o заполняем Project Name: {step1} Location: {указываем путь к нужной директории}
2. File->New Откроется диалог "New" вкладка "Files":
o выбираем тип создаваемого файла: C++ source file
o заполняем File Name: {step1}
3. Скопировать в директорию проекта файл matlab.lib (прилагается)
4. Добавить скопированный файл к проекту: Project->Add ToProject->Files-> matlab.lib
5. Работа с С++-ым файлом, входящим в проект: обязательно включить следующие хедера:
6. #include <windows>7. #include <mex.h>8. #include <matrix.h>9....10. (Далее пишем нужный код)11.... 12. Добавить к проекту файл {step.def}:
o File->New: откроется диалог "New" вкладка "Files":
o выбираем тип создаваемого файла: text files
o заполняем File Name: {step1.def}
13. Открыть {step.def} и заполнить его:
14. LIBRARY "{step1}"15. EXPORTS16. mexFunction 17. Tool->Options->Вкладка "Directories" включить путь:
18. С:\MATLAB\extern\include 19. Project->Settings: Output file name: {step1.dll}
20. F7 (Build) -> создастся файл {step1.dll}
21. Открываем MATLAB
22. File->Set Path: указываем путь к созданному dll-файлу
23. C командной строчки MATLAB: >>{step1} а выполнится нужный С++-ный код.
#$ Методичка по Matlab
# Вещественныечисла.
$ Вещественные числа.
+ 0010:0010
# Операциинадвещественнымичислами.
$ Операции над вещественными числами.
+ 0010:0020
# РабочеепространствосистемыMATLABиеёкомандноеокно.
$ Рабочее пространство системы MATLAB и её командное окно.
+ 0010:0030
# Элементарныематематическиефункции.
$ Элементарные математические функции.
+ 0010:0040
# КомплексныевычислениявсистемеMATLAB.
$ Комплексные вычисления в системе MATLAB.
+ 0010:0050
# МассивычиселвсистемеMATLAB.
$ Массивы чисел в системе MATLAB.
+ 0010:0060
# Синтаксисоперацийсмассивами.
$ Синтаксис операций с массивами.
+ 0010:0070
# Взаимныепреобразованиявекторовиматриц.
$ Взаимные преобразования векторов и матриц.
+ 0010:0080
# МногомерныемассивывсистемеMATLAB.
$ Многомерные массивы в системе MATLAB.
+ 0010:0090
# Функциидляработысмассивами.
$ Функции для работы с массивами.
+ 0010:0100
# Вычислениясмассивами.
$ Вычисления с массивами.
+ 0010:0110
# Глава2.
$ Глава 2.
# Построениедвумерныхграфиковфункций.
$ Построение двумерных графиков функций.
+ 0020:0010
# Оформлениеграфиковфункций.
$ Оформление графиков функций.
+ 0020:0020
# Трёхмернаяграфика.
$ Трёхмерная графика.
+ 0020:0030
# Положениекамерыивращениетрёхмерныхграфиков.
$ Положение камеры и вращение трёхмерных графиков.
+ 0020:0040
# СохранениевфайлахипередачавдругиепрограммыграфическихизображенийMA...
$ Сохранение в файлах и передача в другие программы графических изображений MA...
+ 0020:0050
# Показпроизвольныхрастровыхизображений.
$ Показ произвольных растровых изображений.
+ 0020:0060
# Глава3.
$ Глава 3.
# Понятияфункцииисценария.
$ Понятия функции и сценария.
+ 0030:0010
# СинтаксисопределенияивызоваM-функций.
$ Синтаксис определения и вызова M-функций.
+ 0030:0020
# Конструкцииуправления.
$ Конструкции управления.
+ 0030:0030
# ПроверкавходныхпараметровивыходныхзначенийM-функции.
$ Проверка входных параметров и выходных значений M-функции.
+ 0030:0040
# Видимостьимёнпеременныхиимёнфункций.
$ Видимость имён переменных и имён функций.
+ 0030:0050
# РазработкаиотладкаM-функций.
$ Разработка и отладка M-функций.
+ 0030:0060
# Массивысимволов.
$ Массивы символов.
+ 0030:0070
# Массивыструктур.
$ Массивы структур.
+ 0030:0080
# Массивыячеек.
$ Массивы ячеек.
+ 0030:0090
# Чтениеизаписьфайловданных.
$ Чтение и запись файлов данных.
+ 0030:0100
# Глава4.
$ Глава 4.
# ГрафическиеокнасистемыMATLABиэлементыуправления.
$ Графические окна системы MATLAB и элементы управления.
+ 0040:0010
# Созданиеосновныхэлементовуправления.
$ Создание основных элементов управления.
+ 0040:0020
# СозданиеграфическогообъектаAxes.
$ Создание графического объекта Axes.
+ 0040:0030
# Callbackфункции.
$ Callback функции.
+ 0040:0040
# Глава5.
$ Глава 5.
# Объектыиклассы.Переопределениеопераций.
$ Объекты и классы. Переопределение операций.
+ 0050:0010
# НаписаниерасширенийMATLABнаязыкеC.
$ Написание расширений MATLAB на языке C.
+ 0050:0020
# ВызовизMatLab'акода,написанногонаC/C.
$ Вызов из MatLab'а кода, написанного на C/C++.
+ 0050:0030
# МетодичкапоMatlab
$ Методичка по Matlab
Дата добавления: 2015-01-18 | Просмотры: 911 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|