Об особенностях обмена данными между приложениями на языках высокого уровня и функциями Matlab
А.В. Красновидов, А.В. Забродин Петербургский государственный университет путей сообщения Императора Александра I
Санкт-Петербург, Россия, alexkrasnovidow@mail.ru, zaw2003@yandex.ru
Аннотация. Рассматриваются возможности обмена данными между функциями на языке системы Matlab с приложениями на языках высокого уровня. Программы на языках высокого уровня целесообразно использовать совместно с математическими пакетами для сбора данных, управления различными технологическими процессами и выполнения других подобных действий. Характеризуются инструментальные средства организации такого обмена. Показана целесообразность интеграции приложений на языках высокого уровня и М-функции системы Matlab в случае необходимости организации ввода/вывода больших объемов данных. Обоснована целесообразность использования структурированных данных для решения этой задачи. Приводятся варианты реализация обмена данными с помощью компонентов .NET Framework.
Ключевые слова Matlab, интеграция, системы программирования, М-функции, иерархия классов, структуры, преобразование типов.
Введение
Современный подход к проектированию информационных систем требует максимальной информационной совместимости различных программных приложений, работающих в единой информационной среде.
В настоящее время используется большое количество различных систем обработки данных, среди которых одной из наиболее часто используемых является система Matlab. Однако в ней практически отсутствуют средства диалогового взаимодействия с пользователями. Кроме того, программа, написанная на языке Matlab, может быть запущена на выполнение только из ее среды выполнения.
С другой стороны, программы, разработанные на языках высокого уровня C++ или C#, предоставляют пользователям развитые диалоговые средства, но плохо приспособлены для сложной математической или статистической обработки данных. Отсюда следует целесообразность объединения вычислительных возможностей специализированных систем обработки данных с диалоговыми возможностями программ на языках высокого уровня.
Технология интеграции функционала Matlab позволяет пользователям Windows-приложений максимально использовать аналитические инструменты этого пакета программ для решения следующих задач:
• оптимизационных задач любой размерности;
• получения надежных результатов финансово-экономических расчетов, в том числе в режиме on-line;
• трехмерной визуализации сложных геометрических фигур и поверхностей, имеющих экономическую сущность;
• создания алгоритмов оценки бизнеса, требующих большого объема вычислений;
• создания интеллектуальных систем управления проектами;
• моделирования экономических процессов любой степени сложности с использованием возможностей пакета Simulink.
Основные методы организации такого взаимодействия подробно рассмотрены в различных работах, например в [1, 2, 3] и других. Этими методами являются:
1) преобразование программы, написанной на языке Matlab, в программу на языке С++. Этот способ является исторически первым;
2) взаимодействие системы Matlab с Microsoft Visual Studio с помощью платформы .NET Framework.
Каждый из этих методов обладает своими преимуществами и недостатками. Подробное их сравнение приводится в [1, 4]. Здесь целесообразно отметить, что независимые приложения используют специальный режим работы компилятора mcc, что приводит к трудностям передачи параметров в Matlab-функции. Кроме того, такое приложение запускается из командной строки, что приводит к ограниченным диалоговым возможностям. Фактически компилятор mcc генерирует код на языке С++, эквивалентный соответствующему вызову Matlab-функции [5].
Второй метод основан на создании динамических библиотек классов в соответствии со стандартом CLR, которые могут быть использованы в любом приложении, соответствующем этим стандартам. Версии системы Matlab начиная с R2010b и выше располагают средствами создания динамических библиотек, которые могут быть использованы в программах на любых языках программирования, поддерживаемых средой выполнения CLR. В этом случае М-функции преобразуются в методы объектов, классы которых объявлены в среде CLR. Эти методы могут вызываться из программ на языках C++ или C#. Такой подход позволяет в полной мере использовать возможности системы Microsoft Visual Studio в части поддержки диалоговых средств и гибкости управления ходом вычислительного процесса. Однако при его реализации следует иметь в виду следующие особенности объявляемых классов:
• М-функции, в отличие от методов C++ или C#, могут иметь несколько выходных переменных - результатов;
• объявляемые классы не инкапсулируют данные. Они могут содержать только вызываемые методы;
• Script-файлы не могут быть преобразованы в методы и интегрированы в динамическую библиотеку.
Первая из перечисленных особенностей не является существенной в случаях, когда обращение из программы на C++ / C# происходит по методу, использующему только данные, передаваемые из вызывающей программы, и возвращает результат только в нее (автономный метод). Две другие могут привести к затруднениям в целом ряде часто встречающихся ситуаций, например в случае необходимости обмена данными между методами, содержащимися в динамической библиотеке. Примером этого может служить Matlab-программа, которая состоит из нескольких взаимосвязанных М-функций, одни из которых выполняют инициализацию общих переменных, например задают параметры некоторой модели, а другие выполняют собственно моделирование. Естественно, между этими функциями предполагается обмен различными данными. В рамках системы программирования Matlab такой обмен может быть реализован с помощью глобальных переменных, объявленных, например, в Script-файле. Однако третья особенность не дает возможности их интеграции в указанные выше динамические библиотеки. Отсюда возникает необходимость поиска иных возможностей обмена данными между взаимосвязанными М-функциями в рамках единой задачи. Одним из возможных способов представляется организация обмена данными между взаимосвязанными М-функциями через вызывающую программу на языке C++ или C#, который и рассматривается в настоящей статье.
1 Организация обмена данными между Matlab-функциями и программой на языке
высокого уровня
Выше было показано, что одним из вариантов организации обмена данными между взаимосвязанными М-функциями является использование вызывающей программы, написанной на одном из языков высокого уровня (C++ или C#). В этом случае общие данные располагаются в адресном пространстве вызывающей программы и передаются в вызываемые М-функции в качестве параметров. Общая схема организации такого взаимодействия подробно рассмотрена в [1]. Ниже отмечаются следующие особенности передачи данных между М-функциями и программой на языке высокого уровня.
1. Языки программирования C++ и C# являются языками со строгой типизацией данных. Все переменные должны быть объявлены до их использования. Система программирования Matlab не требует предварительного объявления переменных и их типа.
2. Методы в приложениях на C++ и C# имеют один возвращаемый с помощью оператора return выходной параметр некоторого типа или не имеют выходного параметра (тип void). М-функции могут иметь несколько возвращаемых выходных переменных. В общем случае заголовок М-функции имеет вид:
function [y1, y2,...,yn] = <имя_функции> (<Спи-сок_Входных_Переменных >).
Таким образом, выходные переменные представляют собой вектор-строку с элементами y1, y2, ..., yn, при этом все они в свою очередь могут быть матрицами или векторами. В процессе выполнения М-функции всем выходным переменным должны быть присвоены значения. Примером такой функции может служить функция meshgrid, использующаяся совместно с функциями построения графиков трехмерных поверхностей. Обращение к этой функции имеет вид:
[X,Y] = meshgrid(x), где X иУ - выходные векторы (результат работы функции).
Из изложенного выше следует, что основным моментом при организации взаимодействия между М-функцией и программой на языке C++ / C# является согласование типов передаваемых данных и выполнение отображения множества выходных переменных М-функции на соответствующие переменные вызывающей программы на C++ / C# и обратно. При решении этой задачи предлагается использовать библиотеку классов .NET MW Array для работы с массивами MWArray.dll. Эта динамическая библиотека содержит два пространства имен:
• MathWorks.Matlab.NET.Arrays - классы, которые обеспечивают доступ к массивам Matlab из любого .NET CLS-совместимого языка;
• MathWorks.Matlab.NET.Utility - сервисные классы, оказывают общую поддержку классов MW Array в среде исполнения компонента Matlab MCR.
Пространство имен MathWorks.Matlab.NET.Arrays содержит классы для поддержки преобразования данных между управляемыми типами и типами Matlab. Каждый класс имеет конструкторы, деструкторы и набор свойств и методов для того, чтобы обращаться к состоянию основного массива Matlab. Иерархия классов MathWorks.Matlab.NET.Arrays представлена на рис. 1.
MWArray - это абстрактный класс, корень иерархии классов массивов Matlab. Он инкапсулирует внутренний тип Matlab mxArray и обеспечивает возможность обращения, форматирования и управления массивом.
MWNumericArray - управляемое представление для массивов Matlab числовых типов. Его эквивалент Matlab -это заданный по умолчанию тип массива (вектора) double, используемый большинством математических функций Matlab.
MWLogicalArray - управляемое представление для массивов Matlab логического типа. Как и его эквивалент Matlab, MWLogicalArray содержит только единицы и нули (true/false).
MWCellArray - управляемое представление для массивов ячеек Matlab. Каждый элемент в массиве ячеек - это контейнер, который может содержать MWArray или один из его производных типов, включая другой MWCellArray.
MWCharArray - управляемое представление для массивов Matlab символьного типа. Как и его эквивалент Matlab, MWCharArray поддерживает создание строк и манипуляции со строками.
MWIndexArray - это абстрактный класс, который служит корнем для классов индексации MWArray. Эти классы представляют типы массивов, которые могут использоваться как входные параметры для оператора индексации массива [].
MWObjectArray - это специальный подкласс MWArray, который инкапсулирует собственный объект
.NET в массиве Matlab. Этот объект затем может быть доступен или возвращен функцией Matlab.
MWStructArray - управляемое представление для массивов структур Matlab. Как и его эквивалент Matlab, он состоит из имен полей и значений полей.
System.Object
1 г
MathWorks.MATLAB.NET.Arrays.MWArray
MathWorks.MATLAB.NET.Arrays.MWNumericArray
MathWorks.MATLAB.NET.Arrays.MWCellArray
MathWorks.MATLAB.NET.Arrays.MWLogicalArray
Math Works.MATLAB.NET. Arrays.MWCharArray
MathWorks.MATLAB.NET.Arrays.MWIndexArray
MathWorks.MATLAB.NET.Arrays.MWObjectArray
MathWorks.MATLAB.NET.Arrays.MWStructArray
Рис. 1. Иерархия классов MathWorks.Matlab.NET.Arrays.MWArray
Пространство имен MathWorks.MATLAB.NET.Utility.
Сервисные классы в этом пространстве имен оказывают общую поддержку классов MWArray в среде исполнения компонента MATLAB MCR.
Приведенная иерархия классов дает возможность легко выполнять преобразование данных из формата С++ / С# в формат Matlab и обратно, не прибегая к явному преобразованию типов. Ниже приводятся примеры подобных преобразований.
• Переменные скалярного типа double никаких преобразований не требуют.
• Одномерный массив (вектор) для передачи в M-функцию может быть сформирован следующими операторами:
double [ ] Coeff = {1,2,3,4}; // Вектор в С++/С#;
MWNumericArray MTLBCoeff = Coeff; // Вектор для передачи в M-функцию в качестве параметра.
• Двумерный массив для передачи в M-функцию может быть сформирован следующими операторами (*):
double [,] a ={ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; // Матрица в С++ / С#;
MWNumericArray arr1 = a; // Матрица для передачи в M-функцию в качестве параметра.
• Строковая переменная типа string преобразуется в символьный формат Matlab для передачи в M-функцию с помощью следующего оператора:
string My_String = "Это - строка С#"; MWCharArray mw_ My_String = new MWCha-rArray(My_String);
• Вектор типа MWArray, возвращаемый M-функцией в программу на С++ / С#; преобразуется в массив типа double с помощью следующих операторов:
MWArray[] Res = null; // Объявление объектов класса MWArray
MWNumericArray descriptor = null; // и MWNumericAr-
ray
// выбор первого элемента из массива MWArray и преобразование в
// числовой тип MWNumericArray; descriptor = (MWNumericArray)Res[0]; // преобразование массива MWNUmericArray к массиву типа double;
double [ , ] d_descriptor =(double[,])descriptor.ToArray(MWArrayComponent.Real);
Таким образом, классы MWArray используются для обработки массивов, определения типа и преобразования данных. Ниже рассматриваются примеры обмена данными между M-функциями и приложениями на языке С#.
2 Приложение для фильтрации экспериментальных данных
Пусть имеется последовательность чисел xn, представляющая собой ряд равноотстоящих измерений некоторой величины x(t), в котором n - целое (n = 0, 1, 2,.), t - непрерывная переменная. Если последовательность yn вычисляется по формуле
<х>
yn = ^ ckxn-k ,
k=-<х>
то эта формула определяет цифровой нерекурсивный фильтр [6].
Из формулы видно, что работа фильтра полностью определяется набором коэффициентов ck.
M-функция MainF принимает в качестве параметров набор коэффициентов фильтра и имя двоичного файла, в котором содержатся обрабатываемые данные. Возвращаемыми результатами являются векторы, содержащие исходный вектор и вектор результатов обработки.
function [ OutMatrix ] = MainF(File,Coeff) %UNTITLED Summary of this function goes here % Detailed explanation goes here
% File - символьное имя файла; Coeff - массив (вектор) коэффициентов. fid2 = fopen(File,'r');
InV = fread(fid2,'double'); % InV - исходный вектор
fclose(fid2); Arg = length(InV);
OutV = Filter (T,InV); % Обращение к M-функции, реализующей фильтр
% OutV - выходной вектор
OutMatrix = [InV OutV']; % Формирование вектора-строки выходных переменных
plot(1:Arg,InV,1:Arg,OutV); % Построение графика результатов
M-функция MainF объявлена как метод CLR-класса TFilter. Объявлять методом M-функцию Filter нет необходимости, так как ее вызов производится из функции, внешней по отношению к ней [2, 4]. Так как при обработке данных может возникнуть необходимость фильтрации различных их вариантов различными фильтрами, то представляется целесообразным организовать ввод имени файла и векторов коэффициентов из приложения на языке С++ / С#.
Такое приложение должно выполнять следующие действия:
1. Получить от пользователя название обрабатываемого файла в символьном виде и преобразовать его к формату, принятому в Matlab.
2. Получить от пользователя вектор коэффициентов фильтра в символьном (удобном для пользователя) виде и преобразовать их к формату, принятому в Matlab.
3. Создать объект класса TFilter, содержащий метод фильтрации.
4. Вызывать метод MainF класса TFilter и передать ему параметры (аргументы), которые преобразованы в формат Matlab.
5. Получить исходный и обработанный векторы возвращаемых M-функцией MainF, переведя их в формат С# (в тип MWNumericArray - управляемое представление типов числовых массивов Matlab).
6. Вывести полученные векторы в визуальный элемент listBox (если это необходимо).
ниже приводятся фрагменты такого приложения, выполняющие перечисленные действия.
// Объявление переменных
string File_Name; // Имя файла данных в строковом формате С#
MWArray [ ] Res = null; // Объявление объектов класса MWArray
MWNumericArray Vect = null; // и MWNumericArray для результатов работы // M-функции
double[ , ] OutV; // Матрица, в которую будут преобразованы результаты работы // M-функции
string SCoeff; // Строка в формате С# для ввода коэффициентов фильтра
double [ ] Coeff; // Массив (вектор) для передачи в M-функцию
// Преобразование имени файла из типа string в символьный формат Matlab
MWCharArray mw_Name rArray(File_Name);
new MWCha-
Выше было показано, что одним из передаваемых в M-функцию параметров является массив (вектор) коэффициентов, определяющий свойства цифрового фильтра. Их значения вводятся в диалоговом режиме, поэтому количество этих коэффициентов заранее неизвестно. С точки зрения M-функции MainF это не имеет значения, так как все массивы Matlab по определению являются динамическими. Однако в С#-массив - всегда статическая структура, размер которой должен быть определен заранее. Поэтому рассмотренное выше преобразование не может быть использовано непосредственно. Для преодоления указанного противоречия в приложении на С# была создана динамическая структура - список, который затем преобразуется в массив нужного размера.
List<double> TMP = new List<double>(); // Шаблон для организации списка
// заполнение списка введенными коэффициентами
//...................
//...................
Coeff = TMP.ToArray(); // Преобразование списка в массив
MWNumericArray MTLBCoeff = Coeff; // Преобразование числового массива из
//формата С# в числовой массив в формате //Matlab
TFilter Filter = new TFilter(); //Создание объекта класса TFilter
Res = Filter.MainF(1, mw_Name, MTLBCoeff); // Вызов метода MainF
//выбор первого элемента из массива MWArray и преобразование в
// числовой тип MWNumericArray; Vect = (MWNumericArray)Res[0]; int Size = Vect.NumberOfElements; OutV = new double[Size/2, Size/2]; // Инициализация матрицы результатов
for (int i = 0; i < Size / 2; i++) {// Заполнение матрицы результатов размерностью (2х Size / 2)
OutV[1, i] = Vect[i + 1].ToScalarDouble();
OutV[2, i] = Vect[i + Size / 2 + 1].ToScalarDouble();
// Вывод результатов в визуальный элемент
listBox
listBox1.Items.Add(i.ToString() + " " + OutV[1, i] +
" " + OutV[2, i]); }
Метод ToScalarDouble() класса MWNumericArray преобразует скалярные значения формата Matlab в тип double С#. Таким образом, в данном случае требуется явное преобразование типов. Результат работы приложения представлен на рис. 2.
В рассмотренном примере метод (M-функция) Filter инкапсулирована в метод MainF, поэтому первая не является методом CLR-класса Tfilter и нет необходимости организовывать обмен данными между ними.
Рис. 2. Результат работы приложения
Следует отметить, что использование listBox не является единственным вариантом визуализации результатов работы приложения.
3 Приложение для определения наилучшей точки
доступа для подключения мобильного устройства к локальной сети
В статье [7] рассмотрен алгоритм определения наилучшей точки доступа для подключения мобильного устройства к локальной сети, учитывающий не только уровень сигнала на его входе, но и ширину полосы про-
пускания, которая может быть выделена очередному мобильному абоненту при попытке его подключения. Для решения этой задачи была построена модель-алгоритм выбора такой точки. Построение было выполнено с помощью аппарата нечеткой логики с использованием визуального программирования в среде Matlab. Такая модель может быть сохранена в файле с расширением .fis и в дальнейшем загружена в Matlab-программу [8]. После ввода в модель исходных данных производится собственно моделирование. Структурная схема программной модели представлена на рис. 3.
Рис. 3. Структурная схема программной модели
Каждая точка доступа представлена структурой, содержащей следующие поля данных:
• порядковый номер точки доступа (double P_Number);
• текущее значение уровня сигнала в этой точке (double Signal_Level);
• текущее количество подключенных к этой точке абонентов (double Dev_Number);
• текущее время передачи кадра этой точкой (double Baud_Rate).
При инициализации модели указанные структуры объединяются в вектор. При инициализации количество подключённых абонентов (Num_user), скорость передачи данных (Baud_Rate) устанавливаются равными нулю, значение уровней сигнал / шум (S/N) формируется вектором значений уровней сигнал / шум по заданному закону распределения. Текущая скорость передачи данных (Baud_Rate) рассчитывается с учётом количества абонентов. В дальнейшем после каждого подключения в каждой точке производится пересчет количества абонентов, рассчитывается скорость передачи данных точки, в которой произошло подключение. Данные этой точки меняются и перезаписываются. Моделирующая программа состоит из нескольких M-функций, связанных общими данными, и
вызываются из Script-файла, содержимое которого представлено ниже.
Node = In-
it1('D:\AVK\MyC#\MTLB_Integr\Fuzzy\MobileWiFi.fis',N);
Smple = Start_Rnd();
Step =1;
while (Step < N)
Res1 = ModelF(Node,Smple,Step);
Node = Res1.ND;
Step = Step+4;
end;
Print(Res1);
M-функция Init1 формирует массив структур в соответствии с рис. 3 и загружает файл модели;
M-функция Start_Rnd формирует значение общей полосы пропускания и значения уровней С/Ш по заданному закону распределения;
M-функция ModelF выполняет моделирование в соответствии с вышеприведенным алгоритмом;
M-функция Print осуществляет вывод результатов моделирования в виде графиков и отображает ход процесса моделирования.
Все перечисленные M-функции связаны общими данными: массивом структур, показанным на рис. 3. Для ра-
боты приведенного выше Script-файла требуется ввод параметров моделирования: имени файла-модели, количества циклов моделирования, параметров закона распределения и т.п. Кроме того, вывод информации на монитор в соответствии с принципами работы среды Matlab, а также запуск Script-файла возможны только при работе в этой среде. Отсюда следует целесообразность организации взаимодействия перечисленных выше M-функций и приложения на языке С++ / С#. Как и в предыдущем примере, эти функции должны быть методами CLR-класса (в рассматриваемом примере - TFuzzy). Фактически такое приложение должно реализовывать функциональность рассмотренного выше Script-файла. Такое приложение должно выполнять следующие действия:
1) получить от пользователя название файла-модели в символьном виде и преобразовать его к формату, принятому в Matlab;
2) получить от пользователя количество циклов моделирования, размерность массива структур в символьном (удобном для пользователя) виде и преобразовать их к формату, принятому в Matlab;
3) создать объект CLR-класса TFuzzy, содержащий методы Initl, Start_Rnd, ModelF, Print;
4) вызывать перечисленные выше методы класса TFuzzy в соответствии с алгоритмом моделирования, передавая ему параметры (аргументы), которые преобразованы в формат Matlab.
Ниже приводятся фрагменты такого приложения, выполняющие перечисленные действия.
// Объявление переменных
string SPar; // 1
string File_Name; // 2
double Par; // 3
double Step; // 4
MWArray [ ] mod = null; // 5
MWArray [ ] Res = null; // 6
MWArray [ ] Param = null; // 7
MWStructArray Point = null; // 8
MWStructArray Result = null; // 9
Строки 1-4 не нуждаются в комментариях, их назначение аналогично подобным переменным, рассмотренным в предыдущем примере. Объект mod класса MWArray (строка 5) нужен для хранения дескриптора загружаемого файла модели. Этот дескриптор является объектом класса struct системы программирования Matlab [8] и передается в приложение методом Initl CLR-объекта Model класса TFuzzy. Объект Res (строка 6) класса MW Array служит для хранения результата очередного шага моделирования, возвращаемого методом ModelF CLR-класса Model. Результат является объектом класса struct системы программирования в соответствии с рис. 3. Объект Param класса MW Array (строка 7) служит для хранения текущих параметров сеанса моделирования и принадлежит классу struct системы программирования. Объекты Point и Result класса MWStructArray (строки 8, 9) предназначены для хранения
и преобразования массивов структур в соответствии с рис. 3.
TFuzzy Model = new TFuzzy(); // 10 MWCharArray Mod_Name = new MWCha-rArray(File_Name);
MWNumericArray Number; // 11 panell.Visible = false; mod = Model.Init1(1,Mod_Name); // 12 Point = (MWStructArray)mod[0]; // 13 Param = Model.Start_Rnd(1); // 14 Step = 1;
while (Step < Par) {
Res = Model.ModelF(1, (MWArray)Point, (MWArray)Param[0], Step); // 15
Result = (MWStructArray)Res[0]; // 16 Point = (MWStructAr-
ray)Result.GetField("ND").Clone(); // 17
Number = Result.GetField("N").ToArray(); // 18 listBox1.Items.Add("Подключение к точке №: " + (Number.ToScalarDouble()).ToString()); Step = Step + 4; // 19
};
listBox1.Visible = true; Model.Print(0, Result); // 20
Оператор в строке 10 создает объект Model CLR-класса TFuzzy. Объект Number класса MWNumericArray служит для преобразования форматов между приложением и соответствующими методами CLR-класса Model (класс MWNumericArray - управляемое представление типов числовых массивов Matlab) [4, 5]. Оператор в строке 12 выполняет инициализацию модели, передавая в качестве параметра имя файла модели (см. предыдущий пример). Как было показано выше, метод Init1 возвращает дескриптор модели, в рассматриваемом случае имеющий структуру, показанную на рис. 4:
name: 'Mobile WiFi#l' type: 'mamdani' andMethod: 'min' orMethod: 'max' defuzzMethod: 'centroid' impMethod: 'min' aggMethod: 'max' input: [1x2 struct] output: [lxl struct] rule: [1x9 struct]
Рис. 4. Структура дескриптора модели
Как и в предыдущем примере, оператор в строке 13 выбирает первый элемент из массива, но в данном случае массив состоит из структур, поэтому здесь применяется соответствующее преобразование типов. Оператор в строке 14 получает структуру, содержащую текущие параметры сеанса моделирования. Операторы в строках 15-18 работают в цикле и выполняют следующие действия:
• вычисление модели, заключающееся в определении наилучшей точки доступа на данном шаге моделирования (строка 15). Метод ModelF принимает в качестве параметров структуры Point и Param (см. выше) и возвращает результат Res класса struct, показанный на рис 5. Так как последняя является массивом, то выполняется совмещение с его первым элементом;
• приведение результата моделирования на очередном шаге к классу struct (строка 16), что необходимо для вычисления модели на следующем шаге (строка 15);
| struct Res1 I
• глубокое копирование текущих значений параметров моделирования для передачи в метод ModelF (строка 17), что необходимо для вычисления модели на следующем шаге (строка 15);
• извлекает номер точки доступа, к которой произошло подключение на текущем шаге моделирования. Это необходимо для визуализации порядка подключений (строка 19);
• графическую визуализацию результатов моделирования (строка 20).
Использование объектов класса struct позволяет организовать хранение общих данных методов CLR-класса Model в приложении, реализованном на языке C#. Рассмотренные выше структуры данных, использованные в приложении, показаны на рис. 5. На рис. 6 и 7 показаны результаты работы приложения: на рис. 6 приведена динамика подключений абонентов к точкам доступа, на рис. 7 - окончательные результаты моделирования.
| struct Point I
I struct Node |
Рис. 5. Структуры данных приложения
Рис. 6. Результат работы приложения с визуализацией промежуточных результатов
Количество абонентов
Время передачи кадра (mksek)
Рис. 7. Результат работы приложения с визуализацией окончательных результатов (метод Print)
Заключение
Анализ рассмотренных методов взаимодействия системы Matlab с программами на языках C++ и C# в рамках среды разработки приложений MicrosoftVisualStudio позволяет сделать следующие выводы:
1. Интеграция возможностей системы Matlab с приложениями на языках программирования высокого уровня расширяет возможности разработки прикладного программного обеспечения для решения различных задач, требующих как удобного диалога с пользователем, так и выполнения сложных математических вычислений с графической визуализацией результатов.
2. В силу невозможности преобразования Script-файлов в методы CLR-классов и их интеграции в динамические библиотеки обмен данными между связанными методами внутри CLR-класса организовать нельзя.
3. Обмен данными между связанными методами можно организовать через приложение на языке высокого уровня, передавая ему соответствующие параметры.
4. При передаче параметров методами следует учитывать, что М-функции, в отличие от методов C++ или C#, могут иметь несколько выходных переменных - результатов. Отсюда следует, что основным моментом при организации взаимодействия между М-функцией и приложением на языке высокого уровня является согласование типов передаваемых данных и выполнение отображения множества выходных переменных М-функции на соответствующие переменные вызывающей программы на C++ / C# и обратно. Для решения этой задачи предлагается использовать библиотеку классов .NET MWArray для работы с массивами MWArray.dll. Эта библиотека дает возможность легко выполнять преобразование данных из формата С++ / С# в формат Matlab и обратно, не прибегая к явному преобразованию типов.
1. Использование объектов класса struct позволяет организовать хранение сложных данных методов классов CLR в приложении, реализованном на C #. В этом
случае сопоставление набора выходных переменных
M-функций с соответствующими переменными приложения в C ++ / C # и обратно может быть организовано путем объединения данных в структуры.
Список литературы
1. Методы интеграции инструментальных систем в процессе разработки безопасных приложений / С.Е. Ададу-ров, А.В. Красновидов, А.Д. Хомоненко, И.В. Коротеев // Проблемы информационной безопасности. Компьютерные системы. - 2017. - № 4. - С. 80-86.
2. Смоленцев Н. К. Создание Windows-приложений с использованием математических процедур Matlab. - М. : ДМК-Пресс, 2008. - 456 с.
3. Об особенностях взаимодействия между системой Matlab и приложениями с помощью технологии COM / А.В. Красновидов, А.В. Забродин, А.Д. Хомоненко // Профессиональное образование, наука и инновации в XXI веке : сб. трудов XII Санкт-Петербургского конгресса, Санкт-Петербург, 12-30 ноября 2018 г. - СПб. : ФГБОУ ВО ПГУПС, 2018. - С. 126-127.
4. Инг Бей, Джифенг Ксу. Взаимодействие MATLAB с ANSI C, Visual C++, Visual Basic и Java. - М. : Вильямс, 2005. - 207 с.
5. MATLAB C/C++ Book for MATLAB Compiler 4.5. -LePhan Publishing. - http://www.lephanpublishing.com/ MATLABBookCplusplus.html.
6. Хемминг Р.В. Цифровые фильтры / пер. с англ. ; под ред. А.М. Трахтмана. - М. : Советское радио, 1980. - 224 с.
7. Красновидов А. В. Модель алгоритма определения наилучшей точки доступа для подключения мобильного устройства к локальной сети // Интеллектуальные технологии на транспорте. - 2016. - № 2. - С. 36-42.
8. Леоненко А. Нечеткое моделирование в среде MATLAB и fuzzyTECH - СПб. : БХВ-Петербург, 2005. -736 с.
On the Peculiarities of the Exchange of Data Between Applications in High-Level Languages
and Matlab Functions
A.V. Krasnovidow, A.V. Zabrodin Emperor Alexander I Petersburg State Transport University St. Petersburg, Russia alexkrasnovidow@mail.ru, zaw2003@yandex.ru
Abstract. The possibilities of data exchange between functions in the language of the Matlab system with applications in highlevel languages are considered. Programs in high-level languages appropriately to use in conjunction with mathematical packages to collect data, control various technological processes, and perform other similar actions. The instrumental means of organizing such an exchange are characterized. It had been shown the feasibility of integrating applications in high-level languages and the M-function of the Matlab system, if necessary, to organize input/output of large amounts of data. The expediency of using structured data to solve this problem is justified. Presents options for the implementation of data exchange using the .NET Framework components.
Keywords: Matlab, integration, programming systems, M-functions, class hierarchy, structures, type conversion.
References
1. Metody integracii informacionnych system v protsesse razrabotki bezopasnyh prilojeniy [Methods of integration of instrumental systems in the development of secure applications] / S. Adadurov, A. Krasnovidow, A. Chomonenco, I. Koroteev // Information security issues. Computer systems. -2017. - № 4. - Pp. 80-86.
2. Smolentsev N. Sozdanie Windows-prilozhenii s ispol-zovaniem matematicheskih protsedur Matlab [Creating Windows applications using Matlab mathematical procedures]. -M. : DMK_Press, 2008. - 456 pp.
3. Ob osobennostiah vzaimodeistvia mezhdu sistemoi Matlab I prilozheniiami s pomoschiu tehnologii COM [About the features of the interaction between the Matlab system and applications using COM technology] / A. Krasnovidow, A. Zabrodin, A. Chomonenco // Professional education, science and innovations in the XXI century. Collection of works of the XII St. Petersburg Congress. - 2018. - Pp. 126-127.
4. Ing Bey, Dzhifeng Ksu.Vzaimodeistvie Matlab s ANSI C, Visual C ++, Visual Basic i Java, [Interaction of MATLAB with ANSI C, Visual C ++, Visual Basic and Java]. - M. : Williams, 2005. - 207 p.
5. MATLAB C/C++ Book for MATLAB Compiler 4.5. -LePhan Publishing. - http://www.lephanpublishing.com/ MATLABBookCplusplus.html.
6. Hemming R. Tsifrovie filtry. [Digital filters] // Ed. A. M. Trahtman. - M. : Sovetskoe radio, 1980. - 224 p.
7. Krasnovidow A. Model algoritma opredelenia nailut-shei tochki dostupa dla podkluchenia mobilnogo ustroistva [Model of algorithm to determine a best access point to connect a mobile device to the LAN] // Intellectual Technologies on Transport. - 2016. - № 2. - Pp. 36-42.
8. Leonenko A. Nechetkoie Modelirovanie v Srede Matlab i fuzzy TECH. [ Fuzzy modeling in MATLAB environment and fuzzy TECH]. - Saint-Petersburg : BHV-Petersbourg [Link], 2005. - 736 pp.