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

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

Rambler's Top100

Рейтинг@Mail.ru

Примеры

Попытка осветить все аспекты использования Matrix32 в данном разделе обречена на провал. Это все равно, что пытаться научить принципам работы с Матлабом на паре примеров. Вы работали когда-либо с Матлабом? Какие впечатления производит данный продукт? Кому как, но на меня Матлаб производит глубоко положительные впечатления. Почему? Это легкость программирования. Это доступность всех необходимых функций обработки данных. Это возможность несколькими строками программного кода написать достаточно сложный вычислительный алгоритм. Еще полезная возможность Матлаба - конвертирование кода пользовательских m-функций в код языка C++, который в дальнейшем может быть скомпилирован, скажем, с помощью MS Visual C++. С подобным кодом может разобраться и внести необходимые изменения только профессионал. Менее продвинутый человек в таком коде врядли разберется.

Одной из задач при разработке Matrix32 я ставил максимальную наглядность и понятность кода. Также стремился к аналогии с Матлабом, т.е. к тому, чтобы реализация одной и той же функциональности как в Матлабе, так и в Matrix32 приводила приблизительно к одинаковому программному коду. В примерах продемонстрирована реализация одних и тех же задач как в Матлабе, так и в Matrix32.

Создание нулевого массива

В Матлабе нулевой массив можно создать следующими способами:
1. A = zeros(N, M, K, ...);
2. B(N, M, K, ...) = 0;

Таже задача в Matrix32 решается следующим образом:

var
  A, B: TMatrix;
begin
  A := TDoubleMatrix.Create();
  A.Resize([N, M, K, ...]);
  A.Zeros;

  B := TDoubleMatrix.Create();
  B.PreservResize([N, M, K, ...]);
  ............................
end;

Конкатенация массивов

Канкатенация массивов состоит в склеивании массивов по заданному измерению. В Матлабе для конкатенации матриц есть даже своя собственная операция "квадратные скобки".
1. A = [B; C] - добавляет к строкам матрицы B строки матрицы C (увеличивается число строк). Сводится к вызову функции cat:
A = cat(1, B, C);
2. A = [B C] - добавляет к столбцам матрицы B столбцы матрицы C (увеличивается число столбцов). Сводится к вызову функции cat:
A = cat(2, B, C);
Для массива, чья размерность больше двух, квадратные скобки работают с предпоследней (строками) или последней (столбцами) размерностью.

В Matrix32 аналогом функции cat является функция TMatrix.Concat:

1. A.Concat(0, [B, C]);
2. A.Concat(1, [B, C]);

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

Пример использования данной операции в Матлабе:
A = B(:, 2:M, 10:N-5) - копируются данные из трехмерного массива B. ":" означает, что первое измерение используется полностью. "2:M" - второе измерение (строки) используется частично, начиная с 2. "10:N" - третье измерение (столбцы) используется частично, начиная с 10 и заканчивая N-5.

В Matrix32 аналогичную задачу осуществляет функция CopyArrayPart(). Пример использования данной функции:

A.CopyArrayPart(B, [0, 1, 9], [-1, M-1, N-6], True);

Работа с записями (структурами)

Структуры - это еще один тип данных Матлаба. Фактически структура - это список именованных массивов. Каждый массив - это поле структуры. Пример из Матлаба:

A.Field1 = B;
A.Field2 = C;

Здесь A - это структура, Field1 и Field2 - это поля структуры, содержащие такие же данные, как и массивы B и C. Впрочем B и C не обязаны быть массивами. Это могут быть и другие структуры или иные объекты. Т.е. допускается вложенность структур:

A.Fields.Field1 = B;
A.Fields.Fields.Field1 = C;

В Matrix32 возможности структуры реализованы в классе TRecordMatrix. Структура в Matrix32 - это довольно простой тип данных. Фактически это всего-навсего список именованных указателей на объекты TMatrix. Пример:

with TRecordMatrix.Create(nil, A) do
try
  Fields['Field1'] = B;
  Fields['Field2'] = C;
  // Обработка данных
finally
  FreeMatrix;
end;

Работа с массивами ячеек

Массив ячеек - очередной тип данный Матлаба. Это обычный многомерный массив, но его элементы не являются числовыми. Они являются массивами. Для работы с массивами ячеек имеется дополнительный оператор - "фигурные скобки". Пример:

A = {B C};

В Matrix32 для работы с ячейками предназначен класс TCellMatrix. Физически это обычный многомерный массив с элементами типа Pointer. Пример:

with TCellMatrix.Create() do
try
  Resize([1, 2]);

  Cells[0, 0] = B;
  Cells[0, 1] = C;

  // Обработка данных
finally
  FreeMatrix;
end;

Установка собственной функции FloatToString

function MyFloatToStr(Value: Extended): string;
begin
  Result := Format('%10.4f', [Value]);
  Result := StringReplace(Result, ',', '.', [rfReplaceAll]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetFloatToStringFunction(MyFloatToStr);
end;

Выполнение LU-разложения с использованием модуля matrixLapack

uses
  matrixLapack;

procedure TForm1.Button5Click(Sender: TObject);
var
  A, L, U: TMatrix;
begin
  A := TDoubleMatrix.Create();
  try
    L := TDoubleMatrix.Create(A);
    U := TDoubleMatrix.Create(A);  
    A.AsString := '1 2 3 4 5 6;7 8 9 1 2 3';
    LapackLUFactorization(A, L, U);
    ShowMessage('Элементы нижней треугольной матрицы L:'+
	  #13#10 + L.AsString);
    ShowMessage('Элементы верхней треугольной матрицы U:'+
	  #13#10 + U.AsString);
  finally
    A.FreeMatrix;
  end;
end;

Решение СЛАУ с использованием модуля matrixLapack

uses
  matrixLapack;

procedure TForm1.Button2Click(Sender: TObject);
var
  A, B, X: TMatrix;
  E: Extended;
begin
  A := TDoubleMatrix.Create();
  try
    B := TDoubleMatrix.Create(A);
    X := TDoubleMatrix.Create(A);  
	
    A.AsString := '1 -1 -2 -3 -4;1 1 -1 -2 -3;'+
	  '2 1 1 -1 -2;3 2 1 1 -1;4 3 2 1 1';
    B.AsString := '-9;-4;1;6;11';
    E := LapackSolveSLE(A, B, X,false);
    ShowMessage('Детерминант:'#13#10 + FloatToString(E) + 
	  #13#10'Результат решения СЛАУ:'+
	  #13#10 + X.AsString);
  finally
    A.FreeMatrix;
  end;  
end;

Умножение матриц с использованием модуля matrixBLAS

uses
  matrixBLAS;

procedure TForm1.Button3Click(Sender: TObject);
var
  A, B, C: TMatrix;
begin
  A := TDoubleMatrix.Create();
  try
    B := TDoubleMatrix.Create(A);
    C := TDoubleMatrix.Create(A);  
    A.Resize([30, 10]);
    B.Resize([10, 10]);
    A.Rand(1);
    B.Rand(1);
    BlasMulMatrices(A, B, C);
    ShowMessage('Результат матричного умножения:'+
	  #13#10 + C.AsString);
  finally
    A.FreeMatrix;
  end;
end;

Вычисление СЛАУ по методу обратной матрицы [x=inv(a)*b]

uses
  matrixLapack, matrixBLAS;

procedure TForm1.Button2Click(Sender: TObject);
var
  A, B, X: TMatrix;
  E: Extended;
begin
  A := TDoubleMatrix.Create();
  try
    B := TDoubleMatrix.Create(A);
    X := TDoubleMatrix.Create(A);  
    A.AsString := '1 -1 -2 -3 -4;1 1 -1 -2 -3;'+
	  '2 1 1 -1 -2;3 2 1 1 -1;4 3 2 1 1';
    B.AsString := '-9;-4;1;6;11';
    // Вычисляем обратную матрицу
    E := LapackInverseMatrix(A, A);
    // Выполняем матричное умножение
    BlasMulMatrices(A, B, X);
    //E := LapackSolveSLE(A, B, X,false);
    ShowMessage('Детерминант:'#13#10 + FloatToString(E) + 
	  #13#10'Результат решения СЛАУ:'+
	  #13#10 + X.AsString);
  finally
    A.FreeMatrix;
  end;  
end;

Использование быстрого дискретного преобразования Фурье при обработке сигналов, хранящихся в bin-файле

uses
  matrixMatlab, matrixFourier;

procedure TForm1.Button8Click(Sender: TObject);
var
  Signal: TMatrix;
begin
  Signal := TDoubleMatrix.Create(nil, 'Sig');
  try
    Signal.LoadFromBinaryFile('C:\Delphi\Projects\Signals\Sig.bin');
    FFT(Signal, Signal);

    // Передача результата в матлаб и визуализация
    Matlab.PutMatrix(Signal);
    Matlab.Execute('plot(Sig'')');
  finally
    Signal.FreeMatrix;
  end;
end;

Локализация сообщений Matrix32 на заданный язык

unit 
  MatrixTranslate, Matrix32;

procedure TForm1.Button8Click(Sender: TObject);
begin
  TranslateMatrixMessages(
    'C:\Matrix32\Translations\English.lng', 
    'MatrixMessages');
end;
Логинов Дмитрий © 2005-2015