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

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

Rambler's Top100

Рейтинг@Mail.ru

О проекте

Вычислительная система Matrix32 - логическое продолжение системы матричных вычислений Matrix.

Старый Matrix не мог удовлетворить все потребности программиста, которые возникали при работе с массивами. Ограничения были весьма жесткими: поддерживались исключительно 2-мерные массивы. Элемены массива могли иметь только один тип - Real. Преимущества ООП использовались слабо. Изначально Matrix мною разрабатывался как средство, которое смогло бы упростить работу с нейронными сетями (точнее без труда перевести их код из Матлаба). Но эта задача крайне сложная. Матлаб использует множество типов данных, среди которых - ячейки и записи, которыми старый Matrix не располагал.

Попытаюсь выполнить довольно сложную аналитическую задачу - перечислить основные функции и возможности Matrix32:

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

- Поддерживаются многомерные массивы всех числовых типов Delphi, начиная от Byte и заканчивая Extended. Также поддерживаются многомерные массивы комплексных чисел.

- Оставлен объект TWorkspace. Его назначение уже не так очевидно, как прежде. Раньше TWorkspace был хранилищем массивов, и любая работа с массивами выполнялась через него. Теперь же все массивы выполнены в виде объектов и унаследованы от класса TMatrix. Любой массив может быть владельцем других массивов. Теперь основное назначение рабочей области - это работа с двоичными файлами. Иногда бывает удобно для решения определенной задачи сгруппировать массивы по рабочим областям, и при необходимости одной командой сохранить все эти объекты в файл (или загрузить из файла).

- Реализованы функции по работе с потоками и двоичными файлами. Если в старой версии использовались файлы целых трех форматов, то теперь только один - двоичный. Дело в том, что текстовый формат не позволяет наглядно отобразить элементы массива, имеющего более 2-х измерений. Сохранить в двоичный файл можно любой объект, и не важно что он имеет еще сотню-другую вложенных объектов. Глубина вложенности структур на работу данных функций роли никакой не играет. (А вложенность не ограничивается. Т.е. вы можете создать массив ячеек, элементами которой будут другие массивы ячеек, те массивы хранять указатели еще на какие-либо объекты и т.д.). Любой объект можно сохранить (а после - загрузить) не только в файл, но и в поток TStream.

- Изменена обработка исключений. Теперь при возникновении исключения может быть сформирован стек вызовов, приведших к ошибке. Текст сообщение об ошибке теперь содержит текст самой ошибки, класс ошибки, краткое описание объекта TMatrix, сопоставленного с данной ошибкой, а также список функций, вызов которых привел к ошибке. Вот пример сообщения об ошибке:


Сообщение об ошибке:

<Задано недопустимое значение размерности массива>

Класс исключения: EMatrixDimensionsError = class(EMatrixError);

Информация об объекте TMatrix:
Имя объекта: 
Класс объекта: TExtendedMatrix = class(TFloatMatrixClass)
Занимаемая память: 0 байт(а)
Размер элемента: 10 байт(а)
Количество элементов массива: 0
Размеры массива (0-D): 
Число дочерних объектов: 0

Цепь распространения ошибки:
function TExtendedMatrix.ProdDimensions
procedure TExtendedMatrix.CheckMemoryForResize
procedure TExtendedMatrix.Resize

- Что касается многомерных числовых массивов, то для них реализовано очень много различных функций, например, операция конкатенации Concat, копирование участка одного массива в другой массив CopyArrayPart, необходимые вычислительные операции и многое многое другое.

- Очень важный момент - все числовые массивы в Matrix32 полностью совместимы друг с другом. Например все операции, которые можно проделать над экземпляром класса TExtendedComplexMatrix, также можно проделать и над экземпляром класса TByteMatrix. Так что если вам захочется написать функцию для обработки любых массивов вне зависимости от типа элементов, то сделайте так, чтобы она принимала аргумент в виде указателя на TMatrix, а не на TByteMatrix (к примеру). Вообще имена типов лучше использовать только при создании объекта. Типовой пример создания объекта:

var 
  M: TMatrix;
begin
  M := TByteMatrix.Create;
  try
    // Операторы обработки
  finally
    M.FreeMatrix;
  end;
end;
Логинов Дмитрий © 2005-2015