Изображение квадрата Дюрера

ООО АВТОМАТИКА плюс

Rambler's Top100

Рейтинг@Mail.ru

Исследование и разработка алгоритмов с помощью программы TestMatrix

Версия от 09.10.2010

В чем преимущество Matrix32 на практике?

Взаимодействие с Matlab

Во первых, Matrx32 поддерживает все ключевые объекты Matlab: матрицы, записи (struct) и массивы ячеек (cell). Благодаря этому Matrix32 совместим с Matlab'ом. Любой объект Matrix32 можно передать в Matlab с помощью команды Matlab.PutMatrix(MatrixObj, 'ObjName'). Любой из основных объектов Matlab можно загрузить в Matrix32  с помощью команды MatrixObj := Matlab.GetMatrix(MatlabObjectName, MatrixObjectName). С помощью метода Matlab.Execute(MatlabScript) можно выполнить любую команду, любой оператор, любую функцию, т.е. все то, что поддерживает Matlab. Как это выглядит на практике. С помощью Delphi разрабатывается интерфейс пользователя. По возможности вся математика реализуется за счет Matrix32. Однако, если Matrix32 не обладает каким-то требуемым функционалом, то этот функционал предоставляет Matlab. Разумеется, такой подход является обоснованным на этапе проведения исследований. Но если Вы рассчитываете на коммерческое будущее своего проекта, то от Matlab'a скорее всего придется отказаться. В этом случае придется переписывать Matlab-код в код на языке Delphi. Эта задача без Matrix32 практически нереальная, но использование Matrix32 позволит существенно приблизить ее решение. К сожалению вы не найдете реализацию многих необходимых функций на языке Matlab. Некоторые, особенно высокопроизводительные функции, являются "встроенными" (build-in). Примером таких функций является: матричное умножение, решение СЛАУ, LU-разложение, вычисление обратной матрицы и многие другие. К счастью, многие из этих функций на самом деле реализованы в библиотеках Lapack и Blas. Matrix32 умеет работать с этими библиотеками. Примеры кода по взаимодействию с этими библиотеками вы найдете в модулях matrixBlas.pas и matrixMatlab.pas. Реализовано подключение только нескольких функций (их гораздо больше!). Вы можете использовать эти 2 модуля как руководство к действию.

Сохранение своего текущего состояния

Это крайне важная задача, особенно при проведении исследовательской деятельности. Исследование может занимать очень большой промежуток времени: дни, недели, годы. Очень важно иметь возможность прервать исследование в любой момент, и в нужный момент его возобновить. При этом все накопленные в ходе исследования данные должны заноситься в долговременную память. Здесь опять имеет место полная аналогия с Matlab. В Matlab можно в любой момент сохранять всю рабочую область, либо отдельно выбранный объект в файл, а затем, при необходимости, загрузить эти данные из файла. В Matrix32 для сохранения всех объектов рабочей области используется метод Workspace.SaveWorkspace(FileName). Для сохранения заданного объекта используется метод MatrixObj.SaveToBinaryFile(FileName).
Кроме того, в Matrix32 реализованы сохранение объектов в потоки TStream и загрузка объектов из потоков TStream. Это более мощный механизм, чем файлы. В качестве потоков могут выступать объекты классов TFileStream, TMemoryStream, TBlobStream и др. Если вы знакомы с Блоб-полями (это двоичное поле таблицы базы данных), то без труда сможете сохранить любой объект Matrix32 в Блоб-поле, а после этого загрузить объект из Блоб-поля.

Отсутствие ограничений

Ограничений нет никаких. Числовые массивы, а также массивы ячеек могут иметь любую размерность (могут быть пустыми, могут быть векторами, матрицами, многомерными массивами) и любое число элементов (разумеется, если для этого хватит памяти). Записи могут иметь сколько угодно полей. Можно создать сколько угодно объектов TMatrix, сколько угодно рабочих областей и т.д. Поддерживаются все основные типы данных: целочисленные, вещественные, символьные (пока только Ansi), комплексные. При необходимости вы можете создавать свои классы-наследники, которые смогут работать с вашими типами данных.

Функция обработки пишется ОДНОКРАТНО

Элементы массива могут быть любого типа: Byte, Integer, Double и т.д. Вы сами указываете тип элементов, когда создаете объект TMatrix. Если предполагается, что элементы массива будут иметь значения 0 или 1, то вы, конечно, можете создать объект с помощью TExtendedMatrix.Create(), и на работе это никоим образом не отразится, но будет потрачено памяти больше, чем нужно. Поэтому в данном случае более целесообразно использовать TByteMatrix.Create(). Но для тех функций, которые осуществляют обработку ваших массивов, тип элемента не имеет значения. Поэтому нет необходимости разрабатывать отдельную функцию для каждого типа элемента. В исходных кодах Matrix32 есть масса примеров таких функций.

Приложение TestMatrix

Для упрощения проведения исследовательской работы в Matrix32 разработано приложение TestMatrix. Оно находится в архиве с Matrix32 в виде исходных кодов. Приложение без проблем компилируется как в Delphi 7, так и в более новых версиях. Вы можете использовать данное приложение при разработке собственных математических алгоритмов. Основное преимущество TestMatrix заключается в удобстве работы.
Ниже представлено основное окно программы:

Главное окно TestMatrix

В левом верхнем углу находится дерево объектов TMatrix. Вы можете создать новый объект (числовой массив, массив ячеек или запись), удалить, переименовать или переместить его. Кроме того вы можете сохранить рабочую область или выбранный объект в файл / загрузить из файла.

В верхней части окна находится информация о выбранном объекте: наименование, тип, размеры, объем занимаемой памяти.

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

В левом нижнем углу находится область "Категории". Вы можете выбрать категорию средств обработки массивов.

В правом нижнем углу находятся средства обработки массивов для выбранной категории.

Операции с массивами

С помощью элементов управления, расположенных в категории "Операции с массивами", вы можете заполнить массив заданной последовательностью чисел, либо случайным образом. Вы можете транспонировать, копировать, переместить, перемножить массивы, вычислить функцию (от одного аргумента), вычислить операцию (функция от нескольких аргументов). При этом в качестве массивов M1, M2, M3 используются объекты, расположенные в области памяти "М1", "М2", "М3". По умолчанию все три области памяти соответствуют объекту, который выбран в дереве объектов в данный момент. Для того, чтобы в разных областях памяти запомнить разные объекты, нажмите кнопку "в память" напротив требуемой области памяти. Смысл кнопки "Транспонировать М1 -> М2" заключается в том, что транспонируется массив из области памяти M1, но результат будет записан в объект, расположенный в области памяти М2. Если в областях памяти М1 и М2 находится один и тот же объект, то транспонирование будет выполнено только в рамках этого объекта, никакие другие объекты затронуты не будут.
Смысл кнопки "Умножение M3=М1*М2" заключается в том, что массив, расположенный в области памяти М1, умножается на массив, расположенный в области памяти М2, а результат умножения будет записан в массив, расположенный в области памяти М3. Если в областях памяти М1, М2 и М3 находится один и тот же объект, то умножение будет выполнено, как и ожидается, никакие другие объекты затронуты не будут.

Следует отметить, что все функции из состава Matrix32 допускают указания одного и того же объекта и в качестве входного, и в качестве выходного параметра. Это достигается благодаря тому, что внутри функции создается временный массив-результат. После того, как функция успешно отработает, информация из временного массива-результата переносится с помощью метода MoveFrom() в указанный массив-результат. Операция переноса в подобных случаях осуществляется очень быстро, поскольку заключается в том, что копируются всего лишь 2 параметра: адрес начала массива в памяти и размеры массива. Сказанное наглядно поясняется в следующем простом примере (функция активации нейронной сети на основе логарифмического шкалирования):

procedure CalcLogSig(AMatrix, AResult: TMatrix);
var
  TempMatrix: TMatrix;
begin
  try
    CheckForMatrixTypes([AMatrix, AResult], [mtNumeric]);

    TempMatrix := AResult.CreateInstance();
    try
      TempMatrix.CalcFunction(AMatrix, fncNeg);
      TempMatrix.CalcFunction(TempMatrix, fncExp);
      TempMatrix.ValueOperation(1, TempMatrix, opSum);
      TempMatrix.ValueOperation(1, TempMatrix, opDiv);

      AResult.MoveFrom(TempMatrix);
    finally
      TempMatrix.FreeMatrix;
    end;
  except
    on E: Exception do
      raise {$IFDEF RecreateEObj}
         MatrixReCreateExceptObj(E, 'procedure CalcLogSig'){$ENDIF}
  end;
end;

Диаграмма

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

Параметры

С помощью элементов управления, расположенных в категории "Параметры", вы можете настроить параметры приложения TestMatrix, в частности установить флаг "Автоматически сохранять и загружать рабочую область при перезагрузке".

Взаимодействие с Matlab


Элементы управления категории "Взаимодействие с Matlab" представлены на рисунке:

Вы можете передать выбранный объект в Matlab. При этом можете оставить имя таким же, как в Matrix32, или же указать другое имя.

Вы можете загрузить числовой массив / массив ячеек / запись из Matlab. При этом можете указать, как этот объект будет называться в Matrix32.

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

Для того, чтобы данный функционал работал, необходимо, чтобы на вашем компьютере был установлен Matlab. Гарантируется правильность работы с версиями от 6.5 до 7.11. Если при попытке взаимодействия с Matlab выдается ошибка, то попробуйте запустить файл %MATLAB%\BIN\matlab.bat.

Blas, Lapack

Элементы управления категории "Blas, Lapack" представлены на рисунке:

Данные функции обеспечивают стандартные операции с матрицами с помощью библиотек Blas и Lapack. Это высокопроизводительные библиотеки, входящие в состав любого математического пакета (Matlab, Scilab и др.). В каталоге с приложением TestMatrix должны находиться файлы: matrixatlas.dll, matrixlapack.dll, dforrt.dll. Библиотека matrixatlas.dll (т.е. Blas) зависит от процессора. Для каждого типа процессора существует наиболее оптимальная версия Blas, поэтому библиотека matrixatlas.dll на данном сайте представлена в нескольких вариантах.
Все atlas-библиотеки тестировались на WinXP SP2, AMD Athlon 64 X2 Dual 4600+, 2.00 ГБ ОЗУ. Для тестирования использовалась операция матричного умножения "dgemm" для двух квадратных матриц размеров 2000 х 2000. Получены следующие результаты:

  • PPro:   9437 мс
  • PII:      9032 мс
  • PIII:     8641 мс
  • P4:       7937 мс
  • Athlon: 6610 мс
  • функция MulMatrices(), встроенная в Matrix32: 978484

Из результатов сравнения видно, что по сравнению с методом MulMatrices, все atlas-библиотеки работают очень быстро. Это не является недостатком метода MulMatrices - он работает достаточно быстро, вряд ли Ваша реализация стандартного алгоритма матричного умножения будет гораздо быстрее. Это говорит о том, что оптимизация матричных вычислений в библиотеках Lapack и Blas выполнена на высочайшем уровне!

Логинов Дмитрий © 2005-2015