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

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

Rambler's Top100

Рейтинг@Mail.ru

Справочная система




Внимание! Справка относится к старой версии Matrix. Справки по Matrix32 на данный момент не существует. И пока самый верный способ изучить его - смотреть файл Matrix32.pas, а также другие библиотеки, работающие на движке Matrix32. Они доступны на страницах закачки и имеют в качестве префикса слово "matrix". Читайте комментарии, они раскрывают смысл каждой функции. Думаю, вы справитесь. Если нет, то изучайте Delphi. Удачи!

Введение

MatriX - пожалуй самое мощное средство, разработанное для Delphi для работы с 2-мерными массивами - матрицами. Несмотря на технологическую простоту и прозрачность данной разработки, MatriX обладает очень быстрым вычислительным ядром и имеет полное право называться системой матричных вычислений.

Matrix - это программный модуль, разрабатываемый с целью облегчения труда программистов, работающих в Delphi. Программист получает в свое распоряжение удобное средство для оперирования 2-мерными массивами вещественных чисел, позволяющее выполнять над ними различные операции. Благодаря Matrix программист может:

  • Создавать неограниченное число рабочих областей. Рабочая область в Matrix - это хранилище массивов, в котором все массивы должны иметь разные имена. Рабочая область - основной объект в Matrix.
  • Создавать неограниченное число массивов в любой рабочей области. Каждый массив в Matrix может содержать элементы типа Real (aka Double) и считается двухмерным, хотя может состоять всего лишь из одного элемента.
  • Программировать вычислительные алгоритмы любой сложности, затрачивая при этом минимальные усилия.

Что касается требований к ресурсам компьютера, то системе безразлично то, какая ОС установлена, сколько в наличие оперативной памяти и какой частоты процессор. Единственное, что необходимо учитывать программисту - каждый элемент массива занимает в памяти 8 байт. Много это или мало - зависит от конкретной задачи. В системе Matlab элементы массивов занимают столько же памяти, однако сама среда Matlab намного требовательнее к ресурсам компьютера.

Главной идеей в данной разработке является то, что основным объектом является рабочая область, а не массив (массив вообще объектом не считается - это просто некоторая область памяти, выделенная под хранение данных). Массивы создаются в рамках рабочей области, причем их число может быть неограниченным. Рабочая область содержит все необходимые методы для работы с массивами. Количество рабочих областей также не ограничивается (это объект класса TWorkspace, и таких объектов можно создать сколько угодно).

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


function C = summa(A, B)

Sum = A + B;
C = minmax(Sum);

Данная функция должна храниться в файле с именем summa.m.
Здесь minmax() - еще одна функция, которая вызывается из нашей функции. Она хранится в файле minmax.m. В свою очередь, функция minmax() может вызывать другие функции, и количество таких вложенных вызовов неограниченно.

Эта идея реализована и в нашей разработке, только вместо m-функций используются обычные подпрограммы, использующие (или создающие свою) рабочую область. Вот пример такой подпрограммы (аналог примера с m-функцией):


procedure Summa(Ws: TWorkspace; ArA, ArB, ArC: string);
begin
  with TWorkspace.Create('Функция Summa()', Ws) do
  begin
    LoadArray(ArA, 'A'); // Загружаем массив А
    LoadArray(ArB, 'B'); // Загружаем массив B
    CalcFunc2('A', 'B', 'Sum', fncSum); // C = A + B
    GetMinMax('Sum', 'C', dimRows);
    ReturnArray('C', ArC); // Возвращаем результат
  end;
end;

При одинаковых входных массивах эта подпрограмма даст тот же результат, что и m-функция. Единственный недостаток нашей подпрограммы в том, что приходится явно загружать массив в рабочую область (LoadArray()) и явно возвращать результат работы подпрограммы (ReturnArray()). Просто в Матлабе это делает компилятор, а в Delphi компилятор этого делать еще не умеет :).

В нашей подпрограмме рабочая область создается с помощью кода

  with TWorkspace.Create('Функция Summa()', Ws) do...

Эта рабочая область является дочерней от рабочей области Ws. Об этом свидетельствует наличие необязательного параметра ParentWorkspace. Если при создании рабочей области этого параметра не указывать, то в этом случае рабочая область будет главной (т.е. она не имеет родителя).

Таким образом, рабочие области создаются каскадно:

                      Главная рабочая область
                        /        |       \
                       /         |        \
                      /          |         \
                   РО-1        РО-2  ...  РО-N
                  / | \         / \        / \
                 /  |  \       /   \      /   \
                /   |   \    ...   ...  ...   ...
               /    |    \
              /     |     \
             /      |      \
           РО-1-1  ...    РО-1-M
            / \             / \
           /   \           /   \
         ...   ...       ...   ...

Рабочие области, созданные каскадно, удаляются тоже каскадно. Если удалить рабочую область РО-1, то будут удалены все рабочие области РО-1-1 ... РО-1-М, а также дочерние для них рабочие области. Если в какой-либо рабочей области (например, РО-1-М) возникло исключение, то будут удалены все рабочие области, вплоть до главной. Главная рабочая область удалена не будет (на то она и главная :).

Потенциально система Matrix может имеет очень широкий диапазон применений. Вот некоторые варианты применений:

  • Вы можете использовать Matrix как удобное средство хранения числовых значений, т.е. как простую таблицу базы данных, в которой можно хранить только числовые значения. Эта возможность доступна благодаря тому, что вы с легкостью можете изменить размеры массива, добавить или вставить в массив новые данные, сохранить или загрузить массив или всю рабочую область из файла. Скорость выполнения всех матричных операций в Matrix очень велика, что позволяет оперировать с большими объемами данных.
  • Matrix упрощает программирование любых задач, связанных с матричными вычислениями.
  • Если программируемая задача очень сложная и ограничивается 2-мерными массивами, то использование Matrix в десятки раз упрощает реализацию такой задачи.
  • Благодаря Matrix появляется возможность программировать математические библиотеки для Delphi, о которых раньше нельзя было и мечтать. Например, сейчас вполне возможно запрограммировать универсальную библиотеку вейвлет-преобразований или нейронных сетей. Эта "универсальность" возможна благодаря единому представлению информации в Matrix.
  • В настоящее время ученые любой области науки стремятся решение любой задачи представить в виде последовательности матричных операций. Применение матриц позволяет ускорить решение практически любой задачи. Классическим примером применения матричных вычислений является электротехника.
Логинов Дмитрий © 2005-2015