Проекты Логинова Дмитрия | ||||||||||
|
ПримерыПопытка осветить все аспекты использования Matrix32 в данном разделе обречена на провал. Это все равно, что пытаться научить принципам работы с Матлабом на паре примеров. Вы работали когда-либо с Матлабом? Какие впечатления производит данный продукт? Кому как, но на меня Матлаб производит глубоко положительные впечатления. Почему? Это легкость программирования. Это доступность всех необходимых функций обработки данных. Это возможность несколькими строками программного кода написать достаточно сложный вычислительный алгоритм. Еще полезная возможность Матлаба - конвертирование кода пользовательских m-функций в код языка C++, который в дальнейшем может быть скомпилирован, скажем, с помощью MS Visual C++. С подобным кодом может разобраться и внести необходимые изменения только профессионал. Менее продвинутый человек в таком коде врядли разберется. Одной из задач при разработке Matrix32 я ставил максимальную наглядность и понятность кода. Также стремился к аналогии с Матлабом, т.е. к тому, чтобы реализация одной и той же функциональности как в Матлабе, так и в Matrix32 приводила приблизительно к одинаковому программному коду. В примерах продемонстрирована реализация одних и тех же задач как в Матлабе, так и в Matrix32. Создание нулевого массиваВ Матлабе нулевой массив можно создать следующими способами: Таже задача в 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;
Конкатенация массивовКанкатенация массивов состоит в склеивании массивов по заданному измерению. В Матлабе для конкатенации матриц есть даже своя собственная операция "квадратные скобки". В Matrix32 аналогом функции cat является функция TMatrix.Concat: 1. A.Concat(0, [B, C]); 2. A.Concat(1, [B, C]); Копирование части массиваПример использования данной операции в Матлабе: В 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; Установка собственной функции FloatToStringfunction 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-разложения с использованием модуля matrixLapackuses 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; Решение СЛАУ с использованием модуля matrixLapackuses 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; Умножение матриц с использованием модуля matrixBLASuses 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 |